当前位置: 首页 > news >正文

(自用)gtest单元测试

gtest是Google的一套用于编写C++测试的框架,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报告等等。

1.gtest优点

2.搭建测试框架

gtest下载地址: GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework

下载方法是:git clone GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework

安装方法是:

$ cd googletest

注意:如果在make 过程中报错,可在CMakeLists.txt 中增加如下行,再执行下面的命令:  SET(CMAKE_CXX_FLAGS "-std=c++11")  

$ cmake .    

$ make

然后在lib目录下会生成:libgmock.a libgmock_main.a libgtest.a libgtest_main.a

最后我们再sudo make install。

测试demo

目录结构:

要测试的两个函数如下:

simple1.cc

#include "sample1.h"// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n) {int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;
}// Returns true iff n is a prime number.
bool IsPrime(int n) {// Trivial case 1: small numbersif (n <= 1) return false;// Trivial case 2: even numbersif (n % 2 == 0) return n == 2;// Now, we have that n is odd and n >= 3.// Try to divide n by every odd number i, starting from 3for (int i = 3; ; i += 2) {// We only have to try i up to the square root of nif (i > n/i) break;// Now, we have i <= n/i < n.// If n is divisible by i, n is not prime.if (n % i == 0) return false;}// n has no integer factor in the range (1, n), and thus is prime.return true;
}

头文件sample.h

#ifndef GTEST_SAMPLES_SAMPLE1_H_
#define GTEST_SAMPLES_SAMPLE1_H_// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n);// Returns true iff n is a prime number.
bool IsPrime(int n);#endif 
编写测试类

1.包含头文件gtest/gtest.h、limits.h(最大int和最小int)

2.格式

TEST(测试套名,测试用例名)
{//EXPECT_XX}

一个测试套下可以有多个测试用例

eg:

simple_unittest.cc

#include <limits.h>//包含最大最小数
#include "sample1.h"
#include "gtest/gtest.h"//gtest头文件
namespace {TEST(FactorialTest, Negative) {// 测试名叫Negative,属于FactorialTest测试套// 测试用例EXPECT_EQ(1, Factorial(-5));//断言相等EXPECT_EQ(1, Factorial(-1));//前后顺序不影响EXPECT_GT(Factorial(-10), 0);//断言大于}TEST(FactorialTest, Zero) {EXPECT_EQ(1, Factorial(0));}TEST(FactorialTest, Positive) {EXPECT_EQ(1, Factorial(1));EXPECT_EQ(2, Factorial(2));EXPECT_EQ(6, Factorial(3));EXPECT_EQ(40320, Factorial(8));}// Tests IsPrime() 测试是否是素数TEST(IsPrimeTest, Negative) {//预测 true or falseEXPECT_FALSE(IsPrime(-1));EXPECT_FALSE(IsPrime(-2));EXPECT_FALSE(IsPrime(INT_MIN));}TEST(IsPrimeTest, Trivial) {EXPECT_FALSE(IsPrime(0));EXPECT_FALSE(IsPrime(1));EXPECT_TRUE(IsPrime(2));EXPECT_TRUE(IsPrime(3));}TEST(IsPrimeTest, Positive) {EXPECT_FALSE(IsPrime(4));EXPECT_TRUE(IsPrime(5));EXPECT_FALSE(IsPrime(6));EXPECT_TRUE(IsPrime(23));}
}  // namespace

进行测试
不带main

 实现测试的main函数,当然我们也可以不用写main函数,那就需要连接gtest_main.a这个库(编译时添加-lgtest_main选项)。比如这样子编译:

g++ sample1.cc sample1_unittest.cc -lgtest -std=c++14 -lgtest_main -lpthread -o test1

执行结果:

带main

固定写法,将main补充在最后面

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

完整测试.cc:

#include <limits.h>//包含最大最小数
#include "sample1.h"
#include "gtest/gtest.h"//gtest头文件
namespace {TEST(FactorialTest, Negative) {// 测试名叫Negative,属于FactorialTest测试套// 测试用例EXPECT_EQ(1, Factorial(-5));//断言相等EXPECT_EQ(1, Factorial(-1));//前后顺序不影响EXPECT_GT(Factorial(-10), 0);//断言大于}TEST(FactorialTest, Zero) {EXPECT_EQ(1, Factorial(0));}TEST(FactorialTest, Positive) {EXPECT_EQ(1, Factorial(1));EXPECT_EQ(2, Factorial(2));EXPECT_EQ(6, Factorial(3));EXPECT_EQ(40320, Factorial(8));}// Tests IsPrime() 测试是否是素数TEST(IsPrimeTest, Negative) {//预测 true or falseEXPECT_FALSE(IsPrime(-1));EXPECT_FALSE(IsPrime(-2));EXPECT_FALSE(IsPrime(INT_MIN));}TEST(IsPrimeTest, Trivial) {EXPECT_FALSE(IsPrime(0));EXPECT_FALSE(IsPrime(1));EXPECT_TRUE(IsPrime(2));EXPECT_TRUE(IsPrime(3));}TEST(IsPrimeTest, Positive) {EXPECT_FALSE(IsPrime(4));EXPECT_TRUE(IsPrime(5));EXPECT_FALSE(IsPrime(6));EXPECT_TRUE(IsPrime(23));}
}  // namespaceint main(int argc, char** argv)
{testing::InitGoogleTest(&argc,argv);return RUN_ALL_TESTS();
}

编译时去掉-lgtest_main选项:

相关文章:

  • Python爬虫-数据解析(先爬取整张页面再提取局部数据)
  • 在Ubuntu下安装samba实现和Windows系统文件共享
  • 第100+15步 ChatGPT学习:R实现Ababoost分类
  • 微信小程序开发跳转京东,淘宝小程序
  • Vue3打包发布,刷新出现的空白页面和错误
  • 盛夏来临,一文教你如何识别和应对急性胃肠炎→
  • Go语言---并发编程之channel(双channel,单channel)以及应用实例(生产者消费者、打印机模型)
  • Apache Spark分布式计算框架架构介绍
  • 从C向C++18——演讲比赛流程管理系统
  • Go语言入门之Map详解
  • 爬虫学习前记----Python
  • 辐射神经场算法——Instant-NGP / Mipi-NeRF 360 / 3D Gaussian Splatting
  • c语言数据结构--构造无向图(算法6.1),深度和广度遍历
  • day29--452. 用最少数量的箭引爆气球+435. 无重叠区间+763.划分字母区间
  • RABBITMQ的本地测试证书生成脚本
  • 分享的文章《人生如棋》
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 2017届校招提前批面试回顾
  • express.js的介绍及使用
  • gops —— Go 程序诊断分析工具
  • laravel with 查询列表限制条数
  • Vue官网教程学习过程中值得记录的一些事情
  • Vultr 教程目录
  • 不上全站https的网站你们就等着被恶心死吧
  • 高程读书笔记 第六章 面向对象程序设计
  • 前端性能优化——回流与重绘
  • 如何用vue打造一个移动端音乐播放器
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 一道面试题引发的“血案”
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云重庆大学大数据训练营落地分享
  • 关于Android全面屏虚拟导航栏的适配总结
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #Linux(帮助手册)
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2020)Java后端开发----(面试题和笔试题)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (55)MOS管专题--->(10)MOS管的封装
  • (Qt) 默认QtWidget应用包含什么?
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十八)Flink CEP 详解
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (转)大道至简,职场上做人做事做管理
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .htaccess配置常用技巧
  • .net core 依赖注入的基本用发
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /proc/stat文件详解(翻译)