在玩轉 Google開源C++單元測試架構Google Test系列(gtest)之四 - 參數化中已經介紹過了如何使用gtest進行參數化測試。在twitter上應 @xlinker 的要求,我在這裡提供一個參數化的完整例子。這個例子也是我當初瞭解gtest時寫的,同時這個例子也在《玩轉》系列中出現過。最後,我再附上整個demo工程,裡面有一些其他的樣本,剛開始上手的同學可以直接拿我的demo工程去試,有任何疑問都歡迎提出。以下是使用TEST_P宏進行參數化測試的樣本:
#include "stdafx.h"
#include "foo.h"
#include <gtest/gtest.h>
class IsPrimeParamTest : public::testing::TestWithParam<int>
{
};
// 不使用參數化測試,就需要像這樣寫五次
TEST(IsPrimeTest, HandleTrueReturn)
{
EXPECT_TRUE(IsPrime(3));
EXPECT_TRUE(IsPrime(5));
EXPECT_TRUE(IsPrime(11));
EXPECT_TRUE(IsPrime(23));
EXPECT_TRUE(IsPrime(17));
}
// 使用參數化測試,只需要:
TEST_P(IsPrimeParamTest, HandleTrueReturn)
{
int n = GetParam();
EXPECT_TRUE(IsPrime(n));
}
// 定義參數
INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));
// -----------------------
// 更複雜一點的參數結構
struct NumberPair
{
NumberPair(int _a, int _b)
{
a = _a;
b = _b;
}
int a;
int b;
};
class FooParamTest : public ::testing::TestWithParam<NumberPair>
{
};
TEST_P(FooParamTest, HandleThreeReturn)
{
FooCalc foo;
NumberPair pair = GetParam();
EXPECT_EQ(3, foo.Calc(pair.a, pair.b));
}
INSTANTIATE_TEST_CASE_P(ThreeReturn, FooParamTest, testing::Values(NumberPair(12, 15), NumberPair(18, 21)));
完整樣本工程:
/Files/coderzh/Code/gtest_demo.rar