SQLiteのテストコードは4567万8000行! 本体のコードは6万7000行

2010年4月22日

軽量なリレーショナルデータベースとして人気のSQLite。そのWebサイトに掲載されている「How SQLite Is Tested」の内容が、海外のプログラマなどのあいだで話題になっています。

3月に公開された最新バージョンのSQLite 3.6.23。本体のソースコードは約6万7200行(67.2KSLOC、Kilo Source Lines of Code:空行やコメントを除いた行数)なのに対し、テストコードはなんと4567万8300行(45678.3KSLOC)だと紹介されているのです! これはテストコードが本体の約679倍もの大きさだということになります。

100%のブランチカバレッジ

SQLiteコアのライブラリをテストするテストコードとして、以下の3つが紹介されています。

TCL Tests
TCL Testsはもっとも古いテストコードで、TCL scripting languageで記述されています。テストコードは1万4700行(14.7KSLOC)、536ファイルから構成されており、2万5400のテストケースが記述されています。それぞれのテストケースはパラメータ化されており複数回実行されるため、全体では220万回のテストを実行します。

TH3
TH3テストはCで書かれていて、SQLiteコアのライブラリに対して100%のブランチカバレッジ(すべての分岐に対してテストを行う)を実行します。TH3は公開されているインターフェイスのみを用いたテストです。テストコードは60万2900行(602.9KSLOC)で2万9644のテストケースが記述されています。それぞれのテストケースは徹底的にパラメータ化されており、全体で150万回のテストを実行します。

SQL Logic Test
SQL Logic Test(SLTテスト)は大量のSQL文のテストを、SQLiteとPostgreSQL、MySQL、SQL Server、Oracle 10gなどほかのデータベースに対して実行し、同じ結果が得られるかどうかをテストします。このテストは1.12GBのテストデータを用いて、720万回のクエリを実行します。

このほか、「Out-of-Memoryテスト」「I/O Errorテスト」「Crashテスト」「Compound failureテスト」、不正な入力値などによって問題が起きないかをチェックする「Fuzzテスト」として「SQL Fuzz」「Malformed Database Files」「Boundary Valueテスト」などもあり、さらにリグレッションテスト、リソースリーク検知など、さまざまなテストが行われています。

テストコードが製品の進化に役立つ

それにしてもなんと緻密なテストコードなのでしょうか。「Experience with full test coverage」(フルテストカバレッジの経験)という章では、このフルカバレッジなテストコードが製品を進化させる際のバグの排除にとても役立っていると書いてあります。

The developers of SQLite have found that full coverage testing is an extremely productive method for preventing the introduction of new bugs as the system evolves.

テストコードの重要性は多くの優れたプログラマが共通して口にすることですが、これだけ徹底的にテストコードを作り込んでいる例を見ると、ソフトウェアの品質を確保するというのはかくも大変な作業なのだなと思わされます。

関連記事

このエントリーをはてなブックマークに追加
follow us in feedly

タグ : システム開発



≫次の記事
3分で読める、本日発表のアドビ最新事業戦略
≪前の記事
「Google vs Microsoft ~ 将来における戦い」をガートナーが戦略分析

Loading...

Blogger in Chief

photo of jniino Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。新しいオンラインメディアの可能性を追求しています。
詳しいプロフィール


Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed



Publickey 最新記事 10本

Publickey Topics 最新記事 10本


PR - Books


fig

fig

fig

fig



blog comments powered by Disqus