gtest简介

gtest简介

如何编写一个好的测试用例?

  • 测试应该是独立和可重复的。
  • 测试应该组织良好,并反映被测代码的结构。
  • 测试应该是可移植的和可重用的。

一个好的测试框架应该做到

  • 当测试失败时,应该尽可能多的提供问题信息。
  • 测试框架应该让测试人员专注于测试内容。
  • 测试速度很快。

gtest相关概念

  • gtest是一个面向C/C++的测试框架。
  • 一个测试程序可以包含多个测试套件,测试套件(Test Suite/Test Case)反映被测代码的结构,一个测试套件可以包含一个或多个测试用例(Test),每个测试用例应该被分组到相应的测试套件中。当测试套件中的多个测试需要共享公共对象和子程序时,可以将它们放入测试夹具类中。
  • gtest断言是一种类似函数调用的宏,通过对类或函数的行为进行断言来测试它。

测试套件和测试用例名称规范

  • 满足C++标识符命名要求;
  • 建议以大驼峰格式命名;
  • 避免使用下划线。

gtest断言

  • gtest断言主要有两种,一种是以ASSERT开头的,一种是以EXPECT开头的,它们总是成对存在的。
  • 使用ASSERT发生失败时产生致命失败,并中止当前测试用例。
  • 使用EXPECT发生失败时产生非致命失败,不会中止当前测试用例。
  • 通常首选EXPECT,因为它们允许一个测试中报告多个失败。但是,如果断言失败时继续执行没有意义,则应该选择ASSERT。另外,由于失败的ASSERT会立即从当前测试用例返回,它将跳过后面的清理代码,所以可能会造成内存泄漏。
  • 通常以第一个参数作为期望值,第二个参数作为实际值。

布尔型检查

在这里插入图片描述

数值型检查

gtest简介_第1张图片

  • EXPECT_EQ()对指针类型执行指针相等的操作。
  • 在对指针进行判空操作时,使用*_EQ(ptr, nullptr)和*_NE(ptr, nullptr),而不是*_EQ(ptr, NULL) and *_NE(ptr, NULL)。

字符串检查

gtest简介_第2张图片

  • 这里的比较是C格式的字符串(char*),如果想比较C++格式字符串(string),使用EXPECT_EQ或EXPECT_NE。
  • 空指针和空串被认为是不同的。
  • STREQ和STRNE也接受C格式的宽字符串版本。

成功或失败

在这里插入图片描述

异常检查

gtest简介_第3张图片

测试夹具

  • 如果需要编写两个或多个对类似数据进行操作的测试,那么可以使用测试夹具,它可以为几个不同的测试使用相同的对象配置。
  • 当使用测试夹具时,使用TEST_F()宏而不是TEST(),并且第一个参数必须是测试夹具类的名字。
  • 如何定义测试夹具
    • 继承::testing::Test
    • 构造函数和析构函数使用protected权限
    • 定义SetUp(),TearDown(),同样使用protected权限

测试夹具成员函数执行顺序

  • 对于用TEST_F()定义的每个测试,gtest将在运行时创建一个新的测试夹具对象,通过SetUp()立即初始化它,然后运行测试,最后通过调用TearDown()进行清理,并删除测试夹具对象。
  • 同一测试套件中的不同测试具有不同的测试夹具对象,而gtest总是在创建下一个测试夹具对象之前删除当前测试夹具对象。
  • gtest不会对多个测试重用同一个测试夹具对象。一个测试对夹具对象所做的任何更改都不会影响其他测试。
  • 执行顺序:构造函数 -> SetUp() -> TearDown() -> 析构函数

gtest全局设置

  • 通过函数RUN_ALL_TESTS()执行所有的测试用例,当所有的测试都成功时,返回0,否则,返回1。
  • gtest将根据main的返回值判断所有测试是否成功,所以main函数应该返回RUN_ALL_TESTS()。
  • 全局应只调用一次RUN_ALL_TESTS()。
  • 在调用RUN_ALL_TESTS()之前必须先初始化gtest标志,通过调用::testing::InitGoogleTest()来实现,它接受命令行参数来控制程序功能。

你可能感兴趣的:(温故知新)