1

私は単体テストにBoost.Testを使用しており、現在、各テスト内から起動される個別のスレッドでさまざまなモックサーバーを実行しています。私のコードをより正確にテストするために、モックサーバーは実際には別々のプロセスにある必要があります。

私はこれらの線に沿って何かをすることを考えていました:

MY_TEST()
if (fork() == 0) {
    runMockServer();  // responds to test requests or times out, then returns
    exit(0);
}
// Connect to MockServ and Run actual test here
END_TEST()

しかし、これがテストフレームワークを台無しにするのではないかと心配しています。

これは安全ですか?誰かがこのようなことをしましたか?

それが重要な場合は、Ubuntu8.04でBoost1.34.1を使用しています。

4

2 に答える 2

4

私は同様の状況でBoostUnitTestライブラリを使用しましたが、良い結果が得られました。ライブラリがフォーク時に正常に機能するかどうかを確認するための自動テストが必要でした。私の場合はシステムテストにも近かったのですが、必要なものが得られれば、利用可能なツールを使用することになります。

ただし、克服すべき1つの障害は、ブーストアサートマクロを使用せずに子プロセスからエラーを通知することです。たとえばBOOST_REQUIRE、使用すると、テストが途中で中止され、後続のテストは親プロセスと子プロセスの両方で実行されます。プロセス終了コードを使用して、待機中の親プロセスにエラーを通知することになりました。ただし、exit()ブーストatexit()には、子プロセスにエラーがない場合でもエラーを通知するフックがあるため、使用しないでください。_exit()代わりに使用してください。

テストに使用したセットアップは次のようなものでした。

BOOST_AUTO_TEST_CASE(Foo)
{
  int pid = fork();
  BOOST_REQUIRE( pid >= 0 );
  if( pid  == 0 ) // child
  {
    // Don't use Boost assert macros here
    // signal errors with exit code

    // Don't use exit() since Boost test hooks 
    // and signal error in that case, use _exit instead.
    int rv = something(); 
    _exit(rv);
  }else{ // parent
    // OK to use boost assert macros in parent
    BOOST_REQUIRE_EQUAL(0,0);
    // Lastly wait for the child to exit
    int childRv;
    wait(&childRv);
    BOOST_CHECK_EQUAL(childRv, 0);
  }

}
于 2012-12-21T11:56:53.623 に答える
3

これは、達成したいことの単体テストのようには聞こえません。なぜ安全ではないのかわかりませんが。まだ準備ができていない場合、ユニットテストがMockServに接続する競合状態が発生する可能性がありますが、それは簡単に解決できます。

私はこのようなことを直接行ったことがありませんが、子プロセスをフォーク/実行するライブラリの単体テストを作成しました。これは問題なく機能します。

于 2010-06-28T11:53:35.893 に答える