sample7展示了如何使用值参数化测试(value-parameterized tests)来测试一个接口的多个实现的共同属性。test case中的每一个test都有一个参数指向被测试的实现接口的指针。
sample7使用的测试接口和sample6一样在prime_tables.h
中定义。
sample7CMake编译规则,在test/src/samples/CMakeLists.txt
最后添加以下两行:
add_executable(sample7_unittest sample7_unittest.cc)
target_link_libraries(sample7_unittest PUBLIC gtest gtest_main)
接着看sample7_unittest.cc中的内容。
sample7_unittest内容
一般而言为了防止一个测试影响后面的测试,应该为每一个测试创建并销毁测试对象,而非重复利用它们。sample7中将为PrimeTable
对象定义一个简单工厂函数,在SetUp()
中实例化它,并且在TearDown()
中删除它。
以下是定义的工厂函数:
typedef PrimeTable* CreatePrimeTableFunc(); //使用typedef定义了一种名为CreatePrimeTableFunc的类型,该类型为一个函数,无参数且返回一个PrimeTable类型的指针。
PrimeTable* CreateOnTheFlyPrimeTable() {
return new OnTheFlyPrimeTable();
}
template <size_t max_precalculated>
PrimeTable* CreatePreCalculatedPrimeTable(){
return new PriCalculatedPrimeTable(max_precalculated);
}
在test 内部、test fixture的构造函数、SetUp()和TearDown()方法内部可以使用GetParam()
来引用测试参数,在这个例子中测试参数是一个工厂函数,我们在test fixture的SetUp()
中调用它来创建和存储PrimeTable
的实例。
class PrimeTableTestSmpl7: public TestWithParam<CreatePrimeTableFunc*> {
public:
~PrimeTableTestSmpl7() override{ delete table_; }
void SetUp() override { table_ = (*GetParam())(); }
void TearDown() override {
delete table_;
table_ = nullptr;
}
protected:
PrimeTable* table_;
}
接下来是使用TEST_P
定义的几个test,这几个test同属于test casePrimeTableTestSmpl7
。猜测TEST_P
的归则和TEST_F
一样,test case的名字需要和test fixture的名字一样。
TEST_P(PrimeTableTestSmpl7, ReturnsFalseForNonPrimes){}
TEST_P(PrimeTableTestSmpl7, ReturnsTrueForPrimes){}
TEST_P(PrimeTableTestSmpl7, CanGetNextPrime){}
为了运行value-parameterized tests
你还需要实例化他们,或者将他们bind到一个列表,这个列表被来作test 的参数。你可以将他们实例化到不同的模块,或者重复实例化他们。
在sample7中,我们用两个PrimeTable
对象的工厂函数参数列表来实例化test,以下是方法。
INSTANTIATE_TEST_SUITE_P(OnTheFlyAndPreCalated, PrimeTableTestSmpl7, Values(&CreateOnTheFlyPrimeTable,
&CreatePreCalculatedPrimeTable<1000>));
文件中使用的TestWithParam
和Values
都在命名空间testing
下。