ソフトウェアテストの効果
(テスト記事)
この記事はInfoPress#4(2012/7)からの転載です。
《驚愕のSQLIte》
2010年春,SQLite(OSSのRDBMS)のWebサイトに掲載された「How SQlite Is Tested」という記事(http://www.sqlite.org/testing.html)が話題を集めた。この記事には,2010年3月に公開されたSQLite 3.6.23は,本体ソースコード(コメント・空行等抜き)は約67,200行であるのに対し,テストコードが45,678,300行もあると書かれている。要は,テストコードが本体の約680倍もある計算である。昨年9月に公開された3.7.8は,本体約77,600行であるのに対して,約1,200倍(91,382,400行)のテストコードがあるらしい。詳細は元記事を是非参照していただきたいが,テストコードは,Tclで書かれたTCL Tests(Tclで書かれ,歴史的に一番古い),Cで書かれたTH3(SQLiteのコアライブラリに対する100%分岐カバレッジ),SQL Logic Test(大量のSQL文をSQLite及び,PostgreSQL,MySQL,Oracle等に対して実行し,同じ実行結果が得られるかをテストする)のほか,例外テスト,Fuzzテスト,回帰テスト等の各種のテストコードが存在し,これらのテストコードがソフトウェアの品質を維持するために有効であることはもちろん,ソフトウェアの発展に対しても重要であることが示されていた。ソフトウェアのテストが重要であることはしばしば論じられて,自動テスト,テストファースト,テスト駆動開発(TDD: Test-Driven Development)等が話題にあがることも多いが,ここまで徹底的にテストコードが準備され,ソフトウェアの品質を確保しようとしている事例が公開される例は珍しい。
《テスト駆動開発》
テスト駆動開発自体は難しいものでは無い。工程は(1)仕様に従ってテストを作成する〚Red〛,(2)テストをパスする最低限のコードを素早く書く〚Green〛,(3)リファクタリングを実行す〚Refactor〛というものである。実際のソフトウェア開発では,(3)のリファクタリングが,さらには新機能追加,機能修正,バグ取り等によるコードの修正が何度も実行される。関係無いと思われるコードの修正の影響が及ぶこともある。ソフトウエアのテストを成功に導く要因は,テストをいかに自動で行うかであろう。旧来のように人力及び手動によるテスト(動作確認)も立派に役目を果たすが,確認ミス,手抜きが生じる恐れがあり,またコストが高いので,頻繁に行うことができない。理想のテストは,結果を自動検証でき,繰り返し簡単に実行できるものである。結果として(1)頻繁に継続的に,また細かいコード修正のたびに繰り返してテストを実行できる,(2)常に同じ入力・遷移を実現できる(再現性の確保),(3)確認ミス等の曖昧さを排除できる,(4)時間・手間等の制約を無視できる等の長所があり,自動テストの効果はソフトウェアの品質向上はもちろん,ソフトウェアの開発効率向上でも相当の効果がある。各種の自動テストのツールが公開されているので,この機会に是非試して欲しい。
《クラウド及びOSSのテストの意義》
ソフトウェアのテストの役目は,ソフトウェアの品質確保だけでは無い。OSSあるいはクラウドのソフトウェアの実行環境は,開発環境と同じであることは珍しい。OSあるいはアーキテクチャが違うこともある。OSSの開発では,開発者があらゆる実行環境でテストすることは難しい。特にアーキテクチャが違うマシンで実行する場合,無事コンパイル・ビルドができたからといって期待通りに動作する保証は無い。最後のテストは本当は利用者が行う必要がある。このため,OSSでは,ソースコードのパッケージに,動作テストのスクリプトが同梱されていることが多い。これらもソフトウェアのテストを学ぶ際の参考にするといいだろう。
(情報アーキテクチャ専攻 小山 裕司 教授)