GTest
要测试DelayTrace
类,派生出一个测试类TestDelayTrace
将辅助测试函数TestItemsSum
printHash
放在派生类中。
class TestDelayTrace :public QPP::DelayTrace
{
public:
int TestItemsSum()
{
if (0 >= delayMap.Size())
{
log_warning("delayMap %d", delayMap.Size());
return 0;
}
uint64_t sum = 0,count = 0;
KMAP32_FOREACH_KV(&(this->delayMap), uint32_t, icount, key)
count += *icount; //count
sum += key * *icount;
KMAP32_FOREACH_END()
if (0 == count)
{
log_warning("delay data count 0");
return 0;
}
return count; //count
}
void printHash()
{
KMAP32_FOREACH_KV(&(this->delayMap), uint32_t, v, key)
log_debug("%u---%u", key, *v);
KMAP32_FOREACH_END()
}
};
测试组件DelayTraceFix
在随后的测试代码中此类会被实例化,测试目标为trace
实例。
SetUp()
是在所有案例执行前执行,理解为前期准备工作,TearDown()
是在所有案例执行后执行,理解为最后收尾工作。
class DelayTraceFix : public ::testing::Test
{
protected:
void SetUp() override
{}
void TearDown() override
{}
TestDelayTrace trace;
};
每次执行用例的时候
SetUp()
先于测试用例执行
TearDown()
测试用例后,最后执行
TEST宏与断言
这里有四个单元测试 SaveData
、SaveData_mount10W
、CalcQuality4
、CalcQuality3
使用TEST_F(<类名>,<测试名称>)
格式,每一个TEST_F相互独立数据不可共享,出了当前TEST_F之后重头再来
,TEST_F
可理解为类的外挂函数。
SaveData
验证插入数据功能
SaveData_mount10W
暴力测试插入10W数据 验证插入数据功能
CalcQuality4
造假数据 验证CalcQuality计算结果
CalcQuality3
造假数据 验证CalcQuality计算结果
使用EXPECT_EQ
断言 检查是否相等
更多断言参考此处
TEST_F(DelayTraceFix, SaveData) {
trace.SaveData(0);
trace.SaveData(1);
trace.SaveData(2);
trace.SaveData(3);
trace.SaveData(4);
trace.SaveData(0);
trace.SaveData(1);
trace.SaveData(2);
trace.SaveData(3);
trace.SaveData(4);
trace.SaveData(65535);
trace.SaveData(65536);
trace.SaveData(-1);
}
TEST_F(DelayTraceFix, SaveData_mount10W) {
for (size_t i = 0; i < 100000; i++){
trace.SaveData(std::rand());
}
int count = 0;
count = trace.TestItemsSum();
EXPECT_EQ(count == 100000, true);
printf("count %d\n",count);
}
TEST_F(DelayTraceFix, CalcQuality4){
trace.SaveData(34);
trace.SaveData(34);
trace.SaveData(15);
trace.SaveData(16);
trace.SaveData(78);
int threshold = 100;
int avg = -1, variance = -1;
int percent = -1;
bool success = trace.CalcQuality(threshold, 0, &avg, &variance, &percent);
EXPECT_EQ(success, true);
EXPECT_EQ(avg, 35);
EXPECT_EQ(variance, 522);
EXPECT_EQ(percent, 0);
}
TEST_F(DelayTraceFix, CalcQuality3){
trace.SaveData(72);
trace.SaveData(71);
trace.SaveData(73);
trace.SaveData(74);
trace.SaveData(76);
trace.SaveData(100);
int threshold = 100;
int avg = -1, variance = -1;
int percent = -1;
bool success = trace.CalcQuality(threshold, 0, &avg, &variance, &percent);
EXPECT_EQ(success, true);
EXPECT_EQ(avg, 77);
EXPECT_EQ(variance, 102);
EXPECT_EQ(percent, 16);
}
对一个求绝对值函数测试
ASSERT_* 系列的断言,当检查点失败的时候,终止当前函数的执行(不退出当前案例)。
EXPECT_* 系列的断言,当检查点失败的时候,当前函数继续执行。
数值断言
- *_TRUE 期待值为真
- *_FALSE 期待值为假
- *_EQ 期待值和对比值相等
- *_NE 期待值和对比值不相等
- *_LT 期待值小于对比值
- *_LE 期待值小于等于对比值
- *_GT 期待值大于对比值
- *_GE 期待值大于对比值
字符串断言
终止断言 | 普通断言 | 验证 |
---|---|---|
ASSERT_STREQ(val1,val2) | EXPECT_STREQ(val1,val2) | val1 == val2 |
ASSERT_STRNE(val1,val2) | EXPECT_STRNE(val1,val2) | val1 != val2 |
ASSERT_STRCASEEQ(val1,val2) | EXPECT_STRCASEEQ(val1,val2) | 忽略大小写 val1 == val2 |
ASSERT_STRCASENE(val1,val2) | EXPECT_STRCASENE(val1,val2) | 忽略大小写 val1 != val2 |
int Abs(int x)
{
return x > 0 ? x : -x;
}
TEST(IsAbsTest,HandlerTrueReturn)
{
ASSERT_TRUE(Abs(1) == 1) << "Abs(1)=1"; //ASSERT_TRUE期待结果是true,operator<<输出一些自定义的信息
ASSERT_TRUE(Abs(-1) == 1) << "Abs(-1)=1";
ASSERT_FALSE(Abs(-2) == -2); //期待结果是false
ASSERT_EQ(Abs(1),Abs(-1));
EXPECT_EQ(Abs(1),1);
ASSERT_NE(Abs(-1),0);
ASSERT_LT(Abs(-1),2);
ASSERT_GT(Abs(-1),0);
ASSERT_LE(Abs(-1),2);
ASSERT_GE(Abs(-1),0);
}
关于gmock
gmock 感觉采用的意义不大,要打桩的话,采用宏定义替代源函数加独立的实现模式,更方便,没看出用gmock有啥优势,而且即使用gmock,也要先用宏定义替代源函数才行,有点画蛇添足了。