简介
googletest (下文简称gt)帮助你写更好的c++测试。
gt是由测试技术团队根据Google的特定要求和约束开发的测试框架。无论是在Linux,Windows还是Mac上工作,googletest都可以为你提供帮助。它支持任何类型的测试,而不仅仅是单元测试。
什么是好的测试,gt是如何做到这点的:
- 测试必须是独立,可重复的。gt通过在不同的对象中测试用例,以使各个测试用例互相独立。
- 测试应该有很好的组织和反应所测试代码的结构的能力。gt将相关的测试组合成测试套件,测试套件内可以共享数据和子程序,这种模式很容易识别且容易维护。
- 测试应该是可移植和可重用的。gt中很多代码都是平台无关的,可以在不同的平台环境中使用。
- 当测试失败时,应该能提供关于问题尽可能多的信息。gt在某个用例失败后,不会停止,而是继续测试其他用例,等所有的测试用例都运行结束后再列出所有的测试结果。使得用户可以在单次编译周期中尽可能多地发现问题。
- 测试框架应能让测试者从繁琐的事务中解放出来,只集中精力在其测试的内容上。gt会自动追踪所有的定义的测试,而不需要用户手动列出测试的内容。
- 测试必须快,gt可在测试之间贡献资源,只需要设置、销毁一次??
gt是基于流行的xunit框架编写的,所以如果你以前是用junit或者pyunit的,会很容易上手。
需要注意的术语
从历史上看,gt开始使用“Test Case”一词来对相关测试进行分组,而当前的出版物(包括国际软件测试资格委员会(ISTQB)资料和各种有关软件质量的教科书)都使用了“Test Suite”一词。
gt中使用的相关术语“Test”对应于ISTQB和其他术语“Test Case”。
gt最近开始用Test Suite取代术语Test Case。 一些较新的API已经改成TestSuite。 较旧的TestCase的 API也在逐渐被弃用并重构。
基本概念
使用gt时,你首先要编写断言(assertions),断言是检查条件是否为真的语句。 断言的结果可能是成功(success),非致命失败(nonfatal failure)或致命失败(fatal failure)。 如果发生致命故障,它将中止当前功能。 否则,程序将正常继续。
测试使用断言来验证被测试代码的行为。 如果测试崩溃或断言失败,则测试失败; 否则成功。
一个测试套件包含一个或多个测试。 你应该将测试分为反映套件代码结构的测试套件。 当测试套件中的多个测试需要共享通用对象和子例程时,可以将它们放入test fixture类。
一个测试程序可以包含多个测试套件。
接下来,将说明如何编写测试程序,该程序从各个声明级别开始,直至构建测试和测试套件。
断言(assertions)
googletest断言是类似于函数调用的宏。你可以通过断言其行为来测试类或函数。断言失败时,googletest会输出断言的源文件和行号位置以及失败消息。你还可以提供自定义失败消息,该消息将附加到googletest的消息之后。
断言成对出现,测试相同的事物,但对当前函数有不同的影响。 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字符串和字符串对象。 如果将宽字符串(wchar_t *,Windows上的UNICODE模式下的TCHAR *或std :: wstring)流式传输到声明,则在打印时将会被转换为UTF-8。
基本的断言
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_TRUE(condition); |
EXPECT_TRUE(condition); |
condition is true |
ASSERT_FALSE(condition); |
EXPECT_FALSE(condition); |
condition is false |
请记住,当它们失败时,ASSERT_ *会导致致命故障并从当前函数返回,而EXPECT_ *会导致非致命故障,从而允许该函数继续运行。 无论哪种情况,断言失败都意味着其包含测试失败。
二值比较
下面这些为二值比较的断言:
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 |