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)

但这需要在整数和枚举类型之间的夹具中进行一些转换。


两种选择都存在维护问题;如果添加新的枚举值,则需要记住更改测试。

于 2012-10-31T19:52:06.233 回答