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

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构,它仅仅是垃圾代码的到处移动” ——Corey Haines

目录

前言

什么是单元测试?

单元测试的组成

单元测试的命名

单元测试的独立性

Google Test 单元测试的环境配置与使用

1. Ubuntu下安装 Google Test

2. 编写测试代码

3. 编译和运行

4. 测试结果

结束语

相关阅读


总阅读时间约为 10~15分钟。

前言

本文将主要介绍单元测试的相关基础知识、安装并使用Google Test进行一个简单例子的单元测试。

什么是单元测试?

单元测试是一小段代码,在特定上下文环境中,单元测试能够验证程序的一个“单元”是否按预期工作,确保单个函数或方法在不同输入下都能按预期产生正确的输出。

在大多数情况下,这个“单元”是函数、方法或类的某个方法。如果单元测试覆盖率非常高,就可以在很短的时间内,检查正在开发的系统的所有组件是否运行正常。

单元测试一般由开发人员自行完成。如果条件允许,单元测试代码的开发应与程序代码的开发同步进行

单元测试的组成

测试用例:每个测试通常由输入、预期输出和执行步骤组成。测试用例要覆盖不同的输入场景,包含正常情况和边界情况。

测试框架:单元测试通常依赖于测试框架,框架提供了组织测试、执行测试和生成报告的工具。常见的 C++ 测试框架包括 Google Test、Catch2、Boost.Test 等。

断言:断言是测试框架提供的函数,用于验证代码的输出是否与预期结果一致。如EXPECT_EQ() 等。

在 Google Test 中,断言分为两种:

非致命断言(如 EXPECT_EQ):即使断言失败,测试仍会继续运行。

致命断言(如 ASSERT_EQ):断言失败会终止当前测试。

单元测试的命名

一个好的单元测试方法命名应该能够简洁、明确地表述它正在测试的内容。通常的命名格式是:

<功能/模块>_<测试条件>_<期望结果>()

·  功能或模块:测试的功能或模块,通常是类名或者方法名。例如 Add、GetUserName。

·  测试条件:描述特定条件或输入数据。例如 TwoPositiveNumbers、Zero、WhenUserIdIsValid。

·  期望结果:描述你期望测试的输出或行为。例如 ReturnsCorrectSum、ReturnsZero、ReturnsCorrectName。

单元测试的独立性

每个单元测试之间应该是独立的,不要编写“一个单元测试的输出是另一个测试单元的输入”的单元测试

Google Test 单元测试的环境配置与使用

1. Ubuntu下安装 Google Test

使用包管理工具安装 Google Test(如 libgtest-dev)。

编译 Google Test 源码生成静态库:

sudo apt install libgtest-dev cmake
cd /usr/src/googletest
sudo cmake .
sudo make
sudo cp lib/*.a /usr/lib

2. 编写测试代码

创建一个 .cpp 文件(如 test_add.cpp),编写测试代码。

示例测试代码:

#include <gtest/gtest.h>int add(int a, int b) {return a + b;
}// 测试套件:AdditionTests
TEST(AdditionTests, HandlesPositiveNumbers) {EXPECT_EQ(add(2, 3), 5);
}TEST(AdditionTests, HandlesNegativeNumbers) {EXPECT_EQ(add(-2, -3), -5);
}TEST(AdditionTests, HandlesMixedNumbers) {EXPECT_EQ(add(-2, 3), 1);
}TEST(AdditionTests, HandlesZero) {EXPECT_EQ(add(0, 5), 5);
}

3. 编译和运行

使用 g++ 编译测试程序:

g++ -std=c++17 -isystem /usr/include/gtest -pthread test_add.cpp -lgtest -lgtest_main -o test_add

运行生成的可执行文件:

./test_add

4. 测试结果

Running main() from ./googletest/src/gtest_main.cc
[==========] Running 4 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 4 tests from AdditionTests
[ RUN      ] AdditionTests.HandlesPositiveNumbers
[       OK ] AdditionTests.HandlesPositiveNumbers (0 ms)
[ RUN      ] AdditionTests.HandlesNegativeNumbers
[       OK ] AdditionTests.HandlesNegativeNumbers (0 ms)
[ RUN      ] AdditionTests.HandlesMixedNumbers
[       OK ] AdditionTests.HandlesMixedNumbers (0 ms)
[ RUN      ] AdditionTests.HandlesZero
[       OK ] AdditionTests.HandlesZero (0 ms)
[----------] 4 tests from AdditionTests (0 ms total)[----------] Global test environment tear-down
[==========] 4 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 4 tests.

结束语

通过本文的学习,我们了解了单元测试的基本概念及其重要性,尤其是如何使用 Google Test 在 C++ 中进行高效的单元测试。掌握单元测试的技巧,可以帮助开发者提高代码的可靠性与可维护性。

相关阅读

  1. Four-Second Test Runs – Corey Haines
  2. GoogleTest Primer | GoogleTest

相关文章:

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构&#xff0c;它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试&#xff1f; 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…...

PyCharm+Selenium+Pytest配置小记

1、下载ChromeDriver&#xff1a; Chrome130以后的Driver下载&#xff1a; Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ &#xff08;1&#xff09;查看自己Crome浏览器的版本&#xff1a;设置-->关于 Chrome&#xff1b; &…...

摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/04

Learning Roadmap&#xff1a; Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem&#xff08;摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客&#xff09;UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Remote Communication Kit

1.问题描述&#xff1a; DynamicDnsRule有没有示例&#xff1f;这个地址是怎么解析出来 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/remote-communication-rcp-0000001770911890#section8160554134811 解决方案&#xff1a; ‘DynamicDnsRule’&a…...

【日常记录-Mybatis】PageHelper导致语句截断

1. 简介 PageHelper是Mybatis-Plus中的一个插件&#xff0c;主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象&#xff0c;并保存到本地线程ThreadLocal中&#xff0c;接下来&#xff0c;PageHelper会进入Mybatis的拦截器环节&#xff0c;…...

随时随地掌控数据:如何使用手机APP远程访问飞牛云NAS

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?

类加载器分类 大家好&#xff0c;我是码哥&#xff0c;可以叫我靓仔&#xff0c;《Redis 高手心法》畅销书作者。 先回顾下&#xff0c;在 Java 中&#xff0c;类的初始化分为几个阶段: 加载、链接&#xff08;包括验证、准备和解析&#xff09;和 初始化。 而 类加载器&#x…...

从基态到激发态再到里德伯态的双光子激发过程

铯原子&#xff08;Cs&#xff09;从基态6S1/2到激发态6P3/2再到里德伯态44D5/2的双光子激发过程&#xff0c; 并通过数值计算和图形化展示来研究不同失谐条件下的拉比频率、AC Stark位移差以及散射概率的变化 结果显示&#xff0c;在给定的实验参数下&#xff0c;拉比频率较低…...

Clickhouse 外部存储引擎

文章目录 外部存储引擎分类MySQL引擎PostgreSQL引擎MongoDB引擎JDBC引擎ODBC引擎Kafka引擎RabbitMQ引擎File引擎URL引擎HDFS引擎 外部存储引擎分类 引擎类型描述特点MySQL从 MySQL 数据库中读取数据用于与 MySQL 数据库共享数据&#xff0c;支持读取 MySQL 表中的数据 支持 SQ…...

eclipse怎么配置jdk路径?

在Eclipse中配置JDK路径是一个简单的步骤&#xff0c;以下是配置JDK路径的步骤&#xff1a; 打开Eclipse&#xff1a;启动Eclipse IDE。 访问首选项&#xff1a; 在Eclipse的菜单栏中&#xff0c;选择 Window > Preferences&#xff08;对于Mac OS X用户&#xff0c;选择 E…...

【前端】JavaScript 中的创建对象模式要点

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;对象属性值中的引号规则&#x1f4af;对象属性换行与尾随逗号的使用&#x1f4af;工厂模式&#xff1a;灵活高效的对象创建&#x1f4af;自定义构造函数&#xff1a;通过…...

GWAS分析先做后学

大家好&#xff0c;我是邓飞。 GWAS分析是生物信息和统计学的交叉学科&#xff0c;上可以学习编程&#xff0c;下可以学习统计。对于Linux系统&#xff0c;R语言&#xff0c;作图&#xff0c;统计学&#xff0c;机器学习等方向&#xff0c;都是一个极好的入门项目。生物信息如…...

【系统设计】高可用之缓存基础

缓存的缘起 使用缓存的主要原因包括提高系统性能、降低数据库负载、提升用户体验和保证系统可用性。‌ 在计算机体系结构中&#xff0c;由于处理器和存储器的处理时间不匹配&#xff0c;在处理器和一个较大较慢的设备之间插入一个更小更快的存储设备&#xff08;如高速缓存&a…...

《Java核心技术I》volatile字段

volatile字段 有多处理器的计算机能够暂时在寄存器或本地内存缓存中保存内存值&#xff0c;其结果是&#xff0c;运行在不同处理器上的线程可能看到同一个内存位置上有不同的值。编译器可以改变指令执行的顺序以使吞吐量更大化&#xff0c;编译器不会选择可能改变代码语义的顺…...

2024运维故障记 | 12/2 网易云音乐崩了

#运维故障记# 前两天看到网易云音乐崩了的新闻&#xff0c;回想了一下&#xff0c;今年从网易云音乐到支付宝、还有微软&#xff0c;近期就发生了好几起运维届的故障。 今年来不及计数了&#xff0c;先做个记录。 明年看看运维届的大故障会发生多少&#xff0c;什么原因&…...

架构设计读后——微服务

1 微服务历史 2005年&#xff1a;Dr. Peter Rodgers提出"Micro-Web-Services"概念2011年&#xff1a;一个软件架构工作组使用"microservice"来描述一中架构模式2012年&#xff1b;这个工作组正式使用"microservice"来代表这个架构2012年&#x…...

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …...

聊聊前端工程化

深度解析前端工程化 ​ 近年来&#xff0c;随着前端技术的快速迭代和项目复杂度的增加&#xff0c;前端开发已经从简单的页面搭建演变为专业的工程化体系。前端工程化通过工具链、标准化和流程化手段&#xff0c;不仅提高了开发效率&#xff0c;也大幅提升了项目的可维护性和协…...

“放弃Redis Desktop Manager使用Redis Insight”:日常使用教程(Redis可视化工具)

文章目录 更新Redis Insight连接页面基础解释自动更新key汉化暂时没有找到方法&#xff0c; Redis Desktop Manager在连接上右键在数据库上右键在key上右键1、添加连接2、key过期时间 参考文章 更新 (TωT)&#xff89;~~~ β&#xff59;ё β&#xff59;ё~ 现在在维护另一…...

mmdection配置-yolo转coco

基础配置看我的mmsegmentation。 也可以参考b站 &#xff1a;https://www.bilibili.com/video/BV1xA4m1c7H8/?vd_source701421543dabde010814d3f9ea6917f6#reply248829735200 这里面最大的坑就是配置coco数据集。我一般是用yolo&#xff0c;这个yolo转coco格式很难搞定&#…...

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置…...

力扣67. 二进制求和

给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a "11", b "1" 输出&#xff1a;"100" 示例 2&#xff1a; 输入&#xff1a;a "1010", b "1011" 输出&#…...

网络安全中的 SOC 是什么?

当今世界&#xff0c;网络威胁日益增多&#xff0c;确保网络安全已成为各种规模企业的首要任务。网络安全讨论中经常出现的一个术语是 SOC&#xff0c;即安全运营中心的缩写。但网络安全中的 SOC 是什么呢&#xff1f; SOC在防御网络威胁、管理安全事件和全天候监控系统方面发…...

16、鸿蒙学习——Visibility与(if...else)该如何选择

在鸿蒙中我们如果要控制一个组件的显示与隐藏可以设置组件的Visibility属性&#xff0c;也可使用&#xff08;if...else&#xff09;条件控制&#xff0c;具体我们该选择哪个&#xff1f;二者有什么区别呢&#xff1f; 1、Visibility 名称描述Hidden隐藏&#xff0c;但参与布局…...

PH热榜 | 2024-12-05

1. Oopsie 标语&#xff1a;用AI和会话回放调试Flutter和React Native应用 介绍&#xff1a;Zipy推出的Oopsie是一款你唯一需要的AI赋能移动端调试工具&#xff0c;它能提供▶️会话回放、&#x1f916;错误监控、&#x1f4a1;AI生成的概要分析&#xff0c;以及&#x1f525…...

Qt Chart 模块化封装曲线图

一 版本说明 二 完成示例 此文章包含:曲线轴设置,曲线切换,单条曲线显示,坐标轴。。。 三 曲线图UI创建 在UI界面拖放一个QWidget,然后在 Widget里面放一个 graphicsView 四 代码介绍 1 头文件 #include <QString> #include <QTimer> #include <QMessa…...

【AI系统】MobileFormer

MobileFormer 在本文中&#xff0c;将介绍一种新的网络-MobileFormer&#xff0c;它实现了 Transformer 全局特征与 CNN 局部特征的融合&#xff0c;在较低的成本内&#xff0c;创造一个高效的网络。通过本节&#xff0c;让大家去了解如何将 CNN 与 Transformer 更好的结合起来…...

python数据分析之爬虫基础:解析

目录 1、xpath 1.1、xpath的安装以及lxml的安装 1.2、xpath的基本使用 1.3、xpath基本语法 2、JsonPath 2.1、jsonpath的安装 2.2、jsonpath的使用 2.3、jsonpath的基础语法 3、BeautifulSoup 3.1、bs4安装及创建 3.2、beautifulsoup的使用 3.3、beautifulsoup基本语…...

uniapp中导入uview或者uview plus

关于SCSS uview-plus依赖SCSS&#xff0c;您必须要安装此插件&#xff0c;否则无法正常运行。 如果您的项目是由HBuilder X创建的&#xff0c;相信已经安装scss插件&#xff0c;如果没有&#xff0c;请在HX菜单的 工具->插件安装中找到"scss/sass编译"插件进行安…...

【LeetCode】122.买卖股票的最佳时机II

文章目录 题目链接&#xff1a;题目描述&#xff1a;解题思路一&#xff08;贪心算法&#xff09;&#xff1a;解体思路二&#xff08;动态规划&#xff09;&#xff1a; 题目链接&#xff1a; 122.买卖股票的最佳时机II 题目描述&#xff1a; 解题思路一&#xff08;贪心算法…...