欢迎光临
我们一直在努力

24.国产构建工具之王xmake——xmake集成gtest框架进行单元测试(test实战)

目录

一、引言

二、正文

1.gtest框架的用法和特征

1)核心概念与术语

 2)核心断言使用

3)简单测试编写(TEST 宏)

4)共享数据测试(测试夹具 + TEST_F 宏)

5)测试的运行与执行

6)跨平台支持与已知限制

7)获取方式

 2.xmake集成gtest测试框架 

1)创建被测项目

 2)添加单元测试源代码

3)xmake中添加单元测试配置

 4)进行单元测试

3.xmake集成gtest改进

4.补充知识——SUBSYSTEM

1)作用

2)选项值

3)设置方法

三、结语


写在前面

所有内容首发都将在公众号【飞翔的SA】,也请大家移步公众号阅读,您的支持是我坚持的动力。

原创不易,每一篇文章都是花费大量的时间编写而成,都是干货满满!如果各位觉得对自己有帮助,请动动您发财的小手,关注本账号, 我将持续为大家带来优质内容!


一、引言

在之前的文章中我们分别介绍了xmake原生单元测试和集成doctest、catch2测试框架的示例。

本文将继续介绍xmake集成第三方测试框架的知识,此次集成的第三方框架为googleTest(简称gtest)。 本章内容由三个部分组成:gtest框架的用法和特征、xmake集成gtest框架示例、xmake集成gtest改进。 

文中使用的软件及版本:xmake3.0.7, visual studio 2019请预先安装!

二、正文

1.gtest框架的用法和特征

GoogleTest 是 Google 开发的跨平台 C++ 测试框架,基于 xUnit 架构(如果有JUnit,PyUnit使用经验,使用gtest会如鱼得水),支持单元测试等各类测试,核心优势是实现测试隔离、易组织、可移植,且能快速定位问题,以下是其核心基本用法,包含核心概念、基础使用、进阶复用、测试运行的内容:

1)核心概念与术语

断言:检查条件是否为真的宏,是测试的基础,结果分成功/非致命失败/致命失败,失败时会打印文件、行号及自定义消息。

测试(TEST):由一系列断言组成,验证被测试代码的单个行为,断言失败 / 程序崩溃则测试失败,否则成功(对应 ISTQB 的测试用例)。

测试套件(TEST SUITE):一组相关的测试集合,反映被测试代码的结构,可共享数据和子程序(GTest 原称测试用例,现逐步替换为 TestSuite)。

测试夹具(TEST FIXTURE):为多个测试提供相同数据配置的类,实现测试代码的复用。

测试程序:包含一个或多个测试套件的可执行文件,是运行测试的载体。

 2)核心断言使用

断言是 GTest 的核心,分为ASSERT_和EXPECT_两类,成对测试同一条件但影响不同,支持通过 << 追加自定义失败消息。

ASSERT_*:致命失败,断言失败时立即中止当前函数,适用于 “失败后继续执行无意义” 的场景(如解引用指针前检查非空),可能因提前返回导致资源泄漏。

EXPECT_*:非致命失败,断言失败后程序继续执行,可报告一个测试中的多个错误,是首选方式。

使用示例:

ASSERT_EQ(x.size(), y.size()) << \”两个向量长度不相等\”; // 致命失败,中止函数for (int i = 0; i < x.size(); ++i) {

EXPECT_EQ(x[i], y[i]) << \”向量在索引\” << i << \”处值不同\”; // 非致命失败,继续执行} 

支持的断言类型:布尔条件检查、值的关系比较、字符串 / 浮点值验证、异常等,也可自定义谓词实现复杂校验。

3)简单测试编写(TEST 宏)

适用于无共享数据的独立测试,通过TEST()宏定义测试函数,无需返回值,核心是按测试套件分组。

a.宏定义格式 

TEST(TestSuiteName, TestName) {  //测试体:包含任意有效C++代码 + GTest断言}

参数要求:TestSuiteName(测试套件名)、TestName(测试名)均为有效 C++ 标识符,不能包含下划线。

测试全名:测试套件名 + 测试名,不同测试套件的测试可重名。

b. 编写示例(测试阶乘函数)

// 被测试函数声明int Factorial(int n);// 测试套件FactorialTest,包含两个测试TEST(FactorialTest, HandlesZeroInput) {

   EXPECT_EQ(Factorial(0), 1); // 测试0的阶乘}TEST(FactorialTest, HandlesPositiveInput) {

  EXPECT_EQ(Factorial(1), 1);  EXPECT_EQ(Factorial(8), 40320); // 测试正整数阶乘}

c. 命名规范

测试套件和测试名遵循 C++函数 / 类的命名约定,逻辑相关的测试归为同一个测试套件。

4)共享数据测试(测试夹具 + TEST_F 宏)

当多个测试需要操作相同数据配置时,使用测试夹具实现代码复用,需继承testing::Test并使用TEST_F()宏(F=Fixture)。

a. 创建测试夹具的步骤

从testing::Test派生类,以 protected 开始(方便子类访问成员);

类内声明测试所需的共享对象;

按需编写SetUp()(每个测试前初始化对象)/ TearDown()(每个测试后释放资源),或使用构造 / 析构函数(注意 SetUp 不要拼写成 Setup);

按需定义测试共享的子程序。

b. TEST_F 宏定义格式

TEST_F(TestFixtureClassName, TestName) {

//测试体:可直接访问夹具类的成员变量/方法}

第一个参数必须是测试夹具类名,需先定义夹具类再使用,否则报编译器错误;

GTest 为每个测试创建独立的夹具对象,测试间的夹具修改互不影响,执行完即销毁。

c. 编写示例(测试队列类 Queue)

// 被测试队列类声明template <typename E>class Queue {

 public:  Queue();  void Enqueue(const E& element);  E* Dequeue();  size_t size() const;};// 1. 定义测试夹具类QueueTestclass QueueTest : public testing::Test {

 protected:  // 构造函数初始化共享对象:q0空队列,q1含1,q2含2、3  QueueTest() {

赞(0)
未经允许不得转载:171主机测评 » 24.国产构建工具之王xmake——xmake集成gtest框架进行单元测试(test实战)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址