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++ 中进行高效的单元测试。掌握单元测试的技巧,可以帮助开发者提高代码的可靠性与可维护性。
相关阅读
- Four-Second Test Runs – Corey Haines
- GoogleTest Primer | GoogleTest
相关文章:
C++小碗菜之二:软件单元测试
“没有测试的代码重构不能称之为重构,它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试? 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…...
PyCharm+Selenium+Pytest配置小记
1、下载ChromeDriver: Chrome130以后的Driver下载: Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ (1)查看自己Crome浏览器的版本:设置-->关于 Chrome; &…...
摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/04
Learning Roadmap: Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem(摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客)UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Remote Communication Kit
1.问题描述: DynamicDnsRule有没有示例?这个地址是怎么解析出来 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/remote-communication-rcp-0000001770911890#section8160554134811 解决方案: ‘DynamicDnsRule’&a…...
【日常记录-Mybatis】PageHelper导致语句截断
1. 简介 PageHelper是Mybatis-Plus中的一个插件,主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象,并保存到本地线程ThreadLocal中,接下来,PageHelper会进入Mybatis的拦截器环节,…...
随时随地掌控数据:如何使用手机APP远程访问飞牛云NAS
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?
类加载器分类 大家好,我是码哥,可以叫我靓仔,《Redis 高手心法》畅销书作者。 先回顾下,在 Java 中,类的初始化分为几个阶段: 加载、链接(包括验证、准备和解析)和 初始化。 而 类加载器&#x…...
从基态到激发态再到里德伯态的双光子激发过程
铯原子(Cs)从基态6S1/2到激发态6P3/2再到里德伯态44D5/2的双光子激发过程, 并通过数值计算和图形化展示来研究不同失谐条件下的拉比频率、AC Stark位移差以及散射概率的变化 结果显示,在给定的实验参数下,拉比频率较低…...
Clickhouse 外部存储引擎
文章目录 外部存储引擎分类MySQL引擎PostgreSQL引擎MongoDB引擎JDBC引擎ODBC引擎Kafka引擎RabbitMQ引擎File引擎URL引擎HDFS引擎 外部存储引擎分类 引擎类型描述特点MySQL从 MySQL 数据库中读取数据用于与 MySQL 数据库共享数据,支持读取 MySQL 表中的数据 支持 SQ…...
eclipse怎么配置jdk路径?
在Eclipse中配置JDK路径是一个简单的步骤,以下是配置JDK路径的步骤: 打开Eclipse:启动Eclipse IDE。 访问首选项: 在Eclipse的菜单栏中,选择 Window > Preferences(对于Mac OS X用户,选择 E…...
【前端】JavaScript 中的创建对象模式要点
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯对象属性值中的引号规则💯对象属性换行与尾随逗号的使用💯工厂模式:灵活高效的对象创建💯自定义构造函数:通过…...
GWAS分析先做后学
大家好,我是邓飞。 GWAS分析是生物信息和统计学的交叉学科,上可以学习编程,下可以学习统计。对于Linux系统,R语言,作图,统计学,机器学习等方向,都是一个极好的入门项目。生物信息如…...
【系统设计】高可用之缓存基础
缓存的缘起 使用缓存的主要原因包括提高系统性能、降低数据库负载、提升用户体验和保证系统可用性。 在计算机体系结构中,由于处理器和存储器的处理时间不匹配,在处理器和一个较大较慢的设备之间插入一个更小更快的存储设备(如高速缓存&a…...
《Java核心技术I》volatile字段
volatile字段 有多处理器的计算机能够暂时在寄存器或本地内存缓存中保存内存值,其结果是,运行在不同处理器上的线程可能看到同一个内存位置上有不同的值。编译器可以改变指令执行的顺序以使吞吐量更大化,编译器不会选择可能改变代码语义的顺…...
2024运维故障记 | 12/2 网易云音乐崩了
#运维故障记# 前两天看到网易云音乐崩了的新闻,回想了一下,今年从网易云音乐到支付宝、还有微软,近期就发生了好几起运维届的故障。 今年来不及计数了,先做个记录。 明年看看运维届的大故障会发生多少,什么原因&…...
架构设计读后——微服务
1 微服务历史 2005年:Dr. Peter Rodgers提出"Micro-Web-Services"概念2011年:一个软件架构工作组使用"microservice"来描述一中架构模式2012年;这个工作组正式使用"microservice"来代表这个架构2012年&#x…...
软考高级架构-9.4.4-双机热备技术 与 服务器集群技术
一、双机热备 1、特点: 软硬件结合:系统由两台服务器(主机和备机)、一个共享存储(通常为磁盘阵列柜)、以及双机热备软件(提供心跳检测、故障转移和资源管理功能的核心软件)组成。 …...
聊聊前端工程化
深度解析前端工程化 近年来,随着前端技术的快速迭代和项目复杂度的增加,前端开发已经从简单的页面搭建演变为专业的工程化体系。前端工程化通过工具链、标准化和流程化手段,不仅提高了开发效率,也大幅提升了项目的可维护性和协…...
“放弃Redis Desktop Manager使用Redis Insight”:日常使用教程(Redis可视化工具)
文章目录 更新Redis Insight连接页面基础解释自动更新key汉化暂时没有找到方法, Redis Desktop Manager在连接上右键在数据库上右键在key上右键1、添加连接2、key过期时间 参考文章 更新 (TωT)ノ~~~ βyё βyё~ 现在在维护另一…...
mmdection配置-yolo转coco
基础配置看我的mmsegmentation。 也可以参考b站 :https://www.bilibili.com/video/BV1xA4m1c7H8/?vd_source701421543dabde010814d3f9ea6917f6#reply248829735200 这里面最大的坑就是配置coco数据集。我一般是用yolo,这个yolo转coco格式很难搞定&#…...
5个关键挑战:BiliTools跨平台架构如何应对大规模视频下载的性能瓶颈
5个关键挑战:BiliTools跨平台架构如何应对大规模视频下载的性能瓶颈 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/Bil…...
终极指南:在Linux系统上安装与优化Realtek RTL8125 2.5GbE网卡驱动
终极指南:在Linux系统上安装与优化Realtek RTL8125 2.5GbE网卡驱动 【免费下载链接】realtek-r8125-dkms A DKMS package for easy use of Realtek r8125 driver, which supports 2.5 GbE. 项目地址: https://gitcode.com/gh_mirrors/re/realtek-r8125-dkms …...
AMD GPU本地AI模型部署终极指南:ollama-for-amd让你的Radeon显卡焕发新生
AMD GPU本地AI模型部署终极指南:ollama-for-amd让你的Radeon显卡焕发新生 【免费下载链接】ollama-for-amd Get up and running with Llama 3, Mistral, Gemma, and other large language models.by adding more amd gpu support. 项目地址: https://gitcode.com/…...
CANN/asc-devkit asc_any函数
asc_any 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/ca…...
保姆级教程:在S32G274ARDB2上,用IPCF点亮RGB LED(附源码解析)
从零玩转S32G2核间通信:手把手实现IPCF控制RGB灯效 拿到S32G274A开发板的第一天,我就被那个三色RGB LED吸引了——这不仅是硬件调试的指示灯,更是验证核间通信的绝佳媒介。作为多核异构处理器,S32G2的A53与M7核心如何协同工作&…...
磁性衬底导向的宽带超材料吸波体的吸波机理及设计方案【附代码】
✨ 长期致力于磁性材料、超材料吸波体、宽频带微波吸收、吸波机理、智能算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)对称模型分析多层反射干涉…...
电铲自主行走多耦合行为及轨迹控制技术【附代码】
✨ 长期致力于电铲、自主行走、多耦合行为、离散元法、反演滑模控制、轨迹控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)机电-离散元多体耦合动…...
JavaSwing社团管理系统 - MySQL版
文档末尾附 文件地址 📋 项目简介 这是一个基于Java Swing开发的社团管理系统桌面应用程序。系统采用三角色权限设计,包含管理员端、社团负责人端和普通用户端(学生),为高校或机构提供从社团创建审批、成员管理、活动…...
实时娱乐资讯获取慢?Perplexity新闻查询延迟优化全解析,3步压降至800ms内
更多请点击: https://codechina.net 第一章:实时娱乐资讯获取慢?Perplexity新闻查询延迟优化全解析,3步压降至800ms内 在高并发娱乐资讯场景下,Perplexity API 默认配置常导致端到端响应延迟突破1.5秒,严…...
如何在Windows 11上快速安装Android应用?终极APK安装器完全指南 [特殊字符]
如何在Windows 11上快速安装Android应用?终极APK安装器完全指南 🚀 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows上安装Android…...
