【QtTest】 テストプロジェクトでテストデータにコンテナクラス(QList、QMap、...)を使う
Qtはテストプロジェクト向けパッケージ
- QTest::addColumn
() メソッド - QFETCH マクロ
標準組み込み型およびQtライブラリ提供クラスの多くは、 addColumn メソッドで登録したテストデータを、QFETCH マクロで受け取ることができる。
// テストデータ登録メソッド void TestMyClass::function_data() { QTest::addColumn< int >( "number" ); QTest::addColumn< QString >( "text" ); // newRow... } // テスト実行メソッド void TestMyClass::function() { QFETCH(int, number); QFETCH(QString, text); // QCOMPARE... }
同様の記述でコンテナクラスをテストデータとする場合、 コンパイルエラーを起こすため、テストデータとして利用できない。
// コンパイルエラーを起こす記述 // テストデータ登録メソッド void TestMyClass::function_data() { QTest::addColumn< QMap< QString, QString > >( "map_data" ); // ... } // テスト実行メソッド void TestMyClass::function() { QFETCH(QMap< QString, QString >, map_data); // ... }
そのため、コンテナクラスをテストデータとする場合、 次の2つを利用する。
- typedef文
- Q_DECLARE_METATYPE マクロ
// 非コンテナのシノニムを定義 typedef QMap< QString, QString > QStringMap; // QMetaType に登録 Q_DECLEARE_METATYPE( QStringMap ); // テストデータ登録メソッド void TestMyClass::function_data() { QTest::addColumn< QStringMap >( "map_data" ); // ... } // テスト実行メソッド void TestMyClass::function() { QFETCH(QStringMap, map_data); // ... }