このブログについて

ソフトウェア開発におけるエラーの予防やプロジェクト管理、品質管理を支援するParasoft製品のTIPSなどを、国内総販売代理店テクマトリックスのサポートスタッフが紹介しています。

2014年8月6日水曜日

CppUnitを手放す日

今回はCppUnitの問題をC++testでどのように解消できるかをご紹介します。

この記事は、過去にCppUnitを使用されていた方や、現在使用中のCppUnitに不満を持っており、代替のツールをご検討されている方を対象としています。

CppUnitは、ご存じの通りオープンソースのソフトウェアテストフレームワークです。
フリーで利用できるため、だれでも気軽に使うことができます。ですがその一方で不満点としてよく聞くものに次のようなものがあります。

  • テストするためにmain関数を変更したり、テスト用のプロジェクトを作成したりして、コンパイルする必要がある
  • スタブ関数を使いたいが、機能としてないため、作成して呼び出すための処理を追加する必要がある
  • 実行したテストのカバレッジを測定する機能がない
  • 実行結果が成功失敗しか分からないため、詳細なレポートを作成するのに時間がかかる

不満点を要約すると、とても面倒くさいということになります。
テストフレームワークを使わずに、自分で一からテストコード(テストドライバ・スタブ)を作成するのは気が遠くなるぐらい面倒な作業です。それを軽減するためにCppUnitを使ってテストを作成するのですが、それでもやっぱり面倒なのです。

余計な作業が多く必要ということは、それだけ開発作業の生産性・効率が下がっていることになります。場合によってはテスト作成が面倒なために、十分なテストができないということにもなりかねません。そうなると、生産性どころかソフトウェアの品質まで下がってしまいます。

テスト作成を困難にする理由のひとつは、CppUnitがテストのためのシンプルなライブラリであるということです。CppUnitはテストに必要なAPIだけを提供します。つまり、それ以外の多くの部分をテストを実施する人が実装しなければなりません。テストを行うために、テスト対象のコードとテストコードをコンパイルし、テスト用の実行モジュールを作成して実行します。
実際にやってみるとこれは結構大変で、依存関係が複雑なコードになると、テストのためのコンパイルがなかなか成功しない、という状況も発生します。
他にも、テスト対象外の関数のスタブ関数化や、テストの網羅度を確認するためにコードカバレッジを取ろうとすると、CppUnitだけでは対応することができません。そのため、別のツールを合わせて使うなどの、特別な対応が必要となります。



CppUnitを使う場合、テストの作業フローは図1のようになります。

図1.CppUnitの作業フロー

テストまでの作業量がとても多いですね。一方、不満が多くてもなかなか「では、作業量の少ない新しいツールを」とはならないのが実情です。変えられない理由の多くは、既に過去にCppUnitでテストした資産があるからです。一般的に、「新しいモノを手にするためには、既に持っているモノを手放さなければならない」とよく言われます。ただ、そうは言っても可能であれば、過去のテストを再利用する方が効率的ですし、余計なコストもかかりません。そのため、持っているモノを手放すということを軽々しく選択することはおすすめできません。既に持っているモノを持ったまま、新しいモノを手にしましょう
そんなことが可能なのでしょうか?C++testを使用することで可能なのです。
C++testを使うと、CppUnitのテストコードを何の変更もなく実行することができます。さらに、作業量の大幅な削減が可能です。C++testを使用した場合、テストの作業フローは図2のようになります。



図2.C++testの作業フロー

このようにテスト作成にかかる作業を大幅に減らすことができます。減った部分はC++testが自動で行ってくれます。そのため、開発者はテストパターンの検討やスタブ関数の作成という知的作業のみに集中できるようになります。加えて、CppUnitの課題であるコードカバレッジやレポートに関しても、C++testがしっかりサポートしますので、生産性は大幅に向上します。

C++testを使用した場合の作業フローを簡単に説明します。

  1. ツールがテストケースの雛型を生成
  2. 必要に応じて開発者がテストケースの処理を追加
  3. 必要に応じて開発者がスタブ関数の処理を追加
  4. ツールが自動でmain関数を作成し、実行モジュールを作成してテストを実行
  5. ツールが自動でテストカバレッジの計測
  6. ボタン一つでテスト結果のレポートを生成


ソフトウェアのユニットテストだけでなく、C++testではコーディングルールのチェックやフロー解析といった静的解析を行うことができます。静的解析はソースコードさえあればすぐに実行できるので、作業効率をさげることなく品質の向上が見込めます。

このように、C++testを使うことでCppUnitを使った場合よりも生産性の向上、ソフトウェア品質の向上が可能です。
現在CppUnitを使っていて、新しいツールを検討している方や、検討したいが二の足を踏んでいる方はぜひごともC++testをお試しください。
また、現在C++testを使用されており、過去にCppUnitを使っていた方はこれを機に過去の資産の再利用を検討されるのもよいのではないかと思います。

C++test体験版をご希望の方は Parasoft C++test 製品ページ へ。