[googletest] --- 简易使用教程

news2024/11/24 8:53:39

1 googletest下载/官方sample分析

1.1 googletest源码下载编译

源码下载编译

// 下载
git clone https://github.com/google/googletest
// 现在官方已经把 gtest 和 gmock 一起维护,所以这个 git 仓库还包含了 gmock。

// 编译、安装
cd googletest-main
mkdir build install
cd build
cmake -DCMAKE_INSTALL_PREFIX=../install
make -j
make install

编译设置
如果需要生成.so库,生成官方sample的二进制文件,需要对源码最外层的CMakeLists.txt进行修改
生成动态库或者静态库,需要修改BUILD_SHARED_LIBS
在这里插入图片描述
生成samples测试bin文件,需要修改gtest_build_samples在这里插入图片描述

将L20修改为ON之后,可以在build目录下看到googletest自带的sample都编译为了可执行文件。
在这里插入图片描述

1.2 googletest语法

TEST宏
TEST(test_case_name, test_name) 宏用于定义一个测试用例,其中test_case_name是测试用例的名称,test_name是测试的名称。例如:

TEST(MyTestSuite, MyTest) {
  // 测试代码
}

ASSERT宏
ASSERT_() 宏用于断言结果是否符合预期,其中可以是以下几种:
ASSERT_TRUE(condition):条件为真
ASSERT_FALSE(condition):条件为假
ASSERT_EQ(val1, val2):两个值相等
ASSERT_NE(val1, val2):两个值不相等
ASSERT_LT(val1, val2):第一个值小于第二个值
ASSERT_LE(val1, val2):第一个值小于等于第二个值
ASSERT_GT(val1, val2):第一个值大于第二个值
ASSERT_GE(val1, val2):第一个值大于等于第二个值
例如:

TEST(MyTestSuite, MyTest) {
  int a = 1;
  int b = 2;
  ASSERT_TRUE(a < b);
  ASSERT_EQ(a + b, 3);
}

如果断言失败,测试用例将会失败。

EXPECT宏
EXPECT_() 宏与ASSERT_()宏的作用相同,但是如果检查失败,不会终止测试用例的执行。例如:

TEST(MyTestSuite, MyTest) {
  int a = 1;
  int b = 2;
  EXPECT_TRUE(a < b);
  EXPECT_EQ(a + b, 3);
}

ASSERT宏和EXCEPT宏的区别:
ASSERT 不通过的时候会认为是一个 fatal 的错误,退出当前函数(只是函数)。而 EXPECT 失败的话会继续运行当前函数,所以对于函数内几个失败可以同时报告出来。通常我们用 EXPECT 级别的断言就好,除非你认为当前检查点失败后函数的后续检查没有意义。

SetUp和TearDown
SetUp() 和 TearDown() 函数可以在每个测试用例执行前和执行后分别调用,用于初始化和清理测试环境。例如:

class MyTestSuite : public ::testing::Test {
 protected:
  void SetUp() override {
    // 初始化代码
  }

  void TearDown() override {
    // 清理代码
  }
};

TEST_F(MyTestSuite, MyTest) {
  // 测试代码
}

参数化测试
参数化测试可以用于测试一组输入的不同情况下,程序的输出是否符合预期。例如:

class MyTestSuite : public ::testing::TestWithParam<int> {
};

TEST_P(MyTestSuite, MyTest) {
  int input = GetParam();
  // 测试代码
}

INSTANTIATE_TEST_SUITE_P(MyTestSuiteInstantiationName, MyTestSuite, ::testing::Values(1, 2, 3));

在这个例子中,MyTestSuite 继承自 TestWithParam,表示这是一个参数化测试。GetParam() 函数可以获取当前测试用例的参数值。INSTANTIATE_TEST_SUITE_P 宏用于实例化测试用例,其中第一个参数是实例化的名称,第二个参数是测试用例的名称,第三个参数是参数值列表。

预期异常
有时候需要测试程序在出现异常时的行为,可以使用 EXPECT_THROW() 和 ASSERT_THROW() 宏。例如:

TEST(MyTestSuite, MyTest) {
  std::vector<int> v;
  EXPECT_THROW(v.at(0), std::out_of_range);
}

在这个例子中,EXPECT_THROW() 宏表示期望在执行 v.at(0) 时抛出 std::out_of_range 异常。如果没有抛出异常,测试用例将失败。

1.3 官方sample分析

我们安装时下载的代码就包含了 10 个例子,可以直接在根目录下执行 make 并运行。进入 samples 文件夹,阅读每份功能代码和对应的测试文件,可以帮助我们较快入门。我们下面看一下简单的例子。

sample1

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

// Tests factorial of negative numbers.
TEST(FactorialTest, Negative) {
  // This test is named "Negative", and belongs to the "FactorialTest"
  // test case.
  EXPECT_EQ(1, Factorial(-5));
  EXPECT_EQ(1, Factorial(-1));
  EXPECT_GT(Factorial(-10), 0);
}

...

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

sample1 演示了简单测试用例的编写,主要使用了 TEST() 宏。
一个 test_case_name 对应一个函数的测试用例,test_name 可以对应这个测试用例下的某个场景的测试集。这两个名字可以任意取,但应该是有意义的.

sample1运行结果如下:
在这里插入图片描述

2 在自己的代码中使用gtest

上面已经说了如何将gtest编译成库,在自己项目中使用gtest时需要将install的头文件和库文件包含在记录的项目目录中。

项目目录如下:
在这里插入图片描述

// CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(GTEST_USAGE)
set(CMAKE_CXX_COMPILE_FLAGS "std=c++11")

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/install/include)
file(GLOB CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.c*)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/install/lib)
add_executable(GTEST_USAGE ${CPP_FILES})

target_link_libraries(GTEST_USAGE 
gtest
)
// main.cpp
#include <gtest/gtest.h>
#include<numeric>

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

这里我不写自己的代码,直接用官方的sample4充当测试代码
sample4.cc

// Copyright 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// A sample program demonstrating using Google C++ testing framework.

#include "sample4.h"

#include <stdio.h>

// Returns the current counter value, and increments it.
int Counter::Increment() { return counter_++; }

// Returns the current counter value, and decrements it.
// counter can not be less than 0, return 0 in this case
int Counter::Decrement() {
  if (counter_ == 0) {
    return counter_;
  } else {
    return counter_--;
  }
}

// Prints the current counter value to STDOUT.
void Counter::Print() const { printf("%d", counter_); }

sample4.h

// Copyright 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// A sample program demonstrating using Google C++ testing framework.
#ifndef GOOGLETEST_SAMPLES_SAMPLE4_H_
#define GOOGLETEST_SAMPLES_SAMPLE4_H_

// A simple monotonic counter.
class Counter {
 private:
  int counter_;

 public:
  // Creates a counter that starts at 0.
  Counter() : counter_(0) {}

  // Returns the current counter value, and increments it.
  int Increment();

  // Returns the current counter value, and decrements it.
  int Decrement();

  // Prints the current counter value to STDOUT.
  void Print() const;
};

#endif  // GOOGLETEST_SAMPLES_SAMPLE4_H_

sample4_unittest.cc

// Copyright 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "sample4.h"

#include "gtest/gtest.h"

namespace {
// Tests the Increment() method.

TEST(Counter, Increment) {
  Counter c;

  // Test that counter 0 returns 0
  EXPECT_EQ(0, c.Decrement());

  // EXPECT_EQ() evaluates its arguments exactly once, so they
  // can have side effects.

  EXPECT_EQ(0, c.Increment());
  EXPECT_EQ(1, c.Increment());
  EXPECT_EQ(2, c.Increment());

  EXPECT_EQ(3, c.Decrement());
}

}  // namespace

运行结果如下:
在这里插入图片描述

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

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

相关文章

【申请教程】ChatGPT访问互联网插件

https://openai.com/blog/chatgpt-plugins 大家好&#xff0c;我是章北海mlpy 申请ChatGPT插件很久了&#xff0c;一直没下文 最近看到两种套路&#xff0c;我早上试了一下&#xff0c;看能否快速成功吧。 方法一&#xff1a;用ChatGPT帮忙写申请文案 [外链图片转存失败,源…

大数据如何助力营销(2)用户画像

用户画像是指根据用户的数据&#xff0c;构建出用户的特征和兴趣&#xff0c;从而对用户进行分类和个性化的过程。用户画像可以帮助营销人员更有效地触达目标客户&#xff0c;提高营销效果和转化率。 用户画像的价值 用户画像的价值主要体现在以下几个方面&#xff1a; 提升用…

IP协议介绍

文章目录 一、IP协议的基本认识二、IP的协议头格式三、网段划分四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址 一、IP协议的基本认识 IP在网络分层中属于网络层协议&#xff0c;传输层协议里的TCP协议解决的是可靠性问题&#xff0c;网络层协议里的IP协议能…

VScode自动滚屏cin、input输入问题解决方法

文章目录 前言一、输出自动滚屏二、解决cin或input之类的输入问题总结 前言 VScode 是一个轻量的文本编辑器&#xff0c;微软出品。很多人把它作为主要开发工具写代码&#xff0c;因为它几乎是万能的&#xff0c;想要什么功能就装什么插件&#xff0c;可以适用于几乎任何编程语…

如何和AI聊天

AI产品工具目录&#xff1a;AI产品目录 Prompt 在和AI聊天时&#xff0c;你得表明你需要啥&#xff0c;并且描述的越精确&#xff0c;AI回答的就越贴近你的预期&#xff0c;简单的对话&#xff0c;可以自己尝试&#xff0c;但是如果想做应用级别的就得学习这种聊天技术&#…

Flask celery异步发送邮件

首先安装celery pip install celery安装redis 一、Redis for Windows下载 之前微软维护了一份Windows版本的Redis&#xff0c;但是版本停留在3.2&#xff0c;并且也关闭了项目更新渠道。这里我们使用另外一位大神提供的Windows Redis&#xff0c;更新及时&#xff0c;用户量也…

[VAE] Auto-Encoding Variational Bayes

直接看paper看得云里雾里&#xff0c;李沐视频一语道破天机&#xff08;建议从30min左右开始看GAN到Diffusion的串讲&#xff09;。VAE的核心思路就是下面&#xff1a; 做生成&#xff0c;其实就是从随机向量&#xff08;z&#xff09;到目标图像&#xff08;x&#xff09;的过…

研报精选230512

目录 【行业230512山西证券】有色金属行业周报&#xff1a;基本金属普跌&#xff0c;锂价持续回弹 【行业230512湘财证券】新材料行业周报&#xff1a;五一前后各板块震荡下行&#xff0c;节后稀土价格跌后企稳&#xff0c;锂源现止跌迹象 【行业230512山西证券】基础化工2022年…

obj导入unity顶点数量改变

obj文件&#xff0c;是个cube&#xff0c;里面有8个顶点12个面。 # 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware # 创建的文件:11.04.2023 13:05:22# # object Box001 #v -15.0000 -15.0000 15.0000 v -15.0000 -15.0000 -15.0000 v 15.0000 -15.0000 -15.0…

C高级-day(5)-(分支语句、循环结构、函数....)

题目一、 有m1.txt m2.txt m3.txt m4.txt&#xff0c;分别创建出对应的目录&#xff0c;m1 m2 m3 m4 并把文件移动到对应的目录下 #! /bin/bashtouch m1.txt m2.txt m3.txt m4.txt for i in seq 1 1 4 domkdir m$imv m$i.txt m$i done 题目二、 使用break关键字打印九九乘法…

BERT-pytorch源码分析

​学习bert可以下载一些数据集练练手&#xff0c;目前打算选择官网给出GLUE的数据集。 bert整体代码框架结构如下&#xff1a; 首先从main文件开始解读&#xff0c;打开__main__.py。这里面只有import导入语句和一个train函数。 train函数里面首先是对一些路径参数的填写&a…

unity用ComputeShader做模型流体喷涂喷绘工具

最近在研究喷涂喷绘项目&#xff0c;需要做大量纹理图形运算&#xff0c;因此更适合用GPU来处理&#xff0c;在unity中用ComputeShader完成像素运算&#xff0c;SurfaceShader完成纹理渲染。 实现思路&#xff1a; 1.用射线碰撞模型&#xff0c;得到碰撞纹理坐标brushX和brus…

PMP课堂模拟题目及解析(第8期)

71. 项目经理负责管理一个处于执行阶段的项目&#xff0c;并希望审查项目范围以进行成本结算&#xff0c;项目经理发现在工作分解结构&#xff08;WBS &#xff09;中遗漏了一项可交付成果。项目经理下一步应该怎么做&#xff1f; A. 询问干系人是否需要添加这些遗漏的可交付…

【18】SCI易中期刊推荐——计算机科学(中科院2区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

【LeetCode】209.长度最小的子数组

209. 长度最小的子数组 思路一&#xff1a;暴力解法 通过两个for循环&#xff0c;从头开始找符合条件的子序列。暴力解法无法通过本题&#xff0c;超出时间限制&#xff0c;所以仅供参考。 代码如下&#xff1a; 暴力解法1&#xff1a;下面的代码是通过申请一个新的数组&#x…

人脸检测和人体检测4:C++实现人脸检测和人体检测(含源码,可实时检测)

人脸检测和人体检测4&#xff1a;C实现人脸检测和人体检测(含源码&#xff0c;可实时检测) 目录 人脸检测和人体检测4&#xff1a;C实现人脸检测和人体检测(含源码&#xff0c;可实时检测) 1. 前言 2. 人脸检测和人体检测检测模型&#xff08;YOLOv5&#xff09; &#xf…

AI教父Geoffrey Hinton:AGI革命堪比车轮的发明

作者 | Yana Khare 译者 | 平川 来源 | AI前线 ID | ai-front AI 教父&#xff1a;Geoffrey Hinton Geoffrey Hinton 通常被认为是“人工智能教父”&#xff0c;他在机器学习广泛流行之前就一直是这个领域的开拓者。Hinton 对人工神经网络和机器学习算法的发展做出了重大的贡…

单链表OJ题:LeetCode--234.回文链表

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;今天给大家带来的是LeetCode中203题&#xff1a;移除链表元素 数据结构 &#xff1a;数据结构专栏 作 者 &#xff1a;stackY、 LeetCode&#xff1a;LeetCode刷题训练营 LeetCode--234.回文链表&#xff1a;https:…

【利用AI让知识体系化】3万多字让你我快速入门数据结构与算法

文章目录 第一章&#xff1a;介绍数据结构与算法1.1 数据结构的概念1.2 算法的概念1.3 数据结构与算法的关系1.4 为什么需要学习数据结构与算法 第二章&#xff1a;时间与空间复杂度2.1 什么是时间复杂度2.2 时间复杂度的算法分析2.3 什么是空间复杂度2.4 空间复杂度的算法分析…

Lombok工具 : 常用注解介绍 (全)

文章目录 介绍引入Maven依赖常用的注解 NoArgsConstructor/AllArgsConstructorRequiredArgsConstructorGetter/SetterToString/EqualsAndHashCodeDataBuilderAccessors 其他注解 SneakyThrowsValueCleanupNotNullSynchronizedLog、Log4j、Slf4j、Log4j2、CommonsLog、XSlf4j等…