目录
一、引言
二、正文
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() {




![第5章,[Win32 章节] :边框绘制函数(六)-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260822144238-6a89b55eb002b-220x150.png)
