导读:浅谈 CI/CD 和软件测试
知其然,知其所以然。相较于DevOps而言,CI/CD是一个相对具象的概念。在 IT 企业中,CI/CD的应用愈加广泛,成为推动软件研发活动的重要基础设施服务,同时推动 DevOps 模式的实际落地。
什么是 CI/CD
在实践 CI/CD 相关内容之前,我们有必要先认识下什么是 CI/CD。
一般传统或者狭义、普遍的 CI/CD,是指持续集成(Continuous Integration,CI)和持续交付(Continuous Delivery,CD)。而更加广义、全面的理解,是指持续集成(Continuous Integration,CI)、持续测试(Continuous Testing,CT)、持续交付(Continuous Delivery,CD)和持续部署(Continuous Deployment,CD)四个方面。通常,一个软件开发的流水线如下图所示。
Design:这一阶段完成软件开发的需求分析和设计。
Develop:这一阶段完成软件开发的功能代码,一个最佳实践是采用测试驱动开发(TDD)的方法,测试代码和功能代码的编写同时进行。需要注意的是,在 Develop 阶段也会运行单元测试和其他小型测试。
Test:这一阶段完成软件的各项大型或专项测试,比如界面测试、API 测试、性能测试和系统测试等。
Release:这一阶段完成软件产品的发布,并交付给用户使用。
持续集成(Continuous Integration)
随着敏捷开发的发展,持续集成在软件项目活动中也日益成为主流。顾名思义,持续集成是指每日频繁地(比如一天多次)将代码集成到主干分支中。强调通过集成和测试的速度,快速给出一个集成的结果(是失败还是成功),在代码集成之前,必须先通过自动化测试验证,只要有一个测试用例失败,就不能集成。
Martin Fowler 说过,“持续集成并不能消除Bug,而是让它们非常容易被发现和改正”。这也正是持续集成的真谛所在。
敏捷开发的核心是指整个软件开发活动被划分成一系列短的迭代过程,每个迭代完成一定数量的功能,迭代周期应该尽量短。在软件开发需求已经确定的情况下,迭代应该由测试驱动开发(TDD)和集成反馈来驱动。只有这样,才能为质量持续改进奠定一个良好的基础。
持续集成是和单元测试结合在一起的,也就意味着,持续集成和单元测试需要并行工作。持续集成一般由代码每次 git push/review 触发。先签入代码就先看到构建结果,后签入,则要排在后面。这就要求构建时间不能太长,否则在构建时容易引起混乱,很难知道是谁的代码破坏了集成,导致很难定位问题。
可以说,持续集成是敏捷开发的重要基础环节,没有持续集成,所谓的敏捷开发便失去了赖以生存的土壤,其实施效果也会大打折扣。持续集成是一种软件开发实践,团队成员频繁集成他们开发的代码,每次集成都会经过自动构建——自动测试的验证,以尽快发现集成错误。使用这种方法可以显著减少集成引起的问题,并加快团队合作开发软件的速度。
(1)持续集成过程
持续集成的工作阶段比较明确,主要有三个大的阶段:持续集成准备阶段、持续集成使用阶段和持续集成测试阶段。
持续集成准备阶段的工作主要包括:
通过代码评审系统(比如 Gerrit),实现代码审查和集成反馈。
通过版本控制系统(比如 Git或 GitLab)建立源码仓库。
通过构建工具运行相关构建和测试(比如 Python 项目的 Tox 和 Pytest)。
通过 CI 系统(比如 Jenkins)建立 Job,将版本控制和构建工具整合,并设置构建触发条件。怎么写代码做软件
持续集成使用阶段的工作主要包括:
开发人员向代码评审系统(比如 Gerrit)提交代码。
通过 CI 系统监听代码的提交,运行单元测试,反馈集成结果。
通过构建工具对代码进行编译、打包和部署。
通过版本控制工具实现版本控制与管理。
持续集成测试阶段的工作主要是,CI 系统根据集成结果进行不同操作,如果成功,则将代码合并到主分支;如果失败,则反馈给开发人员修改重新提交。