4

Google テスト/モックを使用してブロックと非同期をテストしようとしています。

残念ながら、最初のケースで非同期が発生し、2 番目のケースで非同期が発生していることを確認するための何らかのテストを思い付くのに苦労しています。

std::future が正常に動作していることを確認する方法はありますか?

コード

#include <gtest/gtest.h>
#include <future>

static unsigned a_slow_calc()
{
  sleep( 1 );
  return 1u;
}

TEST( Test_future, Ensure_async )
{
  // 1. immediately returns
  std::future<unsigned> answer = std::async( a_slow_calc );

  // 2. std::future::get BLOCKS until the result is ready
  EXPECT_EQ( 1u, answer.get() );
}
4

2 に答える 2

3

std::launch::async 起動ポリシーを使用する必要があります。最初の関数呼び出しは、上に書いたコメントとは反対に、すぐに戻ることが保証されていません。

デフォルトのポリシーは、このスレッドまたは別のスレッドで作業を行うことです。現在のコードは、あなたのマシンではテストに合格するかもしれませんが、クライアントのマシンでは失敗する可能性があります...

ポリシーを使用する場合std::launch::async、テストは基本的に C++11 標準をテストしています。つまり、テストしたいものはすでに標準によって保証されています。

于 2013-01-11T08:43:11.643 に答える
1

を使用wait_forしてfuture、タイムアウトがゼロ(または非常に小さい)で、値が返されるかどうかを確認できますfuture_status::timeout

于 2013-01-11T08:29:31.870 に答える