当前位置: 首页 > article >正文

什么是 GTest?

什么是 GTest?

GTest(Google Test)是一个由 Google 开发并开源的 C++ 单元测试框架。它提供了一组强大的功能和工具来帮助开发人员为他们的 C++ 代码编写和执行单元测试。

单元测试是软件开发中的一种常见实践,它指的是对单独的代码单元(如函数、类方法等)进行独立验证,确保每个部分都按预期工作。GTest 是用于 C++ 中实现这种测试的一种工具。

GTest 的目标是帮助开发者:

  • 自动化测试过程
  • 提供易于理解和管理的测试输出
  • 提供各种测试断言(例如检查函数输出是否符合预期)

作为小白如何理解 GTest 的原理

GTest 通过以下几个主要原理帮助进行单元测试:

  1. 测试用例(Test Cases)

    • 每个测试用例都是一个函数,用来验证你代码中某个功能是否按预期工作。
    • 测试用例通常是通过特定的断言来验证结果。
  2. 断言(Assertions)

    • 断言是测试中最重要的部分,它用来验证你期望的结果与实际结果是否一致。例如,EXPECT_EQ(a, b) 检查 ab 是否相等,如果不相等,测试失败。
    • GTest 提供了多种断言,常见的有:
      • EXPECT_EQ(a, b):检查 a 是否等于 b
      • EXPECT_TRUE(x):检查表达式 x 是否为 true
      • EXPECT_FALSE(x):检查表达式 x 是否为 false
      • EXPECT_THROW(statement, exception_type):检查 statement 是否抛出指定类型的异常。
  3. 测试套件(Test Suites)

    • 测试套件包含一组相关的测试用例,它们共同测试代码中某一部分的不同功能。
  4. 测试运行器

    • 运行 GTest 测试时,GTest 会自动执行所有的测试用例,并报告测试的结果。运行器会显示哪些测试通过了,哪些测试失败了,失败的原因是什么。
  5. Fixture

    • 在某些情况下,你可能需要在每个测试之前或之后做一些初始化或清理工作,这时就用到了测试夹具(Test Fixture)。它允许你定义在多个测试之间共享的代码,如设置对象、数据库连接等。

如何上手使用 GTest

假设你已经安装了 GTest,接下来是如何创建并运行测试的基本步骤。

1. 安装 GTest

你可以使用 vcpkgapt 或手动编译等方法安装 GTest,具体方式可以参考 GTest 官方文档。

以手动安装为例:

  • 下载 GTest 源码:https://github.com/google/googletest/releases
  • 解压并进入目录:
    cd googletest
    mkdir build
    cd build
    cmake ..
    make
    sudo make install
    
2. 编写测试代码

GTest 的核心是通过编写测试用例来验证代码的正确性。这里我们会写一个简单的测试代码来演示如何使用 GTest。

#include <gtest/gtest.h>

// 目标函数:我们将测试这个加法函数
int add(int a, int b) {
    return a + b;
}

// 测试用例:验证 add 函数的正确性
TEST(AdditionTest, HandlesPositiveInput) {
    EXPECT_EQ(add(2, 3), 5);  // 断言 2 + 3 == 5
    EXPECT_EQ(add(10, 20), 30);  // 断言 10 + 20 == 30
}

TEST(AdditionTest, HandlesNegativeInput) {
    EXPECT_EQ(add(-1, -1), -2);  // 断言 -1 + -1 == -2
    EXPECT_EQ(add(-10, 5), -5);  // 断言 -10 + 5 == -5
}

// main 函数:运行测试
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);  // 初始化 Google Test
    return RUN_ALL_TESTS();  // 运行所有测试并返回测试结果
}
3. 编译并运行测试

假设你已经编写了测试代码,并保存为 test.cpp 文件。你需要通过编译器将其编译并链接到 GTest 库。

使用 g++ 编译:

g++ test.cpp -lgtest -lgtest_main -pthread -o test_program
./test_program

解释:

  • -lgtest-lgtest_main:链接 Google Test 库。
  • -pthread:如果使用多线程测试,必须链接线程库。
  • -o test_program:编译成可执行文件 test_program

运行后,你将看到类似下面的输出,表示哪些测试通过,哪些失败:

Running main() from gtest_main.cc
[==========] Running 2 tests from 1 test suite.
[----------] 2 tests from AdditionTest
[ RUN      ] AdditionTest.HandlesPositiveInput
[       OK ] AdditionTest.HandlesPositiveInput (0 ms)
[ RUN      ] AdditionTest.HandlesNegativeInput
[       OK ] AdditionTest.HandlesNegativeInput (0 ms)
[----------] 2 tests from AdditionTest (0 ms total)

[==========] 2 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 2 tests.

4. 逐步理解与使用 GTest

  • 定义测试:通过 TEST 宏定义一个测试用例,TEST 后面的第一个参数是测试套件名,第二个参数是测试用例的名称。
  • 断言:使用各种断言(如 EXPECT_EQEXPECT_TRUE)来验证目标函数的行为是否符合预期。
  • 运行测试:通过 RUN_ALL_TESTS() 来启动所有的测试。

小结

  • GTest 是一个用于 C++ 单元测试的框架,帮助开发人员通过断言和测试用例验证代码的正确性。
  • 作为小白,你可以从理解 TEST 宏、断言(如 EXPECT_EQ)开始,逐步掌握 GTest 的核心概念。
  • 通过编写和运行简单的测试代码,你可以逐步熟悉 GTest 的使用。

http://www.kler.cn/a/466880.html

相关文章:

  • VSCode编辑+GCC for ARM交叉编译工具链+CMake构建+OpenOCD调试(基于STM32的标准库/HAL库)
  • 【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)
  • 【数据结构05】排序
  • 数据挖掘——概论
  • 【跟着官网学技术系列之MySQL】第2天之MySQL版本:创新和 LTS
  • 声音是如何产生的
  • xml格式化(1):使用python的xml库实现自闭合标签
  • 青少年编程与数学 02-005 移动Web编程基础 12课题、移动表单
  • 编写可复用性的模块
  • 【51单片机零基础-chapter4:LED数码管】
  • 机器学习基础-机器学习的常用学习方法
  • c++ 递推
  • 「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
  • asp.net core mvc的 ViewBag 和 ViewData 和 Module
  • 腾讯云大数据智能管家:AI驱动管理效能飞升
  • 何为进程、何为线程、如何理解 JS 的异步、什么是JS的事件循环、任务有优先级吗、JS中的计时器能做到精确计时吗
  • MySQL 08 章——聚合函数
  • AI代码开发实践-微信小程序开发
  • 在Typora中实现自动编号
  • 「C++笔记」vector:C++中的新式“数组”
  • 新服务器Linux网络配置
  • vue+js+Java在分页的el-table里实现上移、下移;置顶
  • 计算机网络复习(学习通作业4、5、6系统答案)
  • 细说STM32F407单片机轮询方式CAN通信
  • 【读书笔记·VLSI电路设计方法解密】问题36:一个好的设计流程有哪些特点
  • C语言里面的size_t是什么意思