• 【GTest】C++单元测试框架 Google Test 的简单使用


    1.简介

    GTest 是一个跨平台的 (Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian) C++单元测试框架,由google公司发布。

    GTest 有如下特点:

    • 提供强大的断言集,支持包括布尔、整型、浮点型、字符串等
    • 提供断言方法自定义扩展
    • 自动收集测试用例,无需开发者再次组织
    • 提供死亡测试功能
    • 可以将公共的用例初始化和清理工作放入测试夹具中,由gtest自动调用
    • 使用参数化自动生成多个相似的测试用例

    获取地址:https://github.com/google/googletest

    2.初始化

    在一切环境、编译等准备就绪后,开始 GTest 的学习。

    下面针对我使用的 FCL 案例,来学习其中 GTEST 测试的部分:

    // gtest 头文件
    #include 
    
    // main 函数,用于初始化 gtest 和运行所有的测试样例
    int main(int argc, char* argv[])
    {
      ::testing::InitGoogleTest(&argc, argv);
      return RUN_ALL_TESTS();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们在程序中创建了许多 TEST(详见后文),RUN_ALL_TESTS();可以批量地执行它们。

    在终端中的结果输出为:

    [==========] Running 5 tests from 1 test case.
    [----------] Global test environment set-up.
    [----------] 5 tests from FCL_COLLISION
    
    • 1
    • 2
    • 3

    即,在我们的当前测试程序中,有一个测试样例,这个测试样例中包含了五个测试段,这五个 test 又都属于 FCL_COLLISION。具体内容详见后文所述。

    3.使用

    将我们要测试的函数加入到 GTEST 中:

    GTEST_TEST(FCL_COLLISION, test_SplineMotion_rotated_spline_collide_test)
    {
      test_SplineMotion_rotated_spline_collide_test<double>();
    }
    GTEST_TEST(FCL_COLLISION, OBB_Box_test)
    {
      test_OBB_Box_test<double>();
    }
    
    GTEST_TEST(FCL_COLLISION, OBB_shape_test)
    {
      test_OBB_shape_test<double>();
    }
    
    GTEST_TEST(FCL_COLLISION, OBB_AABB_test)
    {
      test_OBB_AABB_test<double>();
    }
    
    GTEST_TEST(FCL_COLLISION, mesh_mesh)
    {
      test_mesh_mesh<double>();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这里如果测试函数加入成功,则在执行时终端会打印:

    [ RUN      ] FCL_COLLISION.test_SplineMotion_rotated_spline_collide_test
    
    • 1

    可以直观地看出GTEST_TEST中的参数与终端打印输出的关系。

    在上述五个待测试函数中的结尾处,加入断言宏函数

    EXPECT_TRUE(result.is_collide);
    
    • 1

    注,result.is_collide是自定义的 bool 类型的状态变量。

    这样,我们就可以得知测试的结果。在终端显示为:

    [       OK ] FCL_COLLISION.test_SplineMotion_rotated_spline_collide_test (0 ms)
    
    • 1

    注:

    这里使用了 gtest 的断言(assertion)宏。包括:

    • ASSERT_XXX(condition),返回类型为successfatal failture
    • EXPECT_XXX(condition),返回类型为successnon-fatal failture

    断言的结果是根据condition(expected, actual)返回的结果来判断的,若返回 false,则断言的结果为 failture。其中,fatal failture 会使程序直接退出,non-fatal failture 会返回错误信息,然后继续测试后续案例。所以在工程中,常用EXPECT_XXX宏函数。

    主要的的EXPECT_XXXASSERT_XXX函数及其判断条件,如下两个表所示。

    在这里插入图片描述

    在这里插入图片描述
    还有更多宏,可以自行去网上查找。

    全部测试样例完成后,终端打印输出:

    [----------] Global test environment tear-down
    [==========] 5 tests from 1 test case ran. (3834 ms total)
    [  PASSED  ] 5 tests.
    
    • 1
    • 2
    • 3
  • 相关阅读:
    代码随想录 | Day 55 - LeetCode 392. 判断子序列、LeetCode 115. 不同的子序列
    Torch截断一部分后是否能梯度回传
    LeetCode50天刷题计划(Day 14—— 删除链表的倒数第 N 个结点(12.20-13.00)
    011_第一代软件开发(三)
    内核态内存映射
    UnityPlayerActivity详解
    Day07 SSM第七次笔记---Maven进阶部分学习
    Ubuntu中为Python2.7安装pip
    基于PHP的网上订餐平台系统VUE【源码论文】
    sqoop-import 详解
  • 原文地址:https://blog.csdn.net/qq_43557907/article/details/126118125