Google C++ Test Framework使用
简介
Google C++ Testing Framework(以下简称gtest),是一套为C++程序编写测试用例的测试框架。由于gtest跨平台的,所以不论你使用Linux,还是Windows,又或者是其他的操作系统,它都能很好的帮助你编写测试用例。
安装
下载
部署
由于google是以源码的形式发布gtest的,为了用gtest写测试程序,我们首先需要手动编译gtest生成库,然后在测试程序中使用gtest库
解压缩gtest
解压缩后会发现,有很多文件夹和文件,下面介绍几个重要的文件:
include
包含gtest框架的所有头文件
src
包含gtest框架的所有源文件
samples
测试用的例子
make
为GNU make编译gtest库准备
codegear
为Borland C++ Builder编译gtest库准备
msvc
为visual studio编译gtest库准备
xcode
为Mac Xcode编译gtest库准备
CMakeLists.txt
为cmake准备
编译
make 编译
进入make目录,执行make命令会生成gtest的静态库gtest_main.a,与此同时,顺便关联了samples中的第一个测试程序sample1,并且生成测试程序sample_unittest,可以执行这个程序,看下结果。
- cmake编译
- 运行实例
基本概念
断言是用来检测条件是否为true的语句,并且你可以通过写断言来使用gtest,一个断言的结果可能是成功,非致命的失败以及致命的失败。如果一个致命的失败出现,它将中断当前函数;否则程序正常运行。
测试用断言验证被测试代码的行为。如果一个测试崩溃或者有一个失败的断言,然后它就失败了,否则它就成功了。
一个测试用例包含一个或多个测试。你应该根据被测试的代码的结构来将测试组织成不同的测试用例。当测试用例中的大量的测试需要共享公共对象和子程序时,你可以将这些被共享的东西放进一个测试装备类(test fixture class)中。
一个测试程序中可能包含大量的测试用例。现在我们将要解释如何写一个测试程序,从单个的断言水平和构建测试和测试用例开始。
断言
gtest 断言是类似函数调用的宏。你可以通过为一个类或一个函数的行为做出断言的方式来做测试。当断言失败的时候,gtest会将会将断言的源文件和行号位置连同一些失败的消息一起打印出来。你也可以提供一些自定义的失败消息追加在gtest的消息后面。
断言都是成对的(ASSERT_*,EXPECT_*),但是它们测试同样的程序会有不同的影响。使用ASSERT_*版本时,当断言失败时,将会生成致命失败,并且中断当前函数,然而如果用EXPECT_*版本时,将会出现非致命失败,并且不会中断当前函数。通常大家更喜欢用EXPECT_*版本,因为它们允许在一个测试中超过一个失败被报告(出现失败不会中断)。然而,如果当断言失败后,继续执行没有任何意义的话,要使用ASSERT_*版本。
因为一个失败的ASSERT_*会立即从当前函数中返回,可能会跳过这个断言后面的清理代码,它可能导致空间泄漏。根据这个泄漏的特性,它值得或者不得修改-因此牢记这一点你可能得到一个堆检查程序错误除了断言错误。
为了提供一个自定义失败信息,可以将消息用‘ << ’操作符流入宏,例如:
ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";
for (int i = 0; i < x.size(); ++i) {
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}
任何可以被流进ostream中的都可以被流进断言宏中尤其是c字符串和string对象。如果宽字符串流进一个宏,打印的时候将会被转换成UTF-8
基本断言
这些断言只是做基本的true/false 条件测试。
致命断言 | 非致命断言 | 验证 |
---|---|---|
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition is true |