如何测试自己代码的正确性是个老生常谈的问题,在学校里面写作业经常用到的方式的就是使用 cout
输出代码运行结果,来测试代码逻辑的正确性。但这样会使得代码变得十分难看,所以在就找到了 google-test
这个单元测试框架。
C++
Google test
配置
windows
+vs
配置- 在最新版下载完成以后,打开
msvc
目录下的sln
工程项目。注意:这里的工程项目必须得在vs2010+
以上的版本中打开。 - 在
release
和debug
两种模式下各自生成解决方案。注意:完成这一步以后,会各自生成两个lib
文件,这将是后面需要用到的库文件。 - 以上为止就生成了使用
google-test
所需要的文件,下面就是配置工程的阶段。
- 在最新版下载完成以后,打开
- 工程配置(需要修改的地方)
- 配置头文件: c/c++ —> 常规—–>附加包含目录 添加
include
文件夹所在的位置 - 修改运行库运行模式:c/c++ —>代码生成—-> 运行库修改为动态链接
- 添加库文件:链接器—->输入—->在附加依赖项中添加
1
中生成的库文件。
- 配置头文件: c/c++ —> 常规—–>附加包含目录 添加
使用
- 目录基本结构
1
2
3
4
--- function.h
--- function.cxx
--- functionunittest.cxx
--- main.cxx
- 在
function.h
中存放头文件和函数的声明。 - 在
function.cxx
中存放函数体 - 在
functionunittest.cxx
中存放google-test
的测试语句 - 在
main.cxx
中存放执行google-test
的语句
-
代码基本框架
-
function.h
和function.cxx
中和没有使用test
的写法一样,主要修改是在functionunittest.cxx
和main.cxx
-
在
functionunittest.cxx
中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
//数值类型检查 TEST(test_name, test_value){ EXPECT_EQ(val1, val2); //测试 val1 == val2 EXPECT_GT(val1, val2); //测试 val1 > val2 EXPECT_NE(val1, val2); //测试val1 != val2 EXPECT_LE(val1, val2); //测试val1 <= val2 EXPECT_LT(val1, val2); //测试val1 < val2 } //布尔值检查 TEST(test_name, test_value){ EXPECT_TRUE(condition); //condition is true; EXPECT_FALSE(condition); //condition is false; } //字符串检查 TEST(test_name, test_value){ EXPECT_STREQ(str1, str2); // str1的内容和str2的内容相等 EXPECT_STRNE(str1, str2); //str1的内容和str2的内容不相等 EXPECT_STRCASEEQ(str1, str2); //在忽略大小的情况下,str1和str2的内容相等 }
-
在
main.cxx
中1 2 3 4 5
#include<gtest/gtest.h> int main(int argc, char* argv[]){ testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
-
-
使用方式
-
Simple Test
这种使用方式就如上面介绍的代码所示,就是使用
TEST
宏,本质上和c++
一样,只是没有返回值。在其中可以使用任意的c++
语句。TEST
中写入不同的测试语句。 -
Test Fixtures: using the same data configuration for multiple tests
- 从 ::testing::Test 继承一个
protected
属性的class
- 在
class
里面可以声明任何准备使用的对象 - 在
SetUp()
中准备需要测试的数据。 - 在
TearDown()
销毁在SetUp()
中分配的资源 -
使用
fixture
的时候,需要使用TEST_F
这个宏。 - 运行流程
googletest
创建一个QueueTest
对象t1
。- 调用
t1.SetUp()
初始化t1
- 第一个测试
IsEmptyInitially
开始运行 - 调用
t1.TearUp()
回收内存 t1
被销毁- 重复上面过程。
- 从 ::testing::Test 继承一个
-
ASSERT_* 和 EXPECT_*的区别
当错误不影响程序继续运行时,则使用 EXPECT_*
当错误影响程序继续运行时,则使用ASSERT_*
1 2 3 4
n2 = q2_.Dequeue(); ASSERT_NE(n, nullptr); EXPECT_EQ(*n, 2); ....
例如如上代码,里面用到了
ASSERT_NE(n, nullptr)
。这是因为在接下来的EXPECT_EQ(*n,2)
中,要对n
进行解引用,如果n
为nullptr
却对其解引用会造成segfault
。 -