google test入门

googletest是一个跨平台的C++测试框架,它支持独立、可重复的测试,具有良好的组织结构和可移植性。测试分为测试套件和测试,使用断言进行验证,包括二值比较和字符串比较。它提供了Test Fixtures来共享测试数据,并可以通过编写main函数运行测试。此外,gt还允许在测试失败后继续执行其他测试,以提供更多的错误信息。
摘要由CSDN通过智能技术生成
简介

googletest (下文简称gt)帮助你写更好的c++测试。

gt是由测试技术团队根据Google的特定要求和约束开发的测试框架。无论是在Linux,Windows还是Mac上工作,googletest都可以为你提供帮助。它支持任何类型的测试,而不仅仅是单元测试。

什么是好的测试,gt是如何做到这点的:

  1. 测试必须是独立,可重复的。gt通过在不同的对象中测试用例,以使各个测试用例互相独立。
  2. 测试应该有很好的组织和反应所测试代码的结构的能力。gt将相关的测试组合成测试套件,测试套件内可以共享数据和子程序,这种模式很容易识别且容易维护。
  3. 测试应该是可移植和可重用的。gt中很多代码都是平台无关的,可以在不同的平台环境中使用。
  4. 当测试失败时,应该能提供关于问题尽可能多的信息。gt在某个用例失败后,不会停止,而是继续测试其他用例,等所有的测试用例都运行结束后再列出所有的测试结果。使得用户可以在单次编译周期中尽可能多地发现问题。
  5. 测试框架应能让测试者从繁琐的事务中解放出来,只集中精力在其测试的内容上。gt会自动追踪所有的定义的测试,而不需要用户手动列出测试的内容。
  6. 测试必须快,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值