編集質問のタイトルを文字通りに捉えすぎたようです。テストを同時に実行することは、私にとって「並行して」という意味です。
とにかく、あなたも喜んで走ることができれば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_main
argv[]
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()
静的な初期化を行い、これらが外部リソース (ログ ファイルなど) を使用する場合、競合が発生する可能性があります。見る