Google Test的使用

news2024/9/17 7:43:13

Google Test支持的操作系统包含下面这些:

1、Linux
2、Mac OS X
3、Windows
4、Cygwin
5、MinGW
6、Windows Mobile
7、Symbian

一、google test的基本使用步骤

1、包含gtest/gtest.h头文件
2、使用TEST()宏定义测试case
3、在测试体中使用gooletest断言进行值检查
4、使用RUN_ALL_TESTS()宏运行测试

二、TEST()宏定义

TEST(TestCase,TestName)
{
    //测试代码
}

其中TestCase为测试用例的名称,用于将相关的测试用例分组在一起,以便于在测试结果中更好识别和分类。TestName为具体测试的名称,一般描述测试的目的。

例如:

#include <gtest/gtest.h>

int add(int a,int b)
{
    return a+b;
}

TEST(testCase2,test_GT)
{
    EXPECT_GT(add(2,3),3);
}

TEST(testCase2,test_GE)
{
    EXPECT_GE(add(2,3),5);
}

TEST(testCase1,test_EQ)
{
    EXPECT_EQ(add(2,3),5);
}

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

测试结果:
在这里插入图片描述

三、断言

1、基本断言–测试失败时程序会继续执行

EXPECT_EQ(val1, val2):检查 val1 == val2

EXPECT_NE(val1, val2):检查 val1 != val2

EXPECT_LT(val1, val2):检查 val1 < val2

EXPECT_LE(val1, val2):检查 val1 <= val2

EXPECT_GT(val1, val2):检查 val1 > val2

EXPECT_GE(val1, val2):检查 val1 >= val2

2、致命断言–测试失败时程序会立即终止

ASSERT_EQ(val1, val2):检查 val1 == val2

ASSERT_NE(val1, val2):检查 val1 != val2

ASSERT_LT(val1, val2):检查 val1 < val2

ASSERT_LE(val1, val2):检查 val1 <= val2

ASSERT_GT(val1, val2):检查 val1 > val2

ASSERT_GE(val1, val2):检查 val1 >= val2

3、字符串比较断言

EXPECT_STREQ(str1,str2) : 检查str1和str2是相同的字符串

EXPECT_STRNE(str1,str2) : 检查str1和str2是不相同的字符串

EXPECT_STRCASEEQ(str1,str2) : 检查str1和str2是相同的字符串,忽略大小写

EXPECT_STRCASENE(str1,str2) : 检查str1和str2是不相同的字符串,忽略大小写

4、浮点数比较的断言

EXPECT_FLOAT_EQ(val1, val2):检查 val1 和 val2 具有相同的浮点值

EXPECT_DOUBLE_EQ(val1, val2):检查 val1 和 val2 具有相同的双精度值

EXPECT_NEAR(val1, val2, abs_error):检查 val1 和 val2 之间的差值在 abs_error 范围内
//对EXPECE_NEAR的解释
TEST(TestFloatCase, float_case01) {
    float a = 2.34732, b = 2.34732;
    double c = 6.75433, d = 9.634638;

    EXPECT_NEAR(a, c, 5);    // success --> [a - c =  -4.40701 < 5]
    EXPECT_NEAR(c, a, -5);   // fail    --> [c - a] = 4.40701  > -5]
}

5、布尔值的断言

EXPECT_TRUE(condition):检查 condition 为真

EXPECT_FALSE(condition):检查 condition 为假

生成覆盖率报告

例子:

#include <gtest/gtest.h>

int add(int a,int b)
{
    return a+b;
}

int sum(int a,int b)
{
        if(a > b){
           return a - b;
        }else{
           return a * b;
        }

}
TEST(testCase2,test_GT)
{
    EXPECT_GT(add(2,3),3);
}

TEST(testCase1,test_GT)
{
    EXPECT_EQ(add(2,3),3);
}

TEST(testCase2,test_GE)
{
    EXPECT_GE(add(2,3),5);
}

TEST(testCase1,test_EQ)
{
    EXPECT_EQ(sum(2,3),6);
}

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

测试结果
在这里插入图片描述

locv

1、在编译过程中加入 -coverage -lgcov

g++ gtest.cpp -std=c++11   -lgtest -lpthread -coverage -lgcov   -o exampleTest

2、执行测试

./exampleTest

3、搜索测试覆盖率数据

Lcov -d . -c -o all.info

4、生成报告

Genhtml -o coverage all.info

当前目录下会生成一个coverage文件夹,里面包含一个index.html报告,通过浏览器打开就可以
在这里插入图片描述
通过浏览器打开
在这里插入图片描述
在这里插入图片描述
语句覆盖率(Lines) 函数覆盖率(Functions)分支覆盖率(Branches)

测试用例覆盖率 = (已执行的测试用例数 / 应执行的测试用例总数) * 100%

gcov

要通过gcov生成代码覆盖率。需要在编译时,增加参数 -coverage -lgcov:

g++ gtest.cpp -std=c++11   -lgtest -lpthread -coverage -lgcov   -o exampleTest

此处的编译结果除了得到可执行文件exampleTest,还会得到一个文件gtest.gcno,该文件包含了代码与行号的信息,在生成覆盖率时会需要这个文件。
在这里插入图片描述
执行exampleTest时,还会得到每个源码文件对应的gcda后缀的文件。由gtest.gcda 和 gtest.gcno这两个文件,便可以得到代码的覆盖率结果了。
在这里插入图片描述
通gcov指定源文件名称就可以得到覆盖率报告结果的文件,后缀.gcov

gcov gtest

在这里插入图片描述

cat gtest.cpp.gcov


        -:    0:Source:gtest.cpp
        -:    0:Graph:gtest.gcno
        -:    0:Data:gtest.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <gtest/gtest.h>
        -:    2: 
        3:    3:int add(int a,int b)
        -:    4:{
        3:    5:    return a+b;
        -:    6:}
        -:    7:
        1:    8:int sum(int a,int b)
        -:    9:{
        1:   10:        if(a > b){
    #####:   11:           return a - b;
        -:   12:        }else{
        1:   13:           return a * b;
        -:   14:        }
        -:   15:
        -:   16:}
        5:   17:TEST(testCase2,test_GT)
        -:   18:{
        1:   19:    EXPECT_GT(add(2,3),3);
        1:   20:}
        -:   21:
        5:   22:TEST(testCase1,test_GT)
        -:   23:{
        1:   24:    EXPECT_EQ(add(2,3),3);
        1:   25:}
        -:   26:
        5:   27:TEST(testCase2,test_GE)
        -:   28:{
        1:   29:    EXPECT_GE(add(2,3),5);
        1:   30:}
        -:   31:
        5:   32:TEST(testCase1,test_EQ)
        -:   33:{
        1:   34:    EXPECT_EQ(sum(2,3),6);
        1:   35:}
        -:   36:
        1:   37:int main(int argc, char **argv) {
        1:   38:    ::testing::InitGoogleTest(&argc, argv);
        1:   39:    return RUN_ALL_TESTS();
        3:   40:}
  • -:表示该行代码被覆盖了
  • 整数:表示被执行的次数
  • #####:表示该行没有被覆盖

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

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

相关文章

Java从入门到精通(十四) ~ 多线程

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 一、多线程是什么&#xff1f; Java中的多线程 二、使用步骤 1.创建方式 1.1 Thread 线程 1.2 Runnable 任务 1.…

视创云展:重塑线上会议体验,六大核心引领数字空间新纪元

视创云展以其革命性的“数字活动”解决方案为核心&#xff0c;精心构建了一个超越想象的未来数字世界。通过整合六大前沿技术模块&#xff0c;它不仅为参会者打造了一个身临其境的线上会议环境&#xff0c;更让每一位参与者都能跨越物理界限&#xff0c;深刻感受会议的每一个瞬…

2024经济师考试报名『注册流程』图解!

⏰报名时间&#xff1a;8月12日—9月11日 ☑️报名注册流程 1、经济师考试报名注册网站&#xff1a;中国人事考试网. 2、点击考生登录栏目中的【新用户注册】按钮&#xff0c;进行注册。 3、进入用户注册界面&#xff0c;填写注册信息。 4、填写完毕确认无误后点击【提交】&…

CMS61850客户端

近一年都比较忙&#xff0c;很久没有更新文档了。这次抽了点时间&#xff0c;把CMS61850的客户端再补上。方便大家进一步的学习。当然61850相关的文档已经写的快吐了。不出意外&#xff0c;这应该是最后一篇关于61850的文章了。 本次提供的demo&#xff0c;可直接在windows上运…

【React】WeChat微信网站应用登录之wxLogin.js

以下基于wxLogin.js在React应用中使用案例 实验环境 antd&#xff1a;^5.14.1next&#xff1a;14.1.0react&#xff1a;^18 组件调用示例 "use client";import { useEffect, useState } from "react"; import { WechatChannel } from "./channel&qu…

【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models

1 引言 现有3D生成模型&#xff1a; 3D点云&#xff1a;大量离散的3D点组成的数据表示形式&#xff1b; 多边形网格&#xff1a;一系列相连的多边形组成的3D模型&#xff1b; 水平集场&#xff1a;使用数值函数来表示物体的边界&#xff0c;并根据函数值的正负来确定物体内部…

示波器显示屏5个名词解释(峰峰值、平均值、频率、占空率、上升时间)

一般在使用示波器时&#xff0c;需要找到示波器测量的一些数据&#xff0c;包括峰峰值、频率等&#xff0c;但所显示出的所有名词可能不是很能理解&#xff0c;小编今天就具体介绍一下。下图是一般我们调节过后的示波器显示屏的数据显示&#xff1a; 1、峰-峰值 &#xff08;Pe…

Clickhouse 生产集群部署(Centos 环境)

文章目录 机器环境配置安装 JDK 8安装 zookeeperClickhouse 集群安装rpm 包离线安装修改全局配置zookeeper配置Shard和Replica设置image.png添加macros配置启动 clickhouse启动 10.82.46.135 clickhouse server启动 10.82.46.163 clickhouse server启动 10.82.46.218 clickhous…

Python中的类型注解和静态类型检查使用详解

概要 Python作为一种动态类型语言,其灵活性和易用性使其广受欢迎。然而,动态类型也带来了一些问题,如代码可读性差和运行时错误等。为了提高代码质量和可维护性,Python从3.5版本开始引入了类型注解(Type Hints),并且借助第三方工具可以实现静态类型检查。本文将详细介绍…

熊猫乳品再创新高:超高温灭菌稀奶油,驱动餐饮品质升级

随着餐饮行业的蓬勃发展&#xff0c;乳制品在餐饮端的应用日益广泛且需求多样化。中华老字号品牌企业熊猫乳品&#xff0c;在近期推出了专为餐饮定制的高品质产品-熊猫乳品超高温灭菌稀奶油&#xff0c;凭借其卓越性能&#xff0c;在多项测试中脱颖而出&#xff0c;成为餐饮制作…

Docker入门指南:基础命令、操作容器与镜像管理,附存储、网络及Compose应用

Docker命令 下载镜像 命令命令示例docker search 镜像名检索镜像docker search nginxdocker pull 镜像名下载镜像docker pull nginxdocker images / docker image ls查看镜像列表/docker rmi 镜像名/IMAGE ID删除指定镜像docker rmi nginx / docker rmi e784f4560448 镜像名&…

【计算机网络】TCP和UDP的封装以及案例

TCP和UDP的封装以及案例 背景知识TCP实现UDP实现封装Network用NetWork再次实现TCP和UDP小知识点 背景知识 TCP&#xff1a;传输控制协议&#xff08;Transmission Control Protocol&#xff09; UDP&#xff1a;用户数据报协议 &#xff08;User Datagram Protocol&#xff09…

二叉树--堆(上卷)

二叉树–堆&#xff08;上卷&#xff09; 树 树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽…

重新定义高性能轻薄本!华硕灵耀16 Air评测:锐龙AI 9 HX 370当今最优秀移动处理器...

一、前言&#xff1a;制程工艺不变 IPC性能暴涨20%的Zen 5架构 这十年来AMD的CPU给我们带来了一次又一次的惊喜&#xff01; 今天上市AI PC所搭载的锐龙AI 300系列处理器&#xff0c;与上代的锐龙8000系列移动处理器一样&#xff0c;都是采用了台积电4nm先进工艺。 但如标题所言…

什么是杀猪盘?

GPT-4o (OpenAI) "杀猪盘"是一种常见的网络诈骗形式&#xff0c;也被称为“爱情投资诈骗”或“婚恋诈骗”。这种骗局通常有以下几个关键步骤&#xff1a; 1. **接触和交流**&#xff1a;诈骗者在交友平台或社交媒体上创建虚假的个人资料&#xff0c;吸引受害者&…

Sentinel 核心概念和工作流程详解

前言&#xff1a; 上一篇文章中&#xff0c;我们对 Sentinel 有了基本认知&#xff0c;知道其是 Alibaba 开源的一个服务稳定性组件&#xff0c;我们从 Sentinel 控制台认识了 Sentinel 的流控、降级、热点、授权规则&#xff0c;本篇我们将从核心概念和工作流程方面继续分析 …

词的向量化和文本向量化

词的向量化和文本向量化 向量化one-hot编码提前准备词表不提前准备词表one-hot缺点 词向量简介词向量的定义和目标word embedding和word vector的区别onehot编码与词向量关系构建 训练方式1&#xff08;基于语言模型&#xff09;训练方式2&#xff08;基于窗口&#xff09;CBOW…

兴业法拍网周报|7月25日起,四大商业银行下调人民币存款利率

黄金地段&#xff1a;圣世一品潜藏团结湖公园对面&#xff0c;居身CBD复合都会核心区&#xff0c;咫尺央视新址&#xff0c;紧邻京广中心&#xff0c;毗邻国贸、嘉里中心、银泰中心、财富中心。 居住舒适&#xff1a;社区是2010年建成的新商品房社区&#xff0c;建筑风格现代简…

数据安全系统的定义与重要性

数据安全系统是指为数据处理系统建立和采用的技术和管理的安全保护机制&#xff0c;旨在保护计算机硬件、软件和数据不因偶然和恶意的原因遭到破坏、更改和泄露。数据安全系统在现代信息化社会中扮演着至关重要的角色&#xff0c;它确保了数据的完整性、可用性和保密性。以下是…

ShardingSphere实战(1)- 分库分表基础知识

一、为什么要分库分表 分库分表是一种数据库优化策略&#xff0c;主要用于解决大型应用或高并发场景下数据库性能瓶颈的问题。具体来说&#xff0c;分库分表可以带来以下好处&#xff1a; 提高性能&#xff1a; 减少单个数据库实例的负载&#xff0c;避免单点性能瓶颈。当数据…