Google Test Tutorial

news2025/2/24 7:19:14

Google Test Tutorial

1. 简介(Introduction)

google开发的测试框架

2. 术语(Nomenclature)

Test Case:一组相关的测试,GoolgeTest

Test Suit: 一些出版物、教科书、包括国际软件测试认证委员会资料使用的术语
GoogleTest在逐渐使用TestSuit代替TestCase

3. 基本概念(Basic Concepts)

  1. 使用GoogleTest从写断言(assertions)开始
  2. 断言检查条件是否为真
  3. 断言的结果可以是success(成功), nonfatal failure(非致命错误), fatal failure(致命错误)
  4. fatal failure会中止当前的函数;
  5. test suite(测试套件)包含一个或多个测试,将相关的测试组织在一起,可以体现测试代码的良好的组织结构
  6. test suite中的多个test需要共享对象或者子程序时,可以将他们放在test fixture类里
  7. 一个测试程序可以包含多个test suite

4. 断言(assertions)

通过对类或函数的行为进行断言来对其进行测试
断言如果失败,将打印一些信息,包括源文件、行号以及错误信息,也可以追加自定义的信息(<<)

ASSERT_*

失败时产生致命错误,程序中断

EXPECT_*

失败时产生非致命错误,程序继续

5. 创建一个test

  1. 使用test宏定义一个函数,没有返回值
  2. 在函数体中添加assertion语句
  3. 所有的测试通过即测试成功
TEST(TestSuiteName, TestName)
{
    ... test body ...
}

参数1是测试套件的名字,参数2是测试名字(描述一组测试)
参数必须是有效的c++标识符,并且不能包含下划线(_)

例如,定义一个函数

int Factorial(int n);  // Returns the factorial of n

创建一个测试套件来测试它:

// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
  EXPECT_EQ(Factorial(0), 1);
}

// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
  EXPECT_EQ(Factorial(1), 1);
  EXPECT_EQ(Factorial(2), 2);
  EXPECT_EQ(Factorial(3), 6);
  EXPECT_EQ(Factorial(8), 40320);
}

6. 创建一个Test Fixtures

Test Fixtures,多个测试共享相同的数据

  1. 继承testing::Test,成员访问权限为protected
  2. 在类内生命任意要使用的对象
  3. 如有需要,声明默认构造函数或者override SetUp函数
  4. 如有需要,声明析构函数或者override TearDown函数
  5. 如有需要,定义子程序

使用Test fixture的宏为TEST_F(),其中F代表fixture

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

例如:一个待测试的Queue类,接口如下

template <typename E>
class Queue
{
public:
    Queue();
    void Enqueue(const E& ele);
    E* Dequeue(); // returns null if queue is empy
    size_t size() const;
    ...
};

首先定义一个test fixture类,给它一个名字FooTest,Foo为被测试的类

class QueueTest : public testing::Test
{
protected:
    QueueTest()
    {
        q1_.Enqueue(1);
        q2_.Enqueue(2);
        q2_.Enqueue(3);
    }

    Queue<int> q0_;
    Queue<int> q1_;
    Queue<int> q2_;
};

接下来使用TEST_F()和上述fixture写测试代码

TEST_F(QueueTest, IsEmptyInitially)
{
    int* n = q0_.Dequeue();
    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;

    n = q2_.Dequeue();
    ASSERT_NE(n, nullptr);
    EXPECT_EQ(*n, 2);
    EXPECT_EQ(q2_.size(), 1);
    delete n;
}

7. 测试调用

GoogleTest会隐式的注册TEST()和TEST_F(),不需要手动的再一次列出所定义的test
通过调用RUN_ALL_TESTS()运行所有的test,成功返回0,否则返回1

RUN_ALL_TESTS();

8. Main函数

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

InitGoogleTest通过命令行参数控制测试程序的行为

多数情况下可以不用写main函数,GoogleTest提供了gtest_main

9. 在visual studio中运行googletest

  1. clone GoogleTest
  2. cd到目录下,
  3. 新建build文件夹,cd到build文件夹
  4. cmake .. -G "Visual Studio 14 2015"
  5. 打开build目录下的solution文件
  6. 编译googletest
  7. 在自己的project中,右键project选择properties
  8. 添加include directories

C/C++ -> General -> Additional Include Directories -> Edit

添加include路径, “d:\googletest-main\googletest\include”

  1. 添加library路径

Linker -> Additional Library Directories -> Edit

D:\googletest-main\build\lib\Debug

  1. 添加连接依赖

Linker -> Input ->Additional Dependencies -> Edit

添加gtest.lib, gtest_main.lib

  1. 运行时库

C/C++ -> Code Generation ->Runtime Library -> Select “Multi-threaded Debug (/MTd)”

  1. 编译运行

    测试通过,得到类似这样的打印结果
    在这里插入图片描述
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电商致命问题,抖音小店没有流量怎么办?三个方法解决

哈喽~我是电商月月 昨天有个朋友问我&#xff0c;她在抖音上做网店&#xff0c;图的就是抖音日活量大&#xff0c;有了流量&#xff0c;也就容易出单了&#xff0c;但她遇到了一个尴尬的问题&#xff1a;就是抖音的流量并不是她店铺的流量&#xff0c;她上架的商品没几个人浏览…

「Java开发指南」如何利用MyEclipse启用Spring DSL?(二)

本教程将引导您通过启用Spring DSL和使用Service Spring DSL抽象来引导Spring和Spring代码生成项目&#xff0c;本教程中学习的技能也可以很容易地应用于其他抽象。在本教程中&#xff0c;您将学习如何&#xff1a; 为Spring DSL初始化一个项目创建一个模型包创建一个服务和操…

【深度学习基础(1)】什么是深度学习,深度学习与机器学习的区别、深度学习基本原理,深度学习的进展和未来

文章目录 一. 深度学习概念二. 深度学习与机器学习的区别三. 理解深度学习的工作原理1. 每层的转换进行权重参数化2. 怎么衡量神经网络的质量3. 怎么减小损失值 四. 深度学习已取得的进展五. 人工智能的未来 - 不要太过焦虑跟不上 一. 深度学习概念 先放一张图来理解下人工智能…

不同路径 1 2

class Solution {public int uniquePaths(int m, int n) {int[][] dpnew int[m][n];//记录到每个格子有多少种路径for(int i0;i<m;i) dp[i][0]1;for(int j0;j<n;j) dp[0][j]1;//初始化for(int i1;i<m;i){for(int j1;j<n;j){dp[i][j]dp[i-1][j]dp[i][j-1];}}return …

【IR 论文】HyDE:让 LLM 对 query 做查询改写来改进 Dense Retrieval

论文&#xff1a;Precise Zero-Shot Dense Retrieval without Relevance Labels ⭐⭐⭐⭐ CMU, ACL 2023, arXiv:2212.10496 Code: github.com/texttron/hyde 文章目录 论文速读总结 论文速读 在以往的 dense retrieval 思路中&#xff0c;需要对 input query 做 encode 来得到…

Spring6 当中 Bean 的生命周期的详细解析:有五步,有七步,有十步

1. Spring6 当中 Bean 的生命周期的详细解析&#xff1a;有五步&#xff0c;有七步&#xff0c;有十步 文章目录 1. Spring6 当中 Bean 的生命周期的详细解析&#xff1a;有五步&#xff0c;有七步&#xff0c;有十步每博一文案1.1 什么是 Bean 的生命周期1.2 Bean 的生命周期 …

Halcon 检测物体定位点

文章目录 get_domain 返回所有输入图像的定义域作为一个区域add_channels 给区域增加灰度值find_shape_model 发现匹配模板find_shape_models 发现最佳模板示例 get_domain 返回所有输入图像的定义域作为一个区域 Halcon 中的区域 get_domain(Image : Domain : : ) Image : …

【JavaWeb Day 2 - JS 】

JavaWeb Day 2 - JS JS背景故事1. JS 引入方式2. JS 基本语法2.2 变量2.3 数据类型2.4 运算符 3. JS 函数4. JS 对象4.1 Array对象4.2 String对象4.3 JSON对象4.4 BOM对象4.4.1 windows 对象4.4.2 location 对象 4.5 DOM 对象DOM 案例 5. JS 事件监听5.1 JS 事件绑定 及 常见事…

Docker--compose概述与部署

目录 一、概述 1. Compose简介 1.1 docker compose常用命令 1.2 Compose配置常用字段 2. YAML简介 2.1 YAML支持的数据结构 2.2 YML文件编写注意事项 2.3 Docker Compose文件结构 3. Docker-Compose安装 ​编辑 4.docker Compose撰写nginx 镜像 1. 准备环境 ​编辑…

TinyMaix在x210开发板上的移植

目录 说明 环境准备 编译代码 源程序下载 修改tm_port.文件 修改CMake文件 测试程序运行 说明 我们教学中使用的x210开发板使用S5PV210这款CPU&#xff0c;它是根据三星的smdkv210开发板进行裁剪设计的&#xff0c;这个开发板非常的老了&#xff0c;不过在有经费购买新…

如何进行面向对象分析、面向对象设计和面向对象编程

目录 1.引言 2.案例介绍和难点剖析 3.如何进行面向对象分析 4.如何进行面向对象设计 5.如何进行面向对象编程 6.总结 1.引言 面向对象分析(OOA)、面向对象设计(00D)和面向对象编程(OOP)是面向对象开发的3个主要环节。 在以往的工作中&#xff0c;作者发现&#xff0c;很多…

one command each day on Linux

url address 1.12) grep Linux下面查找文本命令grep, 类似于Window编辑器的ctrlF查找我们想要的内容, PS:对比learning skill 看一下它的基础用法,准备一个目录文件和文本文件, 打印出这个单词,或者包含有这个字母的所有字符串 [rootiZ2vc5lqzt23aweti4j777Z ~]# grep hel…

【JAVA】part5-Java集合

Java 集合 Java集合概述 Java数组的局限性 数组初始化后大小不可变&#xff1b;数组只能按索引顺序存取。 Java的java.util包主要提供了以下三种类型的集合&#xff1a; List&#xff1a;一种有序列表的集合&#xff0c;例如&#xff0c;按索引排列的Student的List&#xff1b…

我们到底需要什么样的 BTC 一层协议?

在之前的一篇文章里 -- 《Runes 协议上线五天&#xff0c;大家在 FUD 什么&#xff1f;》&#xff0c;我简单分析了大家对 Runes 协议 FUD 的底层原因&#xff1a;目前的一层协议只是支持了毫无新鲜叙事的资产滥发&#xff0c;并没有实现让资产流动起来的更大价值。也正因为除了…

Vue阶段练习:初始化渲染、获取焦点

阶段练习主要承接Vue 生命周期-CSDN博客 &#xff0c;学习完该部分内容后&#xff0c;进行自我检测&#xff0c;每个练习主要分为效果显示、需求分析、静态代码、完整代码、总结 四个部分&#xff0c;效果显示和准备代码已给出&#xff0c;我们需要完成“完整代码”部分。 练习…

C#调用skiasharp操作并绘制图片

之前学习ViewFaceCore时采用Panel控件和GDI将图片及识别出的人脸方框和关键点绘制出来&#xff0c;本文将其修改为基于SKControl和SKCanvas实现相同的显示效果并支持保存为本地图片。   新建Winform项目&#xff0c;在Nuget包管理器中搜索并安装一下SkiaSharp和ViewFaceCore…

Ubuntu安装Neo4j

Ubuntu&#xff08;在线版&#xff09; 更新软件源 sudo apt-get update 添加Neo4j官方存储库 wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo deb https://debian.neo4j.com stable latest | su…

.NET操作 Access (MSAccess)

注意&#xff1a;新项目推荐 Sqlite &#xff0c;Access需要注意的东西太多了&#xff0c;比如OFFICE版本&#xff0c;是X86还是X64 连接字符串 ProviderMicrosoft.ACE.OleDB.15.0;Data Source"GetCurrentProjectPath"\\test.accdb//不同的office版本 连接字符串有…

Mellanox网卡打流命令ib_write_bw执行遇到Couldn‘t listen to port 18515原因与解决办法?

要点 要点&#xff1a; ib默认使用18515命令 相关命令&#xff1a; netstat -tuln | grep 18515 ib_write_bw --help |grep port# server ib_write_bw --ib-devmlx5_1 --port 88990 # client ib_write_bw --ib-devmlx5_0 1.1.1.1 --port88990现象&#xff1a; 根因&#xf…

Spring Boot的热部署工具“AND”Swagger测试工具

Spring Boot的热部署&Swagger测试页面的使用 热部署指的是在项目无需重启的情况下&#xff0c;只需要刷新页面&#xff0c;即可获得已经修改的样式或功能。要注意该工具一般用于开发环境&#xff0c;在生产环境中最好不要添加这个工具。 对于无需重启便可刷新这么方便的工…