在 CI/CD流水线中运行自动化单元测试的4个原因

news2024/12/26 13:37:16

目录

什么是单元测试?

C#中的单元测试示例

我需要在CI/CD 流水线中运行自动化测试吗?

开发人员代码验证反馈循环

预验证

步步为营

减少“另一个开发人员写了这段代码”的问题


什么是单元测试?

单元测试
什么是单元测试?
单元测试是一小段代码,用于测试应用程序编写的代码的逻辑。单元测试允许对代码进行快速内存测试,关闭开发人员代码验证反馈循环。

C#中的单元测试示例

下面是为用 C# 编写的简单计算器库编写的一些单元测试的简单示例。如果你从未编写过 C#,请不要害怕这个代码示例。同样的原则适用于几乎任何其他编程语言!计算器类是将要测试的类,这称为被测单元或被测类。

  1. namespace WebDevTutor
  2. {
  3. public static class Calculator
  4. {
  5. public static int Add(int addend1, int addend2)
  6. {
  7. return addend1 + addend2;
  8. }
  9. public static int Subtract(int minuend, int subtrahend)
  10. {
  11. return minuend - subtrahend;
  12. }
  13. }
  14. }

以下是上面列出的计算器类的单元测试。

  1. using Xunit;
  2. namespace WebDevTutor.Tests
  3. {
  4. public class CalculatorTests
  5. {
  6. [Fact]
  7. public void Add_ShouldReturn4When2And2AreAdded()
  8. {
  9. // Arrange
  10. int expectedSum = 4;
  11. // Act
  12. var sum = Calculator.Add(2, 2);
  13. // Assert
  14. Assert.Equal(expectedSum, sum);
  15. }
  16. [Fact]
  17. public void Subtract_ShouldReturn90When10IsSubtractedFrom100()
  18. {
  19. // Arrange
  20. int expectedDifference = 90;
  21. // Act
  22. var difference = Calculator.Subtract(100, 10);
  23. // Assert
  24. Assert.Equal(expectedDifference, difference);
  25. }
  26. }
  27. }

这两个测试针对 Calculator 类的 Add 和 Subtract 方法运行基本测试用例。这两个单元测试在内存中运行都在5 毫秒内!
这是一个简单的例子,但我希望它展示了编写单元测试的基本模式。

我需要在CI/CD 流水线中运行自动化测试吗?

是的——你需要在 CI/CD 流水线中运行自动化单元测试。
在这篇文章中,我们将讨论您需要在 CI/CD 流水线中运行自动化单元测试的 4 个原因。

  1. 开发人员代码验证反馈循环
  2. 预验证
  3. 步步为营
  4. 减少“另一个开发人员写了这段代码”的问题

开发人员代码验证反馈循环

通过单元测试提高开发速度
判断当前代码是否修复错误的最快方法是什么?
  也许你启动了 UI 并创建了一系列点击事件来模拟用户流。或者,启动 Postman 并开始用请求访问你的 API。这些测试习惯在需要时非常有用,但是如果只是对代码中的一个小单元进行更改怎么办?如果正在修复应用程序底层的一个简单错误,可能根本不需要运行 UI。甚至可能不需要在本地为API 启动调试会话。我们可以通过添加平均每条不到 10 毫秒的命令行运行单元测试来缩短开发人员代码验证反馈循环。在编写验证修复错误的单元测试后,可以轻松(并重复)验证更改是否符合预期结果。不需要用UI按钮单击流,这些流对于测试小更改来说是过大的,可通过编写单元测试并通过命令行在本地运行它们来获得亚秒级的自动反馈。

预验证

用单元测试保护自己
  现在是下午 4 点,刚从老板那里收到一个高优先级的错误。 但是你在下午 5 点有家庭聚餐。你快速编写错误修复并添加单元测试以验证代码更改,提交代码并在下午 4:45 创建拉取请求,正好赶上,可以在知道已成功修复错误后下班。提交更改,拉取请求部署到产品中,然后带着微笑与家人共进晚餐。第二天早上回来工作时,你会收到一堆电子邮件和 Slack 消息。修复的这个bug导致相当大的回归量。但是你对这个代码库了如指掌——这怎么可能发生?是因为修复的这个bug破坏了上周完成的另一个修复bug的代码!你深入研究代码,修复此问题很简单,只需要在一行代码中添加 null 或空检查。如何防止这种回归验证?答案在下一节“过度自信”中。

步步为营

通过单元测试添加回归测试
  修复bug导致了回归验证,但是怎么知道要回归验证呢?应该手动执行每个边界测试用例吗?不,这是不可能完成的任务。是否应该手动执行尽可能多的测试用例?当然可以,但这需要相当长的时间。 在 6 个月后,当这段代码又出现了一个另外的bug,你怎么记得再次运行相同的测试用例?简而言之,没有开发人员能够记住代码库中每个类或代码片段的测试用例。 尤其是超过 6 个月的时间!
开发人员以合理的速度对代码进行回归测试的唯一方法是使用自动化单元测试
  如果上周修复bug有单元测试来验证更改,那么这种回归验证很可能会被CI/CD 流水线捕获——单元测试会失败。在修复bug的代码分支中添加新的单元测试或修改以前的单元测试是一个表明该 bug 已被修复很好的标志,在单元测试运行时,再次复现了这个bug则会被CI/CD流水线捕获。

减少“另一个开发人员写了这段代码”的问题

用单元测试保护同事代码
“另一个开发人员写了这段代码”问题的概念:
  “另一位开发人员编写了此代码”问题是当前开发人员(你)无法完全理解另一位开发人员编写的代码中的需求、标志和模式。 这是 Web 开发的基础。 副作用是:开发速度慢,更改代码时回归的风险高,以及突然想问以前的开发人员为什么代码是这样写的。某些操作可以帮助减少此问题的影响,但此问题从未得到真正的解决。 注意:在 6 个月后,当你回过头来看自己刚刚编写的代码时,你也是“另外一个开发人员”!
你刚在一家新公司,一个全新的代码库中工作。 正在尝试拉一个分支修复一个简单bug。他们要求你在一段简单的代码中进行修复一个简单的bug。但实际上,对于新开发人员来说,这种代码更改并不简单。
你以前从未见过此代码!
  所有这些代码都是由另一位开发人员编写的。当一个项目有单元测试时,有标准化的文档和自动化测试,可以为新开发人员提供很棒的指导。查看新代码(另一位开发人员编写了此代码)时,如果你想弄懂一段代码定义过的(和测试过的)功能,单元测试是一个很好的着手点。当您成为新代码的编写者时,请牢记这一点,其他开发人员会将你的代码视为另一个开发人员编写了此代码。
为未来的新开发人员提供代码文档,为你的工程编写单元测试并在CI/CD 流水线中运行它们。

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

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

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

相关文章

【MySQL】内置函数详解

【MySQL】内置函数详解 日期函数字符串函数数学函数加密函数与其它 日期函数 --获取当前日期 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-07-09 | ---------------- --获取当前时间 mysql> select current_time();…

ChatGLM2-6b本地部署

chatglm2-6m模型 git 地址 https://github.com/THUDM/ChatGLM2-6B 模型百度网盘地址:链接:https://pan.baidu.com/s/1-LFcPB0H23RSpTKOECsjxw?pwd5e3d 提取码:5e3d 1 模型简介 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#…

【高级程序设计语言C++】类与对象

2.1类的定义2.1.1 类的两种定义方式2.1.2 类的访问限定符2.1.3 C中的struct和class的区别是什么?2.1.4 类的实例化2.1.5 计算类对象的大小2.1.6 this指针 2.2 类的6个默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造函数2.2.4 赋值运算符重载2.2.5 取地址及…

Java新特性:Lambda表达式

Java新特性:Lambda表达式 Lambda 表达式(Lambda expression),也可称为闭包(Closure),是 Java(SE)8 中一个重要的新特性。Lambda 表达式允许我们通过表达式来代替功能接口…

第五章——循环和关系表达式

for循环 很多情况下都需要程序执行重复的任务 #include<iostream> using namespace std; int main() {int i;for (i 0; i < 5; i){cout << "C knows loop.\n";}cout << "C knows when to stop.\n";return 0; } for循环的组成部分 …

107、基于51单片机多路无线调频对讲机系统设计(程序+原理图+PCB源文件+参考论文+外文翻译+任务书+开题报告+硬件设计资料+元器件清单等)

摘 要 对讲机作为短距离通信和移动调度指挥的重要工具,在社会各个行业都有广泛的应用。尤其是随着数字电路技术的发展&#xff0c;新型的对讲机无论在外型还是性能上相对传统的模拟对讲机都有了长足的进步。对讲机主要包含需要基站支持的集群对讲机和常规无中心对讲机两种&…

深度理解 JAVA序列化

前言 相信大家日常开发中&#xff0c;经常看到Java对象“implements Serializable”。那么&#xff0c;它到底有什么用呢&#xff1f;本文从以下几个角度来解析序列这一块知识点~ 什么是Java序列化&#xff1f;为什么需要序列化&#xff1f;序列化用途Java序列化常用API序列化…

Android 热修复一

一、什么是热修复&#xff1f; 在我们应用上线后出现bug需要及时修复时&#xff0c;不用再发新的安装包&#xff0c;只需要发布补丁包&#xff0c;在客户无感知下修复掉bug。 实现效果&#xff1a; Demo源码&#xff1a; https://gitee.com/sziitjim/hotfix 二、怎么进行热修…

极速上手k8s,Kubernetes 从入门到摸鱼系列-理论篇

1. 引言&#x1f44b; 大家好&#xff0c;我是比特桃&#xff01;随着微服务架构越来越流行&#xff0c;大规模的微服务容器编排成了一件具有挑战的事情。在这次容器化云原生的发展中&#xff0c;Docker 成了容器化的赢家&#xff0c;而 Kubernetes 则成为了容器编排的赢家。k…

「已解决」 模块““umi“” ““@umijs/max“” 没有导出的成员“useRequest” “request” 问题的所有方法汇总

背景 使用 Umi 搭建项目时候有的时候会出现这种错误&#xff0c;模块““umi”” ““umijs/max”” 没有导出的成员“useRequest” “request”。 解决 tsconfig.json "paths": {"/*": ["src/*"],"/*": ["./src/.umi/*"…

用JShaman本地部署版,加密2.7MB的Webpack生成的JS文件

JShaman是知名的JS代码保护平台。在线使用&#xff0c;一键混淆加密&#xff0c;无需注册、无需登录。可免费用&#xff0c;也有商业服务&#xff1b;有在线使用的SAAS平台网站&#xff0c;也有本地部署版。很方便、很强大&#xff0c;很专业。 今天&#xff0c;测试使用JSham…

unordered_map模拟实现|STL源码剖析系列|开散列

博主很久没有更新过STL源码剖析这个系列的文章了&#xff0c;主要是因为大部分STL常用的容器&#xff0c;博主都已经发过文章了&#xff0c;今天博主带着大家把哈希表也模拟实现一下。 前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blo…

点云最小外包矩形计算

1、原理介绍 一簇点云的最小外包矩形&#xff08;Minimum Bounding Rectangle&#xff0c;MBR&#xff09;&#xff0c;是指用一个矩形将该簇点云框起来&#xff0c;所有点云数据在矩形框内。如下图所示为一个矩形框刚好将点云数据全部包围。 下面给出一种基于最大重叠度的最小…

[工业互联-19]:如何在QT中增加SOEM主站

目录 第1章 基本步骤 第2章 详细步骤 2.1.QT安装 2.2.VS安装 2.3.Win10 Debuggers 2.4.QT配置 2.5. SOEM移植 &#xff08;&#xff11;&#xff09;lib库生成 &#xff08;2&#xff09;文件移植: 文件整理 第1章 基本步骤 要在QT中添加SOEM主站功能&#xff0c;您需…

用OpenCV创建一张灰度黑色图像并设置某一列为白色

这段代码首先创建了一个400行600列的单通道灰度图像。然后,它遍历图像中的每个像素。如果像素位于列索引为30的列中,则将该像素的值设置为255。在灰度图像中,0表示黑色,255表示白色。因此,这段代码将图像的第30列设置为白色。 在 OpenCV 中,cv::Mat 构造函数的调用 cv::…

【算法 -- LeetCode】(13)罗马数字转整数

1、题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

哈希表和字符串专题1—205. 同构字符串 1002. 查找共用字符 925. 长按键入 844.比较含退格的字符串 C++实现

文章目录 205. 同构字符串1002. 查找共用字符925. 长按键入844.比较含退格的字符串栈模拟双指针 205. 同构字符串 class Solution { public:bool isIsomorphic(string s, string t) {unordered_map<char, char> map1;unordered_map<char, char> map2;for(int i0, j…

AI绘画:StableDiffusion炼丹Lora攻略-实战萌宠图片生成

Lora攻略-实战萌宠图片生成 写在前面的话一&#xff1a;准备二、Lora作用1.AI模特2.炼衣服Lora3.改变画风/画面背景Lora模型究竟是什么&#xff1f; 三、如何炼制自己的Lora模型&#xff1f;四、炼丹前的准备&#xff08;**下载整合包**&#xff09;五、选择合适的大模型六、高…

管理类联考——逻辑——记忆篇——数字编码——公式

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

MySQL练习题(2)

创建如下员工标表 插入数据 1-- 按员工编号升序排列不在10号部门工作的员工信息 2-- 查询姓名第二个字母不是A且薪水大于1000元的员工信息&#xff0c;按薪水降序排列 4-- 求每个部门的平均薪水 5-- 求每个部门的最高薪水 6-- 求每个部门…