Qt Creator で GUI アプリケーションを開発しており、ユニット テストを作成したいと考えています。
このガイドに従って、QtTestlib でいくつかの単体テストを作成すると、プログラムは正常にコンパイルされます。しかし、どうすればそれらを実行できますか? デバッグ ビルドの場合は GUI アプリが起動する前に実行し、リリース ビルドの場合は実行しないようにしたいと思います。
Qt Creator で GUI アプリケーションを開発しており、ユニット テストを作成したいと考えています。
このガイドに従って、QtTestlib でいくつかの単体テストを作成すると、プログラムは正常にコンパイルされます。しかし、どうすればそれらを実行できますか? デバッグ ビルドの場合は GUI アプリが起動する前に実行し、リリース ビルドの場合は実行しないようにしたいと思います。
メインプロジェクトにテストコードを入れないでください。単体テスト用に別のプロジェクトを作成してから、それをビルドして実行する必要があります。テストを実行するためにメインプロジェクトを変更しないでください。
理想的には、単体テストプロジェクトを自動的に呼び出してリリースをビルドするビルドサーバーをセットアップする必要があります。これをスクリプト化できます。
単体テストを実行するためにメインアプリケーションをハッキングしないでください。統合レベルのテスト(つまり、完全にコンパイルおよび統合された後のプログラムの動作のテスト)を行う必要がある場合は、外部でスクリプト化されたソースからプログラムをテストできる別の統合テストフレームワークを使用する必要があります。FrogLogicのSquishはそのようなフレームワークの1つです。
これを実現するには、複数のターゲットとプリプロセッサ フラグを使用します。
int main(int argv, char *args[])
{
#ifdef TEST
::TestsClas::runTests();
#endif
QApplication app(argv, args);
MainWindow mainWindow;
mainWindow.setGeometry(100, 100, 800, 500);
mainWindow.show();
return app.exec();
}
次に、プロジェクト ペインに移動し、「Debug」を複製して新しいターゲット「Test」を追加します。Build Steps の下で、Make に次の引数を追加します。
CXXFLAGS+=-DTEST
そうすれば、テストは Test ターゲットに含まれますが、Debug または Release ターゲットには含まれません。
最後に、アプリを起動する前にテストを実行する方法を見つけました。
テストを実行するために、tests クラスに静的メソッドを 1 つ追加しました。
#include <QtTest/QtTest>
TestClass::runTests()
{
TestClass * test = new TestClass();
QTest::qExec(test);
delete test;
}
メイン関数で、次のようにします。
int main(int argv, char *args[])
{
::TestsClas::runTests();
QApplication app(argv, args);
MainWindow mainWindow;
mainWindow.setGeometry(100, 100, 800, 500);
mainWindow.show();
return app.exec();
}
テスト結果は、アプリケーションの出力ウィンドウに出力されます。
現時点では、Qtクリエーターはユニットテストの実行を明示的にサポートしていません(Qtクリエーター2.0ベータまで)。したがって、当面は手動でテストを開始する必要があります。
qmakeの代わりにcmakeのようなビルドシステムを使用している場合は、ビルドプロセス自体の一部として単体テストを自動的に実行してみることができます。残念ながら、私はqmakeでこれを行う方法を知りません。CMakeはQtクリエーターによってサポートされていますが、qmakeほどではありません。