ミューテーション解析のためのプログラム作成
いよいよミューテーション解析に取り掛かります(図13)。AjaxMutatorを用いたミューテーション解析は、図13のQuizzyConfigクラスのmainメソッドに記述しました。一連のプログラムの解説を以下に記載します。
- ミューテーション操作を適用したいJavaScriptコードのファイルを獲得します。ConfigHelperクラスを利用することで、設定ファイルから獲得できます。
- 適用したいミューテーション操作を登録します。AjaxMutatorには、表2のミューテーション操作が実装されていますが、すべてを用いてミュータントを生成すると、多くのミュータントが生成されテスト実行に大きな時間を要する恐れがあります。従って、AjaxMutatorは、例えばjQuery向けに整理したミューテーションの操作のセットを提供しています。
- 登録したミューテーション操作を対象ソースコードに適用してミュータントを生成します。ミュータントはソースコードの差分を表すパッチファイルとして生成されます(図14)。AjaxMutatorは生成されたパッチファイルを対象ソースコードに適用することでWebアプリケーションに欠陥を埋め込みます。
- ミュータント上でテストケースを実行し、その結果が失敗するか判定します。AjaxMutatorは、ミューテーション解析の結果をCSV形式のファイルで出力します(図15)。
開発者は、AjaxMutatorから得られるミューテーション解析の結果から、テストケースの欠陥検出能力が十分であるか判断します。どの程度のミューテーションスコアであれば十分かは一概には言えませんが、100%を目指してテストケースを最大限改善することが望ましいでしょう。
ミューテーション解析結果からテストケースを改良
ここまでのミューテーション解析の結果(図15)を検討します。1列目がmutant2.diffと記述されている1行を「ミュータント2」とします。その、2列目の結果が「non-equivalent live」となっており、図11で作成した簡単なテストケースでは、ミュータント2を検出できなかったことを示しています。
ミュータント2を生成するためのパッチファイル(図16)を見てみましょう。このファイルは、「クイズの開始ボタンをクリックすればクイズが開始される」というプログラムを、「クイズの開始ボタンをクリックしても、クイズが開始されない」という動作に置き換えることを意味します。つまり、ミュータントに埋め込まれる欠陥により、開始ボタンでクイズが始まらないという不具合を引き起こしていることが分かります。
このミュータント2に含まれた欠陥を検出可能なテストケースに変更することで、これまで検出できなかった不具合が検出できるようすれば、より検出力の高いテストコードが記述できることになります。そこで、「開始ボタンをクリックするとクイズが開始される」ことを確認するテストケースをstartQuizメソッドとして追加し、再度ミューテーション解析を実施してみます(図17)。
テストケースを追加し、ミューテション解析の結果を確認すると、ミュータント2を検出できるようになったことが確認できます(図18)。Quizzyを保守する過程で開発者がミュータント2と同様の欠陥を作り込んでも、改善されたテストケースはその欠陥を検出できるようになりました。
おわりに
ミューテーション解析は、テストケースの欠陥検出能力を効果的に測定する手法です。しかし、ミューテーション解析の有用性はそれだけではありません。開発者は、検出できなかったミュータントを分析することで、これから埋め込んでしまうかもしれないが、今のテストケースでは検出できない欠陥を知ることができます。開発者はそれら欠陥を検出できるようにテストケースを改良することで、ソフトウェアテストにおいてより多くの欠陥を発見できるようになると期待されます。ソフトウェアの高品質化に向けて、ミューテーション解析のさらなる現場適用が望まれます。
トップエスイーについて
「トップエスイー」は、国立情報学研究所で提供している社会人エンジニア向けのソフトウェア工学に関する教育プログラムです。トップエスイーでは講義や制作課題を通して、最先端の研究成果や現場で得られた知見が蓄積されてきました。その「アウトカム」、つまり成果やそこに至る過程を紹介し、現場のエンジニアの方々に活用していただけるような記事を掲載しています。トップエスイーでは、テストに関する講義を複数開講しており、それらを受講することテストの基礎やさまざまな技術を習得できます。加えて、実際に学習したことを開発現場で早期に適用できるようなカリキュラムを構築しているのが特徴で、実践的な知識が身につく講義にもなっています。