Qt ベースのアプリケーションで使用されるセマンティックの規約の一部には、単体テストを構築するかしないかを決定するものがあります。特に:
- 多くの Qt クラスはペアレント ポインターをコンストラクター パラメーターとして取る。 このパラメーターのために指定される基本型のサブクラスの中には、与えられた Qt クラスに対してセマンティックの面で有効ではないものもある。
- Qt ペアレント オブジェクトは、メモリ管理を含め、そのチャイルドの所有権を得る。このことは、ペアレントが自分自身を削除するときにチャイルドも削除することを暗に示している。
自動生成テスト ケースでは、次のことが暗示されます。
- 自動生成テストは、スタック上にプライマリ テスト オブジェクトとセカンダリ テスト オブジェクトを作成します。ほとんどの場合、このことは上記の規約 2. と競合し、その結果、テスト ケースの実行中にメモリ エラーが発生し、スタック トレースが高い確率でデストラクターの閉じ括弧をポイントします。
- 自動生成ソース テストにおいて、C++test は基底型の引数のために利用可能なサブクラス型を使用しようとします。ほとんどの場合、このことは上記の規約 1. と競合します。
- QApplication 変数の定義がテストで必用な場合、マクロ定義
-DCPPTEST_INIT_QT=1
をコンパイラ オプションに追加するべきです。また、Qt コンソール アプリケーションを使用するには、-DCPPTEST_INIT_QT_CONSOLE=1
マクロも追加します。
Qt ベースのクラスの単体テストでは、次の操作を推奨します。
- 単体テストを自動生成します。これはテンプレートになります。
- 生成されたテストの 1 つをテンプレートとして保持します。できれば実行時にパスする ( 例外をスローしない) テストを選択します。
- 1 つのテストをテンプレートとして使って、テスト オブジェクトのアロケーションをヒープ上のテスト オブジェクトの宣言で置き換えます。(new を使用します。)
- テストの最後に、ペアレント オブジェクトが使用された場合、それがプライマリ テスト オブジェクトでもセカンダリ テスト オブジェクトでも、そのペアレント オブジェクトだけを削除します。
- デバッガーを使って最後のテスト オブジェクトのステータスを観察し、適切なアサーション マクロを挿入してこのテストを検証します。
- テスト ケースを追加します。 (GUI ダイアログ オプションを使用します。検証された最初のテスト ケースをテンプレートとして使用します。)