C++ 单元测试与代码覆盖率测试方法( 三 )


对于数值比较可以使用:
ASSERT_EQ(val1, val2); // 判断是否相等ASSERT_NE(val1, val2); // 判断是否不相等ASSERT_LT(val1, val2); // 判断是否小于ASSERT_LE(val1, val2); // 判断是否小于等于ASSERT_GT(val1, val2); // 判断是否大于ASSERT_GE(val1, val2); // 判断是否大于等于
说明:
对于字符串比较可以使用:
ASSERT_STREQ(str1,str2); // 判断字符串是否相等ASSERT_STRNE(str1,str2); // 判断字符串是否不相等ASSERT_STRCASEEQ(str1,str2); // 判断字符串是否相等 , 忽视大小写ASSERT_STRCASENE(str1,str2); // 判断字符串是否不相等 , 忽视大小写
对于浮点数判断可以使用:
//期待GetValueFloat 返回值等于3.1EXPECT_FLOAT_EQ(GetValueFloat(),3.1); EXPECT_DOUBLE_EQ(GetValueDouble(),3.1);//期待GetValueFloat返回值 , 在2.9和3.9之间EXPECT_NEAR(GetValueFloat(1),3.4,0.5);
Test
在某些情况下 , 我们可能希望多条测试case使用相同的测试数据 。例如 , 我们的演示项目中 , 每条case都会需要创建对象 。
有些时候 , 我们要测试的对象可能很大 , 或者创建的过程非常的慢 。这时 , 如果每条case反复创建这个对象就显得浪费资源和时间了 。此时 , 我们可以使用Test 来共享测试的对象 。
要使用Test 我们需要创建一个类继承自 Test中的::::Test 。
还记得我们前面说过 , 我们要尽可能的保证每条测试case是互相独立的 。但是 , 当我们在多条case之间共享有状态的对象时 , 就可能出现问题 。
例如 , 我们要测试的是一个队列数据结构 。有的case会向队列中添加数据 , 有的case会从队列中删除数据 。case执行的顺序不同 , 则会导致Queue中的数据不一样 , 这就可能会影响case的结果 。
为了保证每条case是独立的 , 我们可以在每条case的执行前后分别完成准备工作和清理工作 , 例如 , 准备工作是向队列中添加三个数据 , 而清理工作是将队列置空 。
这两项重复性的工作可以由::::Test类中的Setup和两个函数来完成 。
我们演示用的类是无状态的 , 所以不存在这个问题 。因此 , 这里我们仅仅在Setup和两个函数中打印了一句日志 。
使用Test 后 , 我们的代码如下所示:
class UtilityTest : public ::testing::Test {protected:void SetUp() override {cout << "SetUp runs before each case." << endl;}void TearDown() override {cout << "TearDown runs after each case." << endl;}Utility util;};
这段代码说明如下:
Setup和两个函数标记了以确认是重写父类中的方法 , 这是C++11新增的语法 。
我们的类是无状态的 , 因此Setup和两个函数中我们仅仅打印日志以便确认 。
将 util设置为以便测试代码中可以访问 。(从实现上来说 , 测试case的代码是从这个类继承的子类 , 当然 , 这个关系是由 Test工具完成的) 。
要使用这里定义的Test  , 测试case的代码需要将开头的TEST变更为 。
这里_F就是的意思 。
使用的case的代码结构如下:
TEST_F(TestCaseName, TestName) {... test body ...}
这里的必须是Test 的类名 。
所以我们的测试代码写起来是这样:
【C++ 单元测试与代码覆盖率测试方法】TEST_F(UtilityTest, ArithmeticCalculationDouble) {EXPECT_EQ(util.ArithmeticCalculation(ADD, 1.1, 1.1), 2.2);}TEST_F(UtilityTest, ArithmeticCalculationIsLeapYear) {EXPECT_FALSE(util.IsLeapYear(1997));EXPECT_TRUE(util.IsLeapYear(2000));EXPECT_TRUE(util.IsLeapYear(2016));EXPECT_FALSE(util.IsLeapYear(2100));}