如何使用GoogleTest和CTest进行单元测试(googletest教程)

如何使用GoogleTest和CTest进行单元测试(googletest教程)

浏览次数:
信息来源: 用户投稿
更新日期: 2025-10-23 15:17:03
文章简介

本文我将介绍如何通过GoogleTest和CTest将单元测试集成到这个构建系统中。首先克隆这个仓库,用VSCodium打开,切换到标签。你可以通过点击分支符号(红框处),然后选择标签(黄框处)

2025阿里云双十一服务器活动

本文我将介绍如何通过GoogleTest和CTest将单元测试集成到这个构建系统中。

首先克隆这个仓库,用VSCodium打开,切换到标签。

你可以通过点击分支符号(红框处),然后选择标签(黄框处)来进行切换:

或者你可以通过命令行来切换:

GoogleTest是一个平台无关的开源C++测试框架。单元测试是用来验证单个逻辑单元的行为的。尽管GoogleTest并不是专门用于单元测试的,我将用它对?库进行单元测试。

在GoogleTest中,测试用例是通过断言宏来定义的。断言可能产生以下结果:

  • 成功:测试通过。
  • 非致命失败:测试失败,但测试继续。
  • 致命失败:测试失败,且测试终止。
  • 致命断言和非致命断言通过不同的宏来区分:

  • :致命断言,失败时终止。
  • :非致命断言,失败时不终止。
  • 谷歌推荐使用?宏,因为当测试中包含多个的断言时,它允许继续执行。断言有两个参数:第一个参数是测试分组的名称,第二个参数是测试自己的名称。只定义了函数,所以本文中所有的测试都属于同一个测试组:。

    针对?函数的测试可以从GeneratorTest.cpp中找到。

    generate(…)函数有一个std::stringstream的引用作为输入参数,并且它也将这个引用作为返回值。第一个测试就是检查输入的引用和返回的引用是否一致。

    在这个测试中我使用std::addressof来获取对象的地址,并用来比较输入对象和返回对象是否是同一个。

    本测试检查作为输入的?引用中的元素个数与输入参数中指定的个数是否相同。

    本测试检查随机化引擎是否工作正常。如果连续调用两次?函数,应该得到的是两个不同的结果。

    与前面的测试相比,这是一个大体量的测试。它检查1到n的数值序列的和与乱序重排后的序列的和是否相等。?函数应该生成一个1到n的乱序的序列,这个序列的和应当是不变的。

    你可以像对一般C++程序一样调试这些测试。

    除了嵌入到代码中的测试之外,CTest提供了可执行程序的测试方式。简而言之就是通过给可执行程序传入特定的参数,然后用正则表达式对它的输出进行匹配检查。通过这种方式可以很容易检查程序对于不正确的命令行参数的反应。这些测试定义在顶层的CMakeLists.txt文件中。下面我详细介绍3个测试用例:

    如何使用GoogleTest和CTest进行单元测试,googletest教程

    如果没有传入参数,程序应该立即退出并提示错误原因:

    当传入的参数不是整数时,程序应该退出并报错。比如给?传入参数:

    可以使用?命令来执行测试。这里给的命令行参数:

  • :执行单个测试
  • :打印详细输出
  • 在这里我执行了名为?的测试。

    输出不匹配?的正则模式,测试未通过。

    如果想要执行所有测试(包括那些用GoogleTest生成的),切换到?目录中,然后运行即可:

    在VSCodium中可以通过点击信息栏的黄框处来调用CTest。如果所有测试都通过了,你会看到如下输出:

    使用Git钩子进行自动化测试

    目前为止,运行测试是开发者需要额外执行的步骤,那些不能通过测试的代码仍然可能被提交和推送到代码仓库中。利用Git钩子可以自动执行测试,从而防止有瑕疵的代码被提交。

    切换到?目录,创建文件,复制粘贴下面的代码:

    然后,给文件增加可执行权限:

    这个脚本会在提交之前调用CTest进行测试。如果有测试未通过,提交过程就会被终止:

    只有所有测试都通过了,提交过程才会完成:

    这个机制也有一个漏洞:可以通过?命令绕过测试。解决办法是配置构建服务器,这能保证只有正常工作的代码才能被提交,但这又是另一个话题了。

    本文提到的技术实施简单,并且能够帮你快速发现代码中的问题。

    做单元测试可以提高代码质量,同时也不会打断你的工作流。

    GoogleTest框架提供了丰富的特性以应对各种测试场景,文中我所提到的只是一小部分而已。

    如果你想进一步了解GoogleTest,我推荐你阅读GoogleTestPrimer。

    标签:
    日本服务器供应商
    « 上一篇
    返回列表
    下一篇 »

    如本文对您有帮助,就请抽根烟吧!