1

私は誰かが私の立場にあり、いくつかのアイデアを持っていることを期待してこれを求めています。いわば、車輪の再発明を避けようとしている。

UnitTest ++を使用しています:http://unittest-cpp.sourceforge.net/UnitTest++。html

私は今までにかなりの数のテストを作成しましたが、それらはすべて、テストビルドを実行するたびに実行されます。これはもちろん予想されることです。独自のTestReporterクラスを定義しました。これにより、各テストに関する情報がデフォルトよりも少し多くなります。テストの最後に各テストにかかった時間が出力され、テストの開始メッセージと終了メッセージが色分けされています。そのため、テスト出力をナビゲートする方が簡単です。

しかし、膨大な数のテストが大量の出力をダンプするため、コンソールのバッファーには最初のいくつかのテストの結果が保持されなくなり、その設定を変更するのにうんざりしています。したがって、テストを実行するためのオプションの引数として、実行したいテストをビルドし、他のテストをスキップできるようにしたいと思います。

UnitTest ++のコードはかなり単純で、もう少し見つめればおそらく理解できると思いますが、確かに誰かがすでにこれを理解していますか?argv[]をTest::GetTestList()に接続する方法を考え出そうとしています。cmdline引数を使用してテストリストをフィルタリングし、それらのテストのみを実行したいと思います。

うーん。単なるリンクリストのようです。私はそれを切断することができると思います...O(m * n)検索、m =合計テスト、n=指定されたテスト。上手。私は自分の質問に答え続けます。Mods:ソリューションの実装に関する回答を投稿します。うまくいけば、それは誰かを20分節約するでしょう。

編集:私は本当に述語を使うべきだと思われます:

template <class Predicate>
int RunTestsIf(TestList const& list, char const* suiteName, 
               const Predicate& predicate, int maxTestTimeInMs) const
{
    Test* curTest = list.GetHead();

    while (curTest != 0)
    {
        if (IsTestInSuite(curTest,suiteName) && predicate(curTest))
        {
            RunTest(m_result, curTest, maxTestTimeInMs);
        }

        curTest = curTest->next;
    }

    return Finish();
}   

そうすれば、直接使用できますRunTestsIf()

編集:私はそれを理解したと思います。うわー、テンプレートプログラミングへの最初の進出。

4

1 に答える 1

0

これが私の解決策です:

namespace UnitTest {
    class ListFilter {
        char **list;
        int n;
    public:
        ListFilter(char **list_, int count) {
            list = list_; n = count;
        }
        bool operator()(const Test* const t) const {
            for (int i=0;i<n;++i) {
                std::string dot_cpp_appended = std::string(list[i]) + ".cpp";
                if (!strcasecmp(t->m_details.testName, list[i]) ||
                        !strcasecmp(t->m_details.suiteName, list[i]) ||
                        !strcasecmp(t->m_details.filename, list[i]) ||
                        !strcasecmp(t->m_details.filename, dot_cpp_appended.c_str())) {
                    // erring on the side of matching more tests
                    return true;
                }
            }
            return false;
        }
    };

    int RunTheseTests(char ** list, int n) {
        TestReporterStdout reporter;
        TestRunner runner(reporter);
        return runner.RunTestsIf(Test::GetTestList(), NULL, ListFilter(list,n), 0);
    }
}

int main(int argc, char *argv[]) {
    if (argc == 1) {
        UnitTest::RunAllTests();
    } else {
        UnitTest::RunTheseTests(argv+1, argc-1); // skip the program's name itself.
    }
}

これで少し気になるのは、特定のテストマッチャーが何にも一致しなかったかどうかを確認する明確な方法がないことです。

于 2011-08-27T09:08:12.623 に答える