2

私のテストは、で宣言された関数内に含まれてTEST_Fいるため、テスト間で新しいテスト フィクスチャ オブジェクトを使用できます。ごとTEST_Fに、テスト フィクスチャの新しいインスタンスが作成されます。しかし、テストで列挙型をループして、反復ごとにテスト フィクスチャの新しいインスタンスを作成したい場合はどうすればよいでしょうか。この場合、どうすればよいですか?

4

1 に答える 1

1

value-parameterized testsを使用したいようです。

次のように、列挙型の値を反復処理できます。

#include <iostream>
#include "gtest/gtest.h"

enum Malt { bowmore = 10, talisker, scapa };

class Whisky {
 public:
  explicit Whisky(const Malt& malt) : malt_(malt) {}
  bool IsIslay() const { return malt_ == bowmore; }
 private:
  Malt malt_;
};

class DramTest : public testing::TestWithParam<Malt> {
 protected:
  DramTest() : whisky_(GetParam()) {}
  Whisky whisky_;
};

TEST_P(DramTest, IsIslay) {
  if (GetParam() == bowmore)
    EXPECT_TRUE(whisky_.IsIslay());
  else
    EXPECT_FALSE(whisky_.IsIslay());
}

INSTANTIATE_TEST_CASE_P(AllMalts, DramTest,
                        testing::Values(bowmore, talisker, scapa));

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}


多数の列挙値がある場合は、Rangeジェネレーターの代わりにジェネレーターを使用できますValue

testing::Range<int>(bowmore, scapa + 1)

ただし、これには int 型と enum 型の間のフィクスチャでのキャストが必要です。


どちらのオプションもメンテナンスの問題に悩まされています。新しい列挙値を追加する場合は、忘れずにテストを変更する必要があります。

于 2012-10-31T19:52:06.233 に答える