7

ユニットテストフレームワークとしてCppUnitを使用しています。実行時に実行するテストケースのサブセットを選択することは可能ですか?

これに対応するためにCppUnit内に提供されるフィルタリングオプションはありますか?

4

3 に答える 3

5

main()で呼び出す可能性のあるTestRunner :: run()メソッドには、実際にはオプションのパラメーターがあります:run(std :: string testName = ""、bool doWait = false、bool doPrintResult = true、bool doPrintProgress = true)。testNameは、テストの特定の名前である必要があります。必要に応じて、名前で特定のテストをリクエストできます。特定のテストでrunTest(Test *)を呼び出すことも、runTestByName(testName)を呼び出すこともできます。

しかし、もっと洗練されたものになりたいようです。すべてのテストをCPPUNIT_TEST_SUITE_REGISTRATION()マクロで登録したとすると、静的TestFactoryRegistry :: makeTest()メソッドは、登録されたすべてのテストのTestSuiteを返します。

TestSuiteオブジェクトは、getTests()メソッドを介してベクトルを生成します。それらを繰り返し処理して、名前を正規表現と照合し(またはインデックス番号で、または必要に応じて)、ほとんどの人が行うようにスイート全体でTestRunner :: addTest(registry.makeTest())を呼び出す代わりに、要求している特定のテスト。

テストを繰り返してマッチングを行うために何かを書く必要がありますが、それ以外は非常に単純なはずです。おそらく12行のコードに加えて、コマンドライン引数を解析します。正規表現を使用して、自分で簡単に使用できるようにします。

于 2010-05-07T04:41:57.390 に答える
1

cppunit用のGUIテストランナーを使用している場合は、実行するテストを確認するだけです。

GUIテストランナーを使用できない場合は、この投稿を確認してください。xmlドキュメントに基づいて実行するテストを定義する「構成可能な」方法について説明しています(最後の投稿では、最終的に私が持っていたソリューションについて説明しています)。

于 2010-05-06T19:06:11.197 に答える
0

別のアプローチ:

// find the unit test as specified by the one argument to this program
CPPUNIT_NS::Test *suite = CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
int iTestIndex = 0;
for (; iTestIndex < suite->getChildTestCount(); ++iTestIndex)
{
    fprintf(stderr, "INFO: Looking for a match between '%s' and '%s'\n",
            suite->getChildTestAt(iTestIndex)->getName().c_str(),
            argv[1]);
    if (suite->getChildTestAt(iTestIndex)->getName() == std::string(argv[1]))
    {
        fprintf(stderr, "INFO: Found a match for '%s' and '%s'\n",
                suite->getChildTestAt(iTestIndex)->getName().c_str(),
                argv[1]);
        break;
    }
}
if (iTestIndex >= suite->getChildTestCount())
{
    fprintf(stderr, "ERROR: Did NOT find test '%s'!\n", argv[1]);
    return -1;
}
于 2018-05-03T13:58:01.977 に答える