持续交付(CD)与持续集成(CI)

2023-05-16

测试基础设施是指支持自动化测试运行、测试开发、测试管理以及与研发环境集成的综合性平台。敏捷测试离不开稳定、高效、准确的基础设施,以满足对于持续测试、持续反馈的需要;同时,持续集成、持续交付和 DevOps 环境必须实现和测试基础设施的无缝集成,才能够满足软件在各种环境中持续验证的需要。

下面我来讲讲持续集成和持续交付的概念。

CI、CD 概念

“持续集成”(Continuous Integration,CI)在 1996 年就被列入了极限编程的核心实践,到 2006 年 Martin Fowler 提出了比较完善的方法与实践。持续集成是一个软件开发实践,在开发过程中团队成员频繁地提交代码到集成环境,每次集成都通过自动化的构建和测试尽可能快地发现问题,让软件始终保持在一个可工作的状态。这里的可工作应该理解为软件可安装、可运行,基本功能可用,可以进一步开展测试。

 

图1 Martin Fowler 对持续集成的定义

“持续交付”(Continuous Delivery,CD)是对持续集成的延伸,更是敏捷宣言“拥抱变化胜于遵循计划”价值观的体现。CD 是指软件经过开发环境、测试环境、准生产环境里的持续验证,满足了客户需求和质量目标,成为可交付给客户的产品。持续交付也是研发团队以一种可持续的方式把软件产品交付给客户的能力。持续交付的下一步就是持续部署,通过自动化的方式实现软件在生产环境中的部署。

敏捷的目标

我们重温一下敏捷宣言 12 项原则的第一项:首要任务是尽早持续交付有价值的软件并让客户满意。因此可以说,敏捷的目标就是要做到持续交付,尽快向用户交付满足需要的、可工作的软件。产品或变更只有快速交付到客户手中才能实现价值,没有交付给客户的产品从业务角度上来说是没有价值的。持续交付以敏捷开发的快速迭代为基础,通过小批量的变更,以及持续集成、持续验证实现产品从研发到客户的快速流动。

Scrum 模式下每次迭代结束会提供一个可向客户交付的软件版本。如果企业的业务模式是 SaaS,也可以像前面介绍过的 Etsy 一样,实现一天几十次甚至更多次的线上部署。

倒推:CD 持续验证 CI 持续单元测试

那么,为了使软件达到可以交付,需要经过哪些过程呢?

产品要满足交付的标准,需具备两个条件:第一,满足用户预期和质量要求;第二,在生产环境中可以成功部署。

为了满足这两个条件,首先我们需要搭建和生产环境尽可能接近的测试环境或准生产环境(Stage Environment),然后部署流程在不同的目标环境中通过验证。在测试环境中不断对新增加的特性、新版本的软件进行持续测试,在准生产环境中通过验收测试和全面回归测试。在上述任何阶段发现问题要及时反馈、及时修复,这就是一个持续验证的过程。

而持续验证需要我们随时能得到一个可工作、可持续测试的新版本,这就是持续集成要做的事:首先代码编译后通过单元测试和代码审查以保证代码质量;然后部署到测试环境验证是否可运行并且基本功能可用。

代码在提交构建 / 集成之前,应该由开发人员在自己的开发环境里编写、调试,同时不断地进行单元测试,以保证新开发的代码包括新的修改总是满足需求,即符合用户故事的验收标准

开发人员编写代码的依据是系统设计,包括架构设计、组件设计、界面设计等,因此持续编程 / 单元测试前一步应该是持续设计

要让交付成为持续、快速的活动,往前推的每个步骤都应该在小批量更改的基础上进行持续、快速的自循环,并且通过每个步骤内建的测试活动让问题尽早发现在源头,并尽早得到修复。

 

图2 对持续交付流程的反推

重点:持续集成 + 持续测试

在第 4 讲,我从敏捷测试流程的角度讨论了持续集成和持续测试,今天我将进一步讲解 CI 加持续测试对于 CD 意味着什么。

代码的一次构建 / 集成大概包括以下活动:编译、测试、打包、部署和反馈。开发人员从提交代码变更触发构建,到收到反馈所需的时间最好控制在几分钟以内,否则会降低开发效率,并且这个过程应该是自动化的。

通过和自动化测试工具 / 框架的集成,CI 环境中可以执行几乎所有的自动化测试,但是一个必须要考虑的问题是,持续集成中测试覆盖面和提供快速反馈之间的平衡。一般来说,持续集成中的测试活动应该只包括单元测试、代码静态分析和 BVT(Build Verification Testing)。代码静态分析和 BVT 具体怎么做,我们很快会讲到。单元测试对外部系统的依赖少,运行时间通常在秒级,发现代码缺陷的成本低、效率高,研发团队应该对单元测试的代码覆盖率有比较高的要求,比如 80% 以上。

构建成功意味着所有的步骤都是成功的,所有的测试也是通过的,任何失败都会快速反馈给相关人员进行修复直到再次提交代码并且构建成功,而且持续集成不仅要验证软件本身是否可工作,还要验证软件在测试环境中是否可以安装成功且可运行。

持续集成保证我们随时获取可工作的软件并进一步开展深入测试。随着版本的不断更新,模块、功能、用户故事不断增加,我们需要不断测试新的代码、新的用户故事和新的功能,最后覆盖业务端到端的测试,并包括性能测试、安全测试等。通过这样的持续测试,软件产品持续的接近并最终满足交付的功能需求和质量目标。

持续测试还包括持续的回归测试,以自动化测试的形式持续验证新的代码和功能不会影响正常运行的原有代码和功能。在这个过程中,单元测试的数量在持续集成测试里也在不断地增加,将成为回归测试的重要组成部分。

现在不少公司还在采用每日构建(Daily Build,每天一个新版本)的方式,严格来说这不是持续集成,理想的持续集成是:开发人员提交代码就会触发自动构建,一天构建多次。如果每天构建一个新版本,则构建和测试可以放在夜里完成,在这种情况下对 CI 时间限制也没有那么苛刻,可以把更多的测试内容(脚本)加入构建过程中。

微软公司在上个世纪 80 年代开发 Office 产品时就开始使用每日构建这种工程实践,冒烟测试的概念也是微软提出来的。不过,微软从 2007 年就开始尝试敏捷转型,从 2014 年开始逐步将自己的 IT 系统迁移到自家的公有云 Azure 上,到 2017 年,超过 4000 多名 Windows 开发人员每天都要进行 1760+ 次构建,提交代码就会触发单元测试及集成测试的自动运行。

CI、CD 环境

下面我来讲讲持续集成和持续交付环境,为下一讲的主题“测试如何融入 CI、CD 环境”做准备。

 

图3 CI 环境基本构成示意图

良好的持续集成环境能够实现自动构建、自动部署、自动验证,自动反馈。因此,CI 环境需要强大的工具链支持,需要的工具可分为 8 类:代码管理工具、版本构建工具、CI 调度工具、自动部署工具、配置管理工具、代码静态分析工具、单元测试工具、版本验证(BVT)工具。图 4 列出了每一类中比较常用的几种工具。

 

图4 持续集成工具集

如果考虑其他运行在 CI 环境中的自动化测试,那可以集成的不同层次、不同类型的自动化测试框架和工具就更多了。这相当于 CI 环境向 CD 环境的扩展,在持续集成的基础上,为实现持续交付在 CD 环境开展更多的持续验证活动。

根据自动化测试金字塔(详细内容将在第 16 讲中介绍),自动化测试可以按照不同层次划分为单元测试、API 测试和 UI 测试:

  • 单元测试框架包括 JUnit、CppUnit、Mocha、PyUnit 等;

  • API 测试工具包括 Cpyress、Karate、PostMan 及 Rest-Assured 等;

  • UI 测试框架包括 Selenium、支持 Groovy 语言的 Geb 等。

值得注意的是,近几年大家对 API 测试的兴趣一直在稳步增长,通过 API 绕过 UI 界面直接在业务层展开测试可以覆盖软件的功能、性能、稳定性等需求,比 UI 自动化测试维护成本低。根据 Smartbear 在 2017 年的调查显示中发现,80% 的参与调查者在使用 API 进行软件测试,而超过 50% 的 API 测试以自动化的形式进行,预计两年内会增加到接近 80%。

另外,我们也可以按功能测试、性能测试、安全测试等维度来分类,支持功能测试的自动化框架有 Selenium、Appium 等;性能测试的自动化框架有 JMeter、Gatling 等;安全测试的自动化框架有 Wapiti、OWASP ZAP 等。

验收测试的自动化框架推荐选择支持 ATDD、BDD 和需求实例化的测试框架,比如 RobotFramework、Cucumber 等。

总之,每一类测试都对应不同的自动化测试框架和工具,可以集成在 CI/CD 环境中,通过 CI 调度管理工具就可以发起不同层次和不同类型的自动化测试。

另外,CI/CD 环境里还包括 CI/CD 流水线, 尽量通过自动化的方式来完成软件从构建、部署、测试到发布的过程。CI/CD 流水线强调减少人为干预和交接、在所有环境上采用一致的、可重复的部署实践,不仅支持软件产品从左到右的快速流动,也支持从右到左的快速反馈。在这方面,Jenkins 2.x 提供的了pipeline 功能,它通过和 CI 工具链的集成,能够很好地支持 CI/CD 流水线的构建,如图 5 所示。

 

图5 CI/CD 流水线

最后,给你出一道思考题:你所在团队的 CI 活动是理想情况下的 CI 吗?测试有没有成为瓶颈?如果测试成为瓶颈,如何改进?欢迎留言讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

持续交付(CD)与持续集成(CI) 的相关文章

  • C++使用http向服务器发送json数据

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 如何使用Git将Github项目拉到本地

    如何使用Git将Github项目拉到本地 前言 因为国内访问GIthub速度比较慢 xff0c 复制粘贴代码又慢效率也低 xff0c 所以建议下载Git工具 xff0c 直接把Github的项目整个下载到本地的文件夹 安装配置git 步骤如
  • 笔记本 - 数据分析百宝箱

    Numpy 一 基本操作 xff1a 属性 xff1a improt numpy as np 生成数组 xff1a array 61 np array 1 2 3 2 3 4 xff0c dtype 61 np int float arra
  • Faiss(5):IndexIVFPQ原理

    说明 原本想尝试自己从头写 xff0c 但看了下网上的各位前辈的博客后 xff0c 感觉自己还是才疏学浅 xff0c 没有理解透彻 xff0c 所以在这里做个搬运工 xff0c 偶尔加些个人的理解在里面 原文链接 xff1a https b
  • cmake(3):编译库和链接可执行文件

    1 说明 在实际开发的过程当中 xff0c 我们会经常需要将部分程序编译成静态或动态库的形式 xff0c 供其他应用程序调用而不是将所有文件一次编译为一个可执行文件 这篇笔记就记录使用cmake编译动态和静态库以及将库链接到可执行文件中的过
  • RTOS原理与实现02:基本任务切换实现

    目录 1 任务定义与切换原理 1 1 任务是什么 1 1 1 任务的外观 1 1 2 任务的内在 1 2 任务切换原理 1 2 1 任务切换的本质 1 2 2 要保存哪些任务运行状态 1 2 3 任务运行状态保存方案 1 3 设计实现 1
  • cmake(5):选择编译器及设置编译器选项

    1 说明 在实际的项目平台中可能安装有多个版本的编译器 xff0c 同时由于不同的功能可能会需要设置不同的编译参数 xff0c 这篇笔记就记录如何选择指定的编译器和配置参数 2 选择编译器 2 1 初始状态 我使用的开发平台默认安装的gcc
  • Faiss(14):IndexIVFPQ的CPU search过程分析

    1 说明 之前分析过了faiss 在GPU中的search过程 xff0c 这里分析一下IndexIVFPQ在CPU中的search过程 xff0c 即不将index拷贝到GPU中 2 过程分析 2 1 python接口 CPU searc
  • cmake(8):install命令详解

    1 说明 之前的示例中有提到使用cmake的install命令来自动安装库和头文件 xff0c 但是只是使用到了install命令很基础很少的部分 xff0c 其实该命令作用十分丰富 xff0c 本篇文档用于说明该命令的详细使用方法 2 i
  • cmake(9):包含指定目录的头文件

    1 说明 在编译程序时 xff0c 如果需要用到外部的头文件 xff0c 而该头文件又没有被添加到系统默认的路径中 xff08 如 xff1a usr include xff0c usr local include和 usr lib gcc
  • cmake(10):使用cmake编译linux驱动或内核模块

    1 说明 这篇笔记用于说明如何使用cmake构建Linux驱动 xff0c 这样可以方便地将driver和app作为一个整体统一构建 2 示例 首先来看一个代码示例 xff0c 为了简化起见 xff0c 我直接在驱动目录下进行构建而没有作为
  • Boost(1):Boost库简介及安装

    1 Boost库介绍 Boost是一个功能强大 构造精巧 跨平台 开源并且完全免费的C 43 43 程序库 xff0c 在1998年由Beman G Dawes发起倡议并建立 使用了许多现代C 43 43 编程技术 xff0c 内容涵盖字符
  • Ubuntu:与Windows共享文件夹

    1 说明 我个人更喜欢在windows下编辑代码或文档 xff0c 而运行环境又经常在Linux环境下进行 xff0c 那么Windows和Linux之间的协作就显得很有必要了 通常有两种方式来实现两个系统之间的文件共享 xff1a 在Li
  • C语言处理参数的 getopt() 函数

    前言 C语言程序主要通过 main 函数的参数来传递命令行参数 xff1a 默认传递命令行参数 int main int argc char argv 其中 argc 表示参数个数 xff08 包含程序本身 xff09 xff0c argv
  • SPD5详解

    SPD介绍 SPD xff08 serial presence detect xff09 xff0c 即串行存在检测 xff0c 是DIMM的相关描述信息 在每根内存条上 xff0c 都有一份SPD数据 xff0c 这份数据保存在一个可擦写
  • 基于CentOS更新 glibc - 解决 `GLIBC_2.29‘ not found

    说明 在一个 CentOS Stream8 上安装或运行某些程序时 xff0c 报 96 GLIBC 2 29 39 not found xff0c 因为系统自带的 glibc 库版本只到 glibc 2 28 strings usr li

随机推荐

  • FreeRTOS源码分析与应用开发05:信号量

    目录 1 信号量概述 1 1 信号量概念 1 2 4种信号量 1 2 1 二值信号量 1 2 2 计数信号量 1 2 3 互斥信号量 1 2 4 递归互斥信号量 1 3 信号量相关控制结构 1 3 1 队列结构 1 3 2 任务结构 2 二
  • FreeRTOS Task switch

    vTaskSwitchContext中看pxCurrentTCB traceTASK SWITCHED OUT 切出 taskSELECT HIGHEST PRIORITY TASK traceTASK SWITCHED IN 切入新的ta
  • 嵌入式常见总线分类总结

    任何一个微处理器都要与一定数量的部件和外围设备连接 xff0c 但如果将各部件和每一种外围设备都分别用一组线路与CPU直接连接 xff0c 那么连线将会错综复杂 xff0c 甚至难以实现 为了简化硬件电路设计 简化系统结构 xff0c 常用
  • linux压测工具stress和stress-ng下载

    1 下载 2020 5 16实测以下地址能下载 stress https fossies org linux privat stress 1 0 4 tar gz stress ng https aur tuna tsinghua edu
  • 设备树Device Tree详解

    原文 xff1a https www cnblogs com aaronLinux p 5496559 html 目录 1 设备树 xff08 Device Tree xff09 基本概念及作用 2 设备树的组成和使用 2 1 DTS和DT
  • 十六进制与ascii码互转 C语言实现

    十六进制与ascii码互转 C语言实现 1 ascii转16进制 func char to hex desc convert ascii to 16 hex input ascii return hex unsigned char char
  • Android 11.0 支持exFAT文件系统

    Android 11 0 支持exFAT文件系统 U盘常见文件系统类型有FAT32 NTFS exFAT xff0c Android默认支持FAT32 一般也有NTFS类型编译选项 xff0c 但是exFAT由于版权或者其他原因 xff0c
  • repo sync遇到warning: project ‘repo‘ branch ‘stable‘ is not signed

    warning project 39 repo 39 branch 39 stable 39 is not signed This can happen on Linux and Mac I 39 ve personally experie
  • C语言单链表基本操作总结

    C语言单链表基本操作 本文是参考他人实现的C语言单链表 xff0c 对多篇博文整理的结果 xff0c 仅作为学习笔记 文末有参考出处 1 单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素 xff0c 这些存储单元可以是连续的
  • 开源项目-类似58同城的项目启动

    已经进入编程这行已经3年 xff0c 最近想做一个自己的开源项目 xff0c 最后选来选去 xff0c 选中了类似58同城的功能的项目作为开始 下面是一些列的工作 xff0c 里面会体系我是怎样把这个项目做出来 xff0c 包括思路 技术
  • CMakeLists完整解析(一)

    CMakeLists完整解析 xff08 一 xff09 首先 xff0c 我们先通过介绍一下相关的核心概念来引入CMakeLists 1 gcc make和cmake gcc xff08 GNU Compiler Collection x
  • FreeRTOS源码分析与应用开发08:任务通知

    目录 1 概述 1 1 任务通知概念 1 2 任务通知控制结构 2 发送任务通知 2 1 任务级发送 2 2 中断级发送 2 2 1 xTaskNotifyFromISR函数 2 2 2 vTaskNotifyGiveFromISR函数 3
  • 基于ROS机器人的3D物体识别与三维重建(一) 介绍篇

    基于ROS机器人的3D物体识别与三维重建 一 xff09 介绍篇 由来 xff1a 清理电脑硬盘 xff0c 发现了当时做毕设的一些资料 xff0c 所以打算整理一下资料和代码写成专栏 xff0c 记录下当时的暗金岁月 xff0c 尽管现在
  • WIFI模块实现网络连接

    WiFi模块连接 xff0c 通过串口调试助手来配置 STA 43 连接TCP Server 1 AT 43 CWMODE DEF 61 1 工作在单station模组 xff0c 设置参数保存到flash 2 AT 43 CWJAP DE
  • 关于飞机绕地球飞行一圈的加油问题

    已知 xff1a 每个飞机只有一个油箱 xff0c 飞机之间可以相互加油 xff0c 注意是相互 xff0c 没有加油机 xff0c 一箱油可供一架飞机绕地球飞半圈 问题 xff1a 为使至少一架飞机绕地球一圈回到起飞时的飞机场 xff0c
  • 【C/C++/QT/ 移植/导入Mavlink V2.0/Mavlink V1.0教程】

    提示 xff1a 本文针对的实例是Mavlink V2 0版本 xff0c Mavlink V1 0版本其实也是类似的的步骤 xff0c 选择的mavlink库不一样而已 官方链接放在此 xff1a Install MAVLink MAVL
  • 无需修改bios即可让任意主板实现NVME启动

    使用Clover四叶草引导加载NVMe驱动 除了对BIOS的硬改之外 xff0c 还有一种更安全的软件方案 xff1a 使用Clover四叶草引导加载NVMe驱动 Clover是著名的黑苹果引导软件 xff0c 这里借用它来实现对预引导 x
  • 如何将PX4 User Guide导出为PDF

    PX4 Autopilot User Guide PDF导出 如何将PX4 User Guide导出为PDF1 工具安装安装nodejs安装ebook conver安装svgexport安装gitbook 2 输出PX4 Guide文档下载
  • CentOS7 yum安装docker失败的看过来

    背景 在百度上搜到一些前辈关于安装docker教程 xff0c 例如 xff1a 点击打开链接 但都报出找不到源的信息 xff0c 估计导致该情况往往是国内使用外国源被和谐的原因吧 解决 1 使用阿里云的yum源 cd etc yum re
  • 持续交付(CD)与持续集成(CI)

    测试基础设施是指支持自动化测试运行 测试开发 测试管理以及与研发环境集成的综合性平台 敏捷测试离不开稳定 高效 准确的基础设施 xff0c 以满足对于持续测试 持续反馈的需要 xff1b 同时 xff0c 持续集成 持续交付和 DevOps