2017-09-22 37 views
1

QTestは、単体テストを別々の実行可能ファイルとして編成することをお勧めします。これには特別なマクロがあり、メイン関数を生成します:QTEST_MAINqExecを使用してQtテストスイートを作成する

私はこのアプローチがあまりクリーンではないことを発見しました。すべてのテストを一度に実行するほうがずっと便利です。

Qt: run unit tests from multiple test classes and summarize the output from all of them

http://www.davideling.it/2014/01/qtest-multiple-unit-test-classes/

https://alexhuszagh.github.io/2016/using-qttest-effectively/

ソリューションは、マクロQTEST_MAINを使用してあきらめました:だから私はそうすることのいずれかの可能性がある場合は検索し、私は少数の人々が同じ解決策を提案しました実行するテストを実行する場所に独自のmain関数を記述します。

int main(int argc, char *argv[]) 
{ 
    int status = 0; 

    { 
     TestA ta; 
     status |= QTest::qExec(&ta, argc, argv); 
    } 

    { 
     TestB tb; 
     status |= QTest::qExec(&tb, argc, argv); 
    } 

    return status; 
} 

私はそれが素晴らしい考えであることを発見しましたが、問題があります。 qExecためQt's documentationは、このように聞こえる部分があります:スタンドアロンのテストアプリケーションの場合

を、この機能は ファイルにテスト出力をログに記録し、個人を実行するためのコマンドラインオプションとして、何度も 多くを呼び出すことはできませんテスト機能は 正しく動作しません。

これらの人々が明らかにした解決策は、次のように示唆しています。qExecを複数回実行する。誰も正確に何を私に説明することができますcommand-line options for logging test output to files and executing individual test functions will not behave correctly正確に意味ですか?

このアプローチで間違っているのはどういうことでしょうか?

+1

FWIW、この明白な欠陥は私にも困惑しています。別のテストランナーフレームワーク(例:GoogleTest)を使用します。スロットと信号用のQt固有の機械と組み合わせることができます(https://stackoverflow.com/a/12687255/14637)。また、https://stackoverflow.com/a/3804999/14637のコメントがあなたの質問に答えるかもしれません。 – Thomas

答えて

1

ドキュメントはおそらくLogging Optionsについて話しています。 qMainを2回呼び出して両方のコールに-oオプションを渡すと、2回目のコールは最初のコールのログファイルを上書きしている可能性があります。これが決して起こらないことが分かっている場合は、警告を無視することもできます。また、コマンドライン引数をqExecに渡すこともできません。つまり、出力を標準出力に強制しますが、他の引数を渡すことはできません。

Qt Creatorからテストケースを実行する場合は、qExecを複数回コールしないでください。各テストクラスはテストリストに表示されますが、実行するとすべてが実行されるので、1つのクラスに対して表示される各クラスの結果が得られます。すべてのテスト(デフォルト)を実行すると、結果の2乗が得られます。

複数の実行可能なアプローチが嫌いな場合は、Googleテストを使用してください。それには上記の問題はなく、クリエイターはそれをサポートします。セットアップは非常に簡単です:Autotestプロジェクトを作成するときにウィザードがあなたを案内します。あなたがしなければならないのは、Google Testをダウンロードすることだけです。 Googleテストケースは、テストビューのQtテストケースのすぐ横に表示されます。

関連する問題