一、如何使用Gtest
VS2019内置了Gtest,只需要在创建项目时选择Gtest项目即可。
官方指南:GoogleTest User’s Guide
二、快速上手
我们需要的头文件:
#include "gtest/gtest.h"
使用模板vs会为你创建pch.h和pch.cpp文件,上述引用已包含,同时已经为你生成test.cpp文件。下面让我们开始写我们的测试程序:
2.1 测试代码的主函数
int main(int argc, char* argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
上面就是我们测试程序主函数运行需要的基本函数,一个初始化、一个返回(运行测试)。下面让我来写一个简单的被测函数。
2.2 被测函数
int Plus5(const int& p)
{
return p + 5;
}
在完成这一步之后,我们可以尝试写一个测试函数来测试我们的被测代码。
2.3 测试程序
TEST(TestCaseName, TestName)
{
int ParaNum(5), ExpNum(10);
EXPECT_EQ(ExpNum, Plus5(ParaNum));
}
关于Assert和Expect的部分将放在文章最后,下面是它们完整的样子:
#include "pch.h"
int Plus5(const int& p)
{
return p + 5;
}
TEST(TestCaseName, TestName)
{
int ParaNum(5), ExpNum(10);
EXPECT_EQ(ExpNum, Plus5(ParaNum));
}
int main(int argc, char* argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
接下来我们可以直接运行,输出如上图所示:
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from TestCaseName
[ RUN ] TestCaseName.TestName
[ OK ] TestCaseName.TestName (0 ms)
[----------] 1 test from TestCaseName (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (18 ms total)
[ PASSED ] 1 test.
这样,我们就完成了我们的第一个单元测试。可视化方案:打开菜单 测试->Windows->测试资源管理器。
三、Gtest的断言
gtest 使用一系列断言的宏来检查值是否符合预期,主要分为两类:ASSERT 和 EXPECT。区别在于 ASSERT 不通过的时候会认为是一个 fatal 的错误,退出当前函数(只是函数)。而 EXPECT 失败的话会继续运行当前函数,所以对于函数内几个失败可以同时报告出来。通常我们用 EXPECT 级别的断言就好,除非你认为当前检查点失败后函数的后续检查没有意义。
3.1 基础断言
Fatal Assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition is true |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | condition is false |
3.2 二元比较
Fatal Assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_EQ(val1, val2); | EXPECT_EQ(val1, val2); | val1 == val2 |
ASSERT_NE(val1, val2); | EXPECT_NE(val1, val2); | val1 != val2 |
ASSERT_LT(val1, val2); | EXPECT_LT(val1, val2); | val1 < val2 |
ASSERT_LE(val1, val2); | EXPECT_LE(val1, val2); | val1 <= val2 |
ASSERT_GT(val1, val2); | EXPECT_GT(val1, val2); | val1 > val2 |
ASSERT_GE(val1, val2); | EXPECT_GE(val1, val2); | val1 >= val2 |
3.3 字符串比较
Fatal Assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_STREQ(str1,str2); | EXPECT_STREQ(str1,str2); | the two C strings have the same content |
ASSERT_STRNE(str1,str2); | EXPECT_STRNE(str1,str2); | the two C strings have different content |
ASSERT_STRCASEEQ(str1,str2); | EXPECT_STRCASEEQ(str1,str2); | the two C strings have the same content, ignoring case |
ASSERT_STRCASENE(str1,str2); | EXPECT_STRCASENE(str1,str2); | the two C strings have different contents, ignoring case |