一文学会gtest UT测试编写(TEST\TEST_F)

目录

一、官方文档&代码

二、不同平台导入gtest静态库

Android工程

Linux

三、UT测试 Step by Step

1. 示例入门

 2. 断言 EXPECT 与 ASSERT

 3. TEST与TEST_F

TEST

TEST_F

4. gmock


Google Test(简称 gtest)是 Google C++ 测试框架,用于编写和运行单元测试、集成测试和功能测试。它是一个功能丰富且易于使用的测试框架,旨在帮助开发人员编写可靠和高效的 C++ 测试代码。

一、官方文档&代码

GoogleTest User’s Guide | GoogleTest

GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework

二、不同平台导入gtest静态库

Android工程

aosp自带静态库,头文件在标准库中,所以使用很方便。

至少包含下面的库

LOCAL_STATIC_LIBRARIES +=   \libgtest

使用时直接包含头文件即可

#include <gtest/gtest.h>

Linux

一般自己编译,或直接取编译好的使用

编译方法

# 下载gtest源文件
git clone https://github.com/google/googletest.git# build需要的静态库
# 新建build是为了让编译生成的文件都在这个目录下,整洁
cd googletest/
mkdir build
cd build/
# cmake会根据CMakeLists.txt文件生成Makefile文件
# make生成可执行文件(库)
cmake ..
make

看下生成产物:

对于简单的UT测试程序,只需要libgtest.a这个静态库。

三、UT测试 Step by Step

1. 示例入门

写个测试程序main.cpp

  1. 需要包含gtest.h头文件
  2. 不是必须要写main。如果没写main函数,可以引入libgtest_main.a代替,这个也是上节中的编译产物
#include <iostream>
#include <string>#include "gtest/gtest.h"int add(int a, int b)
{return a + b;
}TEST(Fun, AddTest)
{EXPECT_EQ(2, add(1, 1));EXPECT_EQ(0, add(1, -1));
}int main(int argc, char **argv)
{::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

编译运行

  1. 需要连接静态库+头文件
  2. c++版本要求>=14,依据Supported Platforms | GoogleTest
g++ main.cpp googletest/build/lib/libgtest.a -I googletest/googletest/include/ -o uint_test1 -std=c++14
./uint_test1

执行结果

 2. 断言 EXPECT 与 ASSERT

  • EXPECT_*:失败继续执行;
  • ASSERT_*:失败即终止。

由此可见,通常 EXPECT_* 是首选。

  1. ASSERT_* 是直接从当前函数返回的,可能会导致一些内存、文件资源没有释放,因此存在内存泄漏的问题。
  2. EXPECT_*可以继续执行完所有测试用例。

GoogleTest 提供了一系列断言:Assertions Reference | GoogleTest

 3. TEST与TEST_F

TEST

TEST(TestSuiteName, TestName) {... test body ...
}
  • TestSuiteName 对应测试用例集名称,TestName 是归属的测试用例名称。测试的全名由其包含的测试用例集及其测试名称组成。来自不同测试用例集的测试可以具有相同的名称。
  • 这两个名称都必须是有效的 C++ 标识符,并且它们不应包含任何下划线。

TEST_F

如果很多测试都执行一样的操作,那就会用到TEST_F。实际上,这个最常使用,一定要看懂

TEST_F(TestFixtureName, TestName) {... test body ...
}

Fixture,其语义是固定的设施,而 test fixture 在 GoogleTest 中的作用就是为每个 TEST 都执行一些同样的操作。

TestFixtureName 继承 testing::Test 类,然后根据我们的需要实现下面这两个虚函数:

  • virtual void SetUp():在 TEST_F 之前,构造函数之后运行;
  • virtual void TearDown():在 TEST_F 之后,析构函数之前运行。

此外 testing::Test 还提供了两个 static 函数:

  • static void SetUpTestSuite():在第一个 TEST 之前运行
  • static void TearDownTestSuite():在最后一个 TEST 之后运行

全局事件,即继承testing::Environment,需要调用AddGlobalTestEnvironment使能,并实现下面两个虚函数:

  • virtual void SetUp():在所有用例之前运行;
  • virtual void TearDown():在所有用例之后运行。

举例说明

#include <iostream>
#include <string>#include "gtest/gtest.h"class EnvironmentNew : public ::testing::Environment
{
public:~EnvironmentNew() override {}// Override this to define how to set up the environment.void SetUp() override{std::cout << "Environment SetUp" << std::endl;}// Override this to define how to tear down the environment.void TearDown() override{std::cout << "Environment TearDown" << std::endl;}
};int add(int a, int b)
{return a + b;
}// The fixture for testing class Foo.
class FooTest : public testing::Test
{
protected:// You can remove any or all of the following functions if their bodies would// be empty.FooTest(){// You can do set-up work for each test here.std::cout << "FooTest Constructor" << std::endl;}~FooTest() override{// You can do clean-up work that doesn't throw exceptions here.std::cout << "FooTest Destructor" << std::endl;}// If the constructor and destructor are not enough for setting up// and cleaning up each test, you can define the following methods:void SetUp() override{// Code here will be called immediately after the constructor (right// before each test).std::cout << "FooTest SetUp" << std::endl;}void TearDown() override{// Code here will be called immediately after each test (right// before the destructor).std::cout << "FooTest TearDown" << std::endl;}// Class members declared here can be used by all tests in the test suite// for Foo.static void SetUpTestSuite(){std::cout << "FooTest SetUpTestSuite" << std::endl;}static void TearDownTestSuite(){std::cout << "FooTest TearDownTestSuite" << std::endl;}
};TEST_F(FooTest, AddTest1)
{EXPECT_EQ(2, add(1, 1));
}TEST_F(FooTest, AddTest2)
{EXPECT_EQ(0, add(1, -1));
}TEST_F(FooTest, AddTest3)
{EXPECT_EQ(-2, add(-1, -1));
}int main(int argc, char **argv)
{// AddGlobalTestEnvironment非必须// 可在main外部定义全局变量调用testing::AddGlobalTestEnvironment,保证在RUN_ALL_TESTS前执行// 不需要手动deletetesting::AddGlobalTestEnvironment(new EnvironmentNew());::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

编译执行

g++ main1.cpp googletest/build/lib/libgtest.a -I googletest/googletest/include/ -o uint_test1 -std=c++14

执行结果

4. gmock

gmock用来模拟对外部对象的依赖,可以指定模拟对象在测试中应该被调用的次数、调用的顺序以及调用时传入的参数等条件。这有助于确保被测试代码与依赖的交互符合预期,而无需实际依赖于外部资源

本文暂时不做详细描述,实际工作中用的不算多。提供一些参考资料:

Mocking Reference | GoogleTest

【gmock】Google Mock 入门-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/458198.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM Java虚拟机入门指南

文章目录 为什么学习JVMJVM的执行流程JVM的组成部分类加载运行时数据区本地方法接口执行引擎 垃圾回收什么样的对象是垃圾呢内存溢出和内存泄漏定位垃圾的方法对象的finalization机制垃圾回收算法分代回收垃圾回收器 JVM调优参数JVM调优工具Java内存泄漏排查思路CPU飙高排查方案…

【十】【C++】string类的模拟实现

浅拷贝 浅拷贝&#xff08;Shallow Copy&#xff09;是对象复制的一种方式&#xff0c;其中复制对象的过程仅仅复制对象的值&#xff0c;而不复制引用所指向的实际对象或数据。这意味着原始对象和拷贝对象会共享相同的引用或指针指向的数据。 浅拷贝的特点&#xff1a; 共享…

Python tkinter (16) —— Progressbar

本文主要介绍Python tkinter 进度条Progressbar应用及示例。 目录 系列文章 进度条Progressbar 基本概念 参数&#xff1a; mode参数 基本应用 动画设计 引入time 具体实现 start/step/stop step(amount)&#xff1a; start(interval)&#xff1a; stop()&#xff…

react中hook封装一个table组件

目录 react中hook封装一个table组件依赖CommonTable / index.tsx使用组件效果 react中hook封装一个table组件 依赖 cnpm i react-resizable --save cnpm i ahooks cnpm i --save-dev types/react-resizableCommonTable / index.tsx import React, { useEffect, useMemo, use…

VMware虚拟机安装openEuler系统(一)(2024)

目录 一、下载ISO镜像 二、开始创建虚拟机 通过实践是学习openEuler开源Linux系统的最佳方式。因此我们首先得搭建一个openEuler实战环境&#xff0c;文章是在Windows系统上使用VMware Workstation虚拟化软件&#xff0c;安装和学习openEuler开源Linux操作系统。 使用虚拟机…

新型RedAlert勒索病毒针对VMWare ESXi服务器

前言 RedAlert勒索病毒又称为N13V勒索病毒&#xff0c;是一款2022年新型的勒索病毒&#xff0c;最早于2022年7月被首次曝光&#xff0c;主要针对Windows和Linux VMWare ESXi服务器进行加密攻击&#xff0c;到目前为止该勒索病毒黑客组织在其暗网网站上公布了一名受害者&#x…

人工智能专题:量子汇编语言和量子中间表示发展白皮书

今天分享的是人工智能系列深度研究报告&#xff1a;《人工智能专题&#xff1a;量子汇编语言和量子中间表示发展白皮书》。 &#xff08;报告出品方&#xff1a;量子信息网络产业联盟&#xff09; 报告共计&#xff1a;78页 量子计算与量子编程概述 随着社会生产力的发展&am…

vue3 之 商城项目—home

home—整体结构搭建 根据上面五个模块建目录图如下&#xff1a; home/index.vue <script setup> import HomeCategory from ./components/HomeCategory.vue import HomeBanner from ./components/HomeBanner.vue import HomeNew from ./components/HomeNew.vue import…

手势检测跟踪解决方案

美摄科技&#xff0c;作为业界领先的人工智能技术提供商&#xff0c;致力于为企业提供先进的手势检测与跟踪解决方案&#xff0c;以推动企业在智能化、高效化的道路上阔步前行。 一、手势检测与跟踪技术的优势 手势检测与跟踪技术作为人机交互的重要一环&#xff0c;具有以下…

Flask 入门7:使用 Flask-Moment 本地化日期和时间

如果Web应用的用户来自世界各地&#xff0c;那么处理日期和时间可不是一个简单的任务。服务器需要统一时间单位&#xff0c;这和用户所在的地理位置无关&#xff0c;所以一般使用协调世界时&#xff08;UTC&#xff09;。不过用户看到 UTC 格式的时间会感到困惑&#xff0c;他们…

雨云EPYC7702服务器上线了!适合幻兽帕鲁开服的VPS!雨云EPYC7702高防VPS性能测评

雨云游戏云上线了AMD EPYC 7702的VPS服务器&#xff0c;中等水平的单核性能&#xff0c;适合开幻兽帕鲁和我的世界1.17以下版本的服务器。 AMD Epyc 7702是一款64核心128线程&#xff0c;基础频率2.00 GHz加速频率高达3.35 GHz处理器&#xff0c;凭借着7 nm工艺及新一代Rome (…

SpringBoot:@Profile注解和Spring EL

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、Prof…