超完整GoogleTest入门指南:从环境搭建到第一个测试用例

超完整GoogleTest入门指南:从环境搭建到第一个测试用例

【免费下载链接】googletest GoogleTest - Google Testing and Mocking Framework 【免费下载链接】googletest 项目地址: https://gitcode.com/gh_mirrors/googl/googletest

在软件开发过程中,你是否遇到过这些问题:修改代码后担心破坏原有功能?手动测试耗时费力且容易遗漏?GoogleTest(Google测试框架)可以帮你解决这些烦恼。本文将带你从零开始,快速掌握GoogleTest的环境搭建、基本概念和第一个测试用例的编写,让你的代码质量提升一个台阶。读完本文,你将能够独立搭建GoogleTest测试环境,理解测试用例的基本结构,并编写和运行自己的第一个测试。

为什么选择GoogleTest?

GoogleTest是一个功能强大的C++测试框架,它具有以下优势:

  • 独立性和可重复性:每个测试在独立的对象上运行,确保测试结果不受其他测试影响,便于调试。
  • 良好的组织性:将相关测试分组为测试套件(Test Suite),使测试代码结构清晰,易于维护。
  • 可移植性和可重用性:支持多种操作系统和编译器,适用于各种C++项目。
  • 丰富的断言:提供多种断言宏,能详细报告测试失败信息,帮助快速定位问题。
  • 高效率:允许跨测试重用共享资源,减少重复的 setup 和 teardown 工作。

更多关于GoogleTest的设计理念,可以参考官方文档docs/primer.md

环境搭建:CMake快速上手

准备工作

在开始之前,确保你的系统满足以下要求:

  • 兼容的操作系统(如Linux、macOS、Windows)
  • 支持C++14及以上标准的C++编译器
  • CMake工具

获取GoogleTest源码

首先,通过以下命令克隆GoogleTest仓库:

git clone https://gitcode.com/gh_mirrors/googl/googletest.git
cd googletest

创建CMake项目

创建一个新的项目目录(例如my_project),并在其中创建CMakeLists.txt文件,内容如下:

cmake_minimum_required(VERSION 3.14)
project(my_project)

# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://gitcode.com/gh_mirrors/googl/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

enable_testing()

add_executable(
  hello_test
  hello_test.cc
)
target_link_libraries(
  hello_test
  GTest::gtest_main
)

include(GoogleTest)
gtest_discover_tests(hello_test)

以上配置声明了对GoogleTest的依赖,并设置了基本的编译选项。详细的CMake配置说明可以参考docs/quickstart-cmake.md

编译和运行

在项目目录下执行以下命令编译并运行测试:

cmake -S . -B build
cmake --build build
cd build && ctest

如果一切顺利,你将看到测试通过的输出信息。

核心概念:测试用例与断言

测试用例(Test Case)

在GoogleTest中,测试用例是通过TEST()宏定义的,格式如下:

TEST(TestSuiteName, TestName) {
  // 测试代码
}

其中,TestSuiteName是测试套件的名称,TestName是测试用例的名称。测试套件用于将相关的测试用例分组。

断言(Assertions)

断言是GoogleTest的核心,用于检查代码的行为是否符合预期。GoogleTest提供了两种类型的断言:

  • ASSERT_*:致命断言,失败时会立即终止当前测试函数。
  • EXPECT_*:非致命断言,失败时会继续执行当前测试函数。

常用的断言包括:

  • EXPECT_EQ(a, b):检查a是否等于b
  • EXPECT_NE(a, b):检查a是否不等于b
  • EXPECT_TRUE(condition):检查条件是否为真
  • EXPECT_FALSE(condition):检查条件是否为假

更多断言类型可以参考官方文档docs/reference/assertions.md

实战:编写第一个测试用例

准备被测代码

创建sample1.h文件,定义一个简单的阶乘函数:

#ifndef SAMPLE1_H_
#define SAMPLE1_H_

// 返回n的阶乘;n为负数时返回1
int Factorial(int n);

// 判断n是否为素数;n <= 1时返回false
bool IsPrime(int n);

#endif  // SAMPLE1_H_

创建sample1.cc文件,实现上述函数:

#include "sample1.h"

int Factorial(int n) {
  int result = 1;
  for (int i = 2; i <= n; i++) {
    result *= i;
  }
  return result;
}

bool IsPrime(int n) {
  if (n <= 1) {
    return false;
  }
  if (n == 2) {
    return true;
  }
  if (n % 2 == 0) {
    return false;
  }
  for (int i = 3; i * i <= n; i += 2) {
    if (n % i == 0) {
      return false;
    }
  }
  return true;
}

编写测试用例

创建sample1_unittest.cc文件,编写测试用例:

#include "sample1.h"
#include <limits.h>
#include "gtest/gtest.h"

namespace {
// 测试阶乘函数
TEST(FactorialTest, Negative) {
  EXPECT_EQ(1, Factorial(-5));
  EXPECT_EQ(1, Factorial(-1));
  EXPECT_GT(Factorial(-10), 0);
}

TEST(FactorialTest, Zero) {
  EXPECT_EQ(1, Factorial(0));
}

TEST(FactorialTest, Positive) {
  EXPECT_EQ(1, Factorial(1));
  EXPECT_EQ(2, Factorial(2));
  EXPECT_EQ(6, Factorial(3));
  EXPECT_EQ(40320, Factorial(8));
}

// 测试素数判断函数
TEST(IsPrimeTest, Negative) {
  EXPECT_FALSE(IsPrime(-1));
  EXPECT_FALSE(IsPrime(-2));
  EXPECT_FALSE(IsPrime(INT_MIN));
}

TEST(IsPrimeTest, Trivial) {
  EXPECT_FALSE(IsPrime(0));
  EXPECT_FALSE(IsPrime(1));
  EXPECT_TRUE(IsPrime(2));
  EXPECT_TRUE(IsPrime(3));
}

TEST(IsPrimeTest, Positive) {
  EXPECT_FALSE(IsPrime(4));
  EXPECT_TRUE(IsPrime(5));
  EXPECT_FALSE(IsPrime(6));
  EXPECT_TRUE(IsPrime(23));
}
}  // namespace

这个测试用例文件来自项目中的googletest/samples/sample1_unittest.cc,它测试了阶乘函数和素数判断函数的各种情况。

编译和运行测试

修改CMakeLists.txt,添加测试文件:

add_executable(
  sample1_test
  sample1.cc
  sample1_unittest.cc
)
target_link_libraries(
  sample1_test
  GTest::gtest_main
)

gtest_discover_tests(sample1_test)

然后重新编译并运行测试:

cmake --build build
cd build && ./sample1_test

你将看到所有测试用例的运行结果。

高级技巧:测试夹具(Test Fixtures)

当多个测试用例需要使用相同的数据配置时,可以使用测试夹具(Test Fixtures)来避免重复代码。测试夹具通过继承testing::Test类实现:

class QueueTest : public testing::Test {
 protected:
  void SetUp() override {
    // 初始化代码,在每个测试用例前执行
    q1_.Enqueue(1);
    q2_.Enqueue(2);
    q2_.Enqueue(3);
  }

  // void TearDown() override {
  //   // 清理代码,在每个测试用例后执行
  // }

  Queue<int> q0_;  // 空队列
  Queue<int> q1_;  // 包含一个元素
  Queue<int> q2_;  // 包含两个元素
};

TEST_F(QueueTest, IsEmptyInitially) {
  EXPECT_EQ(q0_.size(), 0);
}

TEST_F(QueueTest, DequeueWorks) {
  int* n = q0_.Dequeue();
  EXPECT_EQ(n, nullptr);

  n = q1_.Dequeue();
  ASSERT_NE(n, nullptr);  // 致命断言,如果失败则不执行后续语句
  EXPECT_EQ(*n, 1);
  EXPECT_EQ(q1_.size(), 0);
  delete n;
}

在上面的例子中,QueueTest是一个测试夹具类,SetUp()方法在每个测试用例执行前初始化队列。TEST_F()宏用于定义使用夹具的测试用例。

总结与进阶

通过本文的学习,你已经掌握了GoogleTest的基本使用方法,包括环境搭建、测试用例编写和断言使用。想要进一步提升测试技能,可以参考以下资源:

  • 官方文档docs/primer.md 提供了更详细的GoogleTest教程。
  • 示例代码:项目中的googletest/samples/目录包含了更多复杂的测试示例。
  • 高级特性:GoogleTest还支持参数化测试、死亡测试等高级特性,可以参考docs/advanced.md

现在,你已经拥有了编写可靠C++代码的得力工具。开始为你的项目添加测试用例吧,它将帮助你更早地发现和修复bug,提高代码质量和可维护性。

【免费下载链接】googletest GoogleTest - Google Testing and Mocking Framework 【免费下载链接】googletest 项目地址: https://gitcode.com/gh_mirrors/googl/googletest

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值