0

この質問に密接に関連して、コマンドライン引数に基づいて CppUnit アセンブリで実行するテストを選択できるようにしたいと考えています。--exclude=integration,smoke,x64onlyまたは と考えてください--include=unitNUnit カテゴリは次のように機能します。CppUnit でそのようなものを実装するにはどうすればよいですか?

method を使用して抽象基本クラスを追加するIHasCategories方法を試してみたところget_Categories()、テスト フィクスチャがメソッドをオーバーライドして、カテゴリのコンマ区切りリストを返しました。ただし、 のような呼び出しで CppUnit からテストを取得するとCppUnit::Test *topLevelTest = CppUnit::TestFactoryRegistry::getRegistry().makeTest();、 のインスタンスが取得されますCppUnit::Testここで本当に必要であり、到達できないのは、CppUnit::TestFixtureチェックするカテゴリのリストを取得するための のインスタンスです。

4

1 に答える 1

0

答えを知っていれば簡単であることが判明したので、ここでは将来の読者のために説明します.

質問で述べたようにIHasCategories、メソッドを使用して抽象基本クラスを作成しましたget_Categories()。テスト フィクスチャはメソッドをオーバーライドして、カテゴリのコンマ区切りリストを返します。

パズルの欠けている部分は、CppUnit::TestFixtureCppUnit からインスタンスを取得する方法でした。結局のところ、CppUnit はオブジェクトの階層を提供し、これらのオブジェクトを必要なクラスにCppUnit::Test単純化できます。dynamic_cast

次のコードは、私のニーズに少し固有のものですが、役立つ場合があります。このメソッドは、TestFixtures を階層的に表す、階層内のオブジェクトのリストを提供します。のようなコマンドで実行するのは、このリスト内のオブジェクトですtest->run(&controller);。カテゴリの実際の TestFixture オブジェクトを調べたい場合、動的にキャストしたいのはこれらのオブジェクトの子になりますIHasCategories

/**
 * Get TestSuite objects from the CppUnit hierarchy, that have, as their children,
 * TestFixture objects.
 */
void GetTestSuitesWithFixtures(const CppUnit::Test * test, std::vector<CppUnit::Test*> & suites)
{
    for (int childIndex = 0; childIndex < test->getChildTestCount(); ++childIndex)
    {
        CppUnit::Test * child = test->getChildTestAt(childIndex);

        CppUnit::TestSuite * testSuite = dynamic_cast<CppUnit::TestSuite*>(child);

        if (testSuite 
            && testSuite->getChildTestCount() > 0
            && dynamic_cast<CppUnit::TestFixture*>(testSuite->getChildTestAt(0)))
        {
            suites.push_back(testSuite);
        }
        else GetTestSuitesWithFixtures(child, suites);
    }
}
于 2013-01-30T00:49:12.233 に答える