【QtTest】 テストプロジェクトでテストデータにコンテナクラス(QList、QMap、...)を使う

Qtはテストプロジェクト向けパッケージでテストデータを受け渡す方法として、 次の方法が提供されている。

標準組み込み型および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);

// ...
}

参考資料