3

次のシナリオを検討してください。

BOOST_AUTO_TEST_SUITE(suite1)
{
    BOOST_AUTO_TEST_CASE(case1)
    {
        //my test code here
    }
}

BOOST_AUTO_TEST_SUITE(suite2)
{
    BOOST_AUTO_TEST_CASE(case1)
    {
        //my test code here
    }

    BOOST_AUTO_TEST_CASE(case2)
    {
        //my test code here
    }
}

ここで、suite1/case1 と suite2/case2 を同時に実行したい場合は、次のコマンド ライン引数を試します。

MyProject.exe --run_test="suite1/case1, suite2/case2"

しかし、これは実行されていないようです。

次のように、これらのテスト ケースを個別に実行できることがわかっています。

MyProject.exe --run_test="suite1/case1"

MyProject.exe --run_test="suite2/case2"

しかし、それらを一度に実行したいのです。私は何をすべきか?前もって感謝します :)

4

2 に答える 2

1

編集質問のタイトルを文字通りに捉えすぎたようです。テストを同時に実行することは、私にとって「並行して」という意味です。

とにかく、あなたも喜んで走ることができればsuite2/case1

MyProject.exe --run_test="suite1,suite2"

Coliruでのライブもご覧ください。


古い答え: 2 つのプロセスを並行して実行することの何が問題なのですか? ぜひ、シンプルに!

ただし、どうしてもという場合は、メイン プロセスのコピーを fork できます。

#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>

static int relay_unit_test_main(std::vector<std::string> args);

int main()
{
    if (int const child_pid = fork())
    {
        int exit_code = relay_unit_test_main({"--run_test=suite1"});

        int child_status;
        while (-1 == waitpid(child_pid, &child_status, 0));
        if (!WIFEXITED(child_status)) {
            std::cerr << "Child process (" << child_pid << ") failed" << std::endl;
            return 1;
        }

        return exit_code? exit_code : WEXITSTATUS(child_status);
    } else
    {
        return relay_unit_test_main({"--run_test=suite2"});
    }
}

Coliruでライブを見る

この関数は、実際には、手動での干渉を回避relay_unit_test_mainする便利なラッパーにすぎません。unit_test_mainargv[]

static bool init_function() { return true; }

static int relay_unit_test_main(std::vector<std::string> args)
{
    std::vector<char const*> c_args;
    c_args.push_back("fake_program_name");
    std::transform(args.begin(), args.end(), std::back_inserter(c_args), std::mem_fn(&std::string::data));
    c_args.push_back(nullptr);

    return unit_test_main( &init_function, c_args.size()-1, const_cast<char**>(c_args.data()) );
}

これは実際に子プロセスを生成し、さらに終了コード情報を有効に結合しようとします。別のプロセスを用意することで、異なるスレッドでマルチスレッドを使用するように設計されていないコードを使用することで発生する問題を回避できます。


注意点が 1 つあります。プログラムがのエントリの前にmain()静的な初期化を行い、これらが外部リソース (ログ ファイルなど) を使用する場合、競合が発生する可能性があります。見る

于 2014-04-19T13:11:22.640 に答える