米アジターソフトウェア社のジェリー ラディシン社長兼CEO
米アジターソフトウェア社のジェリー ラディシン社長兼CEO
[画像のクリックで拡大表示]

 Javaプログラム用のユニット・テスト用コードを自動生成する「AgitarOne」を先日発表した米アジターソフトウェア社のジェリー ラディシン社長兼CEOが来日し、本誌記者のインタビューに応じた。ユニット・テストの普及状況や、ほかの言語への対応などについて聞いた。

--ユニット・テストやアジャイル手法は、欧米で普及しているのか。

 Javaを開発言語に使っている組織では、何らかの形でアジャイル的な手法を取り入れていると言ってもよいだろう。だが、アジャイル的な手法を採用していても、ユニット・テストをちゃんとテスト・ファーストの考え方に基づいて実施している企業となると、10%くらいではないだろうか。
 ユニット・テストの実践はなかなか難しい。手でユニット・テスト用のコードを記述しているのでは、カバレッジを高めることが難しいからだ。例えば100行のJavaプログラムに、4倍のテスト・コードが必要になるかもしれない。
 もう一つの理由が、そのプログラムを開発した開発者自身がテスト・コードを記述することが難しい点だ。これまでも、開発者はユニット単位で動作を検証するのが普通だった。しかしそれは、コードが「何をすべきか」ということについての検証しかしないことが多い。つまり、想定外のコードや例外となるケースのテストを記述するのは難しい。

--つまり、そこをカバーするためのツールがAgitarOneということか。

 その通りだ。旧版に搭載していた「アジテーション」という、おかしな振る舞いをするケースを見つける機能を応用して、いろいろな入力データに対する出力結果のフローを見て、どのように振る舞うかを解析する。その結果からテスト・ケースとすべき状態を抜き出して、テスト・コードを自動生成する。
 自動生成の効用は、特に既存コードの品質を上げることができる点にある。正しくユニット・テストされていないコードは、Javaで記述されたコードの95%を占めている。後から他人が書いたコード向けにテスト・コードを記述しようという技術者は少ない。そこの品質を保証する意味でも重要だ。

--開発の初期段階でユニット単位でテストをすることがよいことであるのは分かる。だが、具体的にはどの程度の効用が得られるのか。

 いくつかのプロジェクトで実施した調査をみると、ユニット・テストを実践することによって、統合テスト段階まですり抜けてしまうバグの90%を削減できる。もちろん、負荷テストや機能テストなど、システム全体でないと見られないテストはあるが、それぞれの部品が正しく動いていることを確認するのは重要なことだ。自動車のガレージ・キットを組み立てるにしても、いきなり組み立ててテストすることはあり得ない。個々の部品が正しく動くことを確認しながら組み立てるのと同じだ。

--ほかのプログラミング言語へ対応することは考えているのか。

 いや。全く考えていない。CやC++、Visual Basicはミッション・クリティカルな言語ではない。C#は可能性があるが、製品で対応しなければならないほどの市場ではない。

--PerlやPHP、Rubyなどもあるが。

 スクリプト言語はそんなにテストが重要な位置を占めていないのではないか。いずれにしても、Javaだけで見ても、まだ市場の1%程度しか取れていない。そこからすると、ほかの言語に対応しなくても拡大の余地はいくらでもある。