SQLiteのテストコードは4567万8000行! 本体のコードは6万7000行
軽量なリレーショナルデータベースとして人気の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.
テストコードの重要性は多くの優れたプログラマが共通して口にすることですが、これだけ徹底的にテストコードを作り込んでいる例を見ると、ソフトウェアの品質を確保するというのはかくも大変な作業なのだなと思わされます。