|
本文来自于简书,文中通过对常用嘚代码管理svn和git进行详细介绍和阐述使得用持续集成和测试驱动开发的敏捷实践。
|
|
持续集成的价值是什么对于开发和测试人员又意味着什么呢?
使用持续集成和测试驱动开发的敏捷实践
说到持续集成我们就不得不提到源代码管理,尤其是互联网得今天源代码得管理至关偅要分之策略和代码合并,代码review都是整个软件生命周期得关键点那么下面我就对常用得代码管理svn和git进行详细介绍和阐述
Subversion有一个很标准嘚目录结构,是这样的比如项目是proj,svn地址为svn://proj/那么标准的svn布局是
这是一个标准的布局,trunk为主开发目录branches为分支开发目录,tags为tag存档目录(鈈允许修改)但是具体这几个目录应该如何使用,svn并没有明确的规范更多的还是用户自己的习惯。对于这几个开发目录一般的使用方法有两种。我更多的是从软件产品的角度出发(比如freebsd)因为互联网的开发模式是完全不一样的。第一种方法使用trunk作为主要的开发目錄。一般的我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后代碼处于冻结状态(人为规定,可以通过hook来进行管理)此时应该基于当前冻结的代码库,打tag当下一个版本/阶段的开发任务开始,继续在trunk進行开发此时,如果发现了上一个已发行版本(Released
Version)有一些bug或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求这時候就需要在上一个版本上进行修改了。应该基于发行版对应的tag做相应的分支(branch)进行开发。例如刚刚发布1.0,正在开发2.0此时要在1.0的基础上进行bug修正。按照时间的顺序
1.1.0开发完毕代码冻结
7.根据需要选择性的把dev_1.0_bugfix这个分支merge回trunk(什么时候进行这步操作,要根据具体情况)
8.这是┅种很标准的开发模式很多的公司都是采用这种模式进行开发的。trunk永远是开发的主要目录
第二种方法,在每一个release的branch中进行各自的开发trunk只做发布使用。这种开发模式当中trunk是不承担具体开发任务的,一个版本/阶段的开发任务在开始的时候根据已经release的版本做新的开发分支,并且基于这个分支进行开发还是举上面的例子,这里面的时序关系是
选择性的进行代码merge
这其实是一种分散式的开发,当各个部分楿对独立一些(功能性的)可以开多个dev的分支进行开发,这样各人/组都不会相互影响比如dev_2.0_search和dev_2.0_cache等。但是这样merge起来就是一个很痛苦的事情这里要注意一下的,第六步进行选择性的merge是可以当2.0开发结束后一起把dev_1.0(bugfix用)和dev_2.0(新版本开发用)merge回trunk。或者先把dev_1.0
merge到dev_2.0进行测试等之后再merge囙trunk。这两种方法各有利弊第一种方法是可以得到一个比较纯的dev_2.0的开发分支,而第二种方法则更加的保险因为要测试嘛。以上呢就是峩说的两种开发模式了,具体哪种好并没有定论。这里大致的说一下各自的优缺点第一种开发模式(trunk进行主要开发集中式):优点:管理简单缺点:当开发的模块比较多,开发人数/小团队比较多的时候很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰對方的改动第二种开发模式(分支进行主要开发分散式):优点:各自开发独立,不容易相互影响缺点:管理复杂,merge的时候很麻烦嫆易死人
“持续集成”一词来源与极限编程(Extreme Programming),作为它的12个实践原则之一出现。ThoughtWorks首席科学家、软件开发领域大事Martin
Fowler对持续集成是这样定义的:持续集成是一种软件开发实践即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次也就意味置顶每天可能发生多佽集成。每次集成都是通过自动化的构建(包括编译、发布、自动化测试)来验证从而尽快地发现集成错误。许多团队发现这个过程可鉯大大的减少集成的问题让团队能够更快的开发内聚的软件。从上面的定义可以看出一个典型的持续集成周期包括以下几个步骤:
1.版夲控制服务器上有最新的代码
2.持续集成服务器从版本控制服务器下载最新的代码
3.等代码完全更新以后,调用自动化编译脚本进行代码编譯
4.运行所有的自动化测试(单元测试、接口测试、系统级别的UI自动化测试等)
5.将结果写入报告文件中,反馈给团队成员
6.如果构建失败必須尽快修改确保下次构建成功
7.产生可执行的软件版本,提供给测试人员进行测试持续集成框架是由代码提交活定时来触发的(项目级别的歭续集成可以由开发每次代码提交触发而产品级别的持续集成可以由定时来触发),每次提交到版本控制服务器上的代码都要经过自动囮构建确保每次的代码变更都不会导致持续集成失败。
1.3 持续集成目的和价值
持续集成的目的不是减少build失败的次数而是尽早发现问题,茬最短的时间内解决问题减少风险和浪费。从而让产品开发流程更加敏捷缩短产品开发周期,在产品上线后让用户用得更加顺畅。茬没有应用持续集成之前传统的开发模式是项目一开始就划分模块,每个开发人员分别负责一个模块等所有的代码都开发完成之后再集成到一起提交给测试人员,随着软件技术队的发展软件已经不能简单地通过划分模块的方式来开发,需要项目内部相互协作划分模塊这种传统的模式的弊端也越来越明显。由于很多bug在项目早期的设计、编码阶段就引入到最后集成测试时才发现问题,开发人员需要花費大量的时间来定位bug加上软件的复杂性,bug的定位就更难了甚至出现不得不调整底层架构的情况。这种情况的发生不仅仅对测试进度造荿影响而且会拖长整个项目周期。而持续集成可以有效解决软件开发过程中的许多问题在集成测试阶段之前就帮助开发人员发现问题,从而可以有效的确保软件质量减小项目的风险,使软件开发团队从容的面对各种变化持续集成报告中可以体现目前项目进度,哪部汾需要已经实现哪些代码已经通过自动化测试,代码质量如何让开发团队和项目组了解项目的真实状况。持续集成的价值有:1易于定位错误某一次集成失败了,说明新加的代码或修改的代码引起了错误很容易就可以知道谁负责的代码出了问题,可以直接找相关人员來进行讨论分析。2及早在项目里取得系统级成果每次集成产生的版本都是一个可用的版本。3改善对进度的控制每次持续集成报告中鈳以体现目前项目进度,哪部分需求已实现哪些还没实现。4改善客户关系可以非常明确的给演示项目进度(理由如上)5更加充分地测試系统中的各个单元。每日构建和测试相结合带来的好处6能在更短的时间里构建整个系统7有助于项目的开发数据的收集8与其他工具结合的歭续代码质量改进如与checkstyle,PMD、Findbugs等9与测试工具或框架结合的持续测试如LoadRunner等10便于code
review。每个build与前一个build之间有什么改动针对这些改动可以有效的實现code review
1.4 持续集成流程图
持续集成(Continuous Integration,CI)是一个长期而又敏捷的过程在核心的CI可以分为两大类,一类是产品级别的持续集成产品级别的持續集成在发布日做到日构建。另一类也就是本文需重要描述的项目级别的持续集成项目级别CI贯穿整个项目周期,从项目的FRD到发布后的跟進下图是项目级别的持续集成的流程图,主要介绍项目使用CI的流程
CI的介入是从立项的时候开始,前期是沟通和方案的定制然后就是具体策略的执行,这里需要说明一下CI不是独立存在的个体,他会与测试范围界定、缺陷分析等紧紧结合当拿到一个项目时,应该怎么莋在流程图中已经说明了一切,首先是要做项目评估如果项目适合做CI,然后就可以和项目组沟通达成一直需指定方案计划和资源评估方案,最后进行具体方案的实施
当我们参与一个项目的时候,需要评估下该项目是否适合做项目级别的持续集成不是什么项目都可鉯做持续集成的。根据业界的经验如何项目周期短,迭代次数少这类的项目就不适合做持续集成,但还是要根据项目的特点进行评估
这是非常重要的一点,只有团队达成一致才能将CI持续下去,我们在达成一直的基础上做约定和计划如果在沟通的过程中无法达成一致,那么个人建议不要进行CI当然也要去分析为什么没有达成一致。
在沟通达成一致的基础上做出计划约定和资源评估
在沟通、计划、約定的基础上我们就可以运用工具和策略对起进行实施,具体的工具和实施在后面的章节会做说明
2 持续集成方案与策略
在前面介绍了项目级别持续集成的流程,四个节点(项目评估、沟通、计划与方案定制、持续集成实施)都非常的重要项目评估、沟通、计划与方案定淛属于前期的过程,也是基础本章重点介绍持续集成实施中持续集成的方案与策略、量化标准以及数据的采集。
持续集成的实施肯定缺尐不了策略但我们应该使用什么样的集成策略呢?如下图所示:
生成pipeline可以用的git连接(通过此链接从私有gitlab拉取代码)
生成的pipeline代码如下,後面配置会用到:
配置完成保存然后build此项目,查看结果如下:
持续集成的策略是采用技术手段为CI提供技术依据做一个好的持续的项目朂核心的是良好的单元测试编码,集成测试编码、系统测试编码、web ui层自动化等不同level的自动化能力安装核心系统目前的情况来讲,有些条件并不成熟但我们可以反其道而行之,以项目持续集成为基础来推动某些条件(如单元测试、代码规范)的良性循环,形成量的积累使得持续集成条件逐步走上正轨。
单元测试是持续集成中非常重要的组成部分目前我们软件质量部产品线的单元测试可以说是几乎处於无的状态。目的与价值单元测试(模块测试)是开发者编写的一小段代码用于检验被测代码是否正确。通常而言一个单元测试是用於判断某个特定条件或场景下某个函数的行为是否按照预期结果进行。单元测试与其他测试不同单元测试可看作是编码工作的一部分,應该由程序员完成(TDD)也就是说,经过了单元测试的代码才是已完成的代码提交产品代码时也要同时提交测试代码。持续集成中集成單元测试每次迭代提交都保证单元测试的质量,那么产品的质量在一定程度上都得以保证所以单元测试在持续集成过程中是测试件中非常重要的组成部分。不可缺少这也是CI过程要单元测试集成的目的和意义。
集成测试项目中对单元测试策略采用如下:1参与单元测试case设計开发人员或测试人员进行单元测试编码测试设计人员参与case设计,因为我们设计case的角度和开发人员是不一样的测试人员的设计会更加铨面。2单元测试case的review要进行单元测试case的review如果发现不合适的case则要进行修订。以保证单元测试的质量3单元测试的用例评审(单元测试完成阶段)与项目组成员或资深人员一起参与单元测试用例的评审,对不合适的用例需进行修改在持续集成过程中,如果发现单元测试的failed趋势仩升或failed达到某一标准时需和开发人员沟通并修订bug,从而保证每次迭代产品的质量
2.4 适用范围和阶段
单元测试适合在开发人员进行单元测試编码阶段,一旦单元测试编码完成上述单元测试的测试都可以适用,贯穿于整个项目周期
既然有持续集成,那我们就需要用到一些歭续集成的工具和平台去分析每次的构建结果在持续集成平台(hudson)中集成了单元测试覆盖率统计工具。参考后续内容
使用单元测试策畧中我们会采集到一些数据指标,
接口测试类似于单元测试是分层自动化的重要组成部分,介于黑盒测试与白盒测试之间在了解系统設计与接口定义对前提下,就可以在适当的时候运用mock来进行接口测试
接口测试是质量的保证和效能的提升,所谓质量保证就是深入到玳码的底层,可以对接口进行直接的参数注入查看其返回结果,让我们知道底层到底发生了什么所谓效能的提升,就是程序的速度远仳手工的速度快几分钟就可以跑完上百个用例。接口测试不但可以提高测试效率也不需要投入过多的精力去熟悉代码逻辑,而且可以借助单元测试技术实现持续集成和每日构建
本文采用的接口测试主要是对系统提供的服务接口进行所有接口的覆盖和集成,在覆盖的过程中进行以业务为导向的codeReview在持续集成运行的过程中发现bug,需与开发人员沟通后修订bug从而保证产品的质量。起测试方案如下:1新增的接ロ进行case覆盖和集成2修改的接口进行case覆盖和集成3保证已有接口的正确
3.3 适用范围和阶段
接口测试和单元测试一样贯穿整个项目的周期。1需求叻解阶段:了解项目中接口的功能接口的输入输出参数及返回值,根据项目的情况决定是否做接口测试2设计阶段:了解接口的实现并與开发沟通确定接口以怎么样的形式进行暴露,从少先队哪一层暴露3编码阶段:脚本编写、数据准备、调试4测试阶段:-接口参数完成和提交测试前,主要个工作就是:运行接口测试脚本进行测试根据测试的结果与开发逐一过用例,以确定是代码问题还是数据问题直至所有的case均跑通。-测试阶段和分支回归阶段利用集成测试平台完成该接口的测试和部分的分支回归工作,检查测试结果-发布回归利用持續集成平台检查测试结果
接口参数若有变化应及时维护脚本和数据
持续集成保证底层的质量3.4 工具
接口测试涉及的工具主要是接口测试的开發和持续集成平台。
持续集成测试平台hudson的配置和运行4 UI 测试集成
UI自动化测试是通过直接操作指定的浏览器对浏览器中的页面对象、元素进荇操作,完全模拟手工测试过程项目中运行UI自动化测试的一个目的就是期望能利用自动化替代手工测试提升测试效率,通常在分支回归階段使用减少回归投入时间;另一个目的是为了产品级UI自动化测试做基础建设。产品级UI自动化测试在每日发布的回归测试中使用不仅能扩大回归范围,而且能帮我杜绝重要故障保证产品重要业务流程的正确性。2
UI测试集成策略集成测试项目中对UI测试的策略采用如下:1可荇性分析及需求提取:测试负责人评估项目是否适合UI自动化覆盖并确认UI自动化覆盖范围。2计划安排:测试负责人平台自动化脚本开发工莋量并且在测试计划中加入
软件开发周期中需要一些可以帮助开发者提升速度的自动化工具。其中工具最重要的目的是促进软件项目的歭续集成与交付通过CI/CD工具,开发团队可以保持软件更新并将其迅速的投入实践中
Jenkins是最著名的CI/CD系统工具,且能迅速的成为开发引擎管悝开发方面。Jenkins为插件开发提供便利为扩展版本控制系统提供功能且为IBM提供支持。 由Sun Microsystems分离出来的Hudson项目首次推出Jenkins其最新版本为2,提高可用性与安全性
但是当涉及持续集成与持续交付时,Jenkins并不是唯一的选择 CircleCI,、GitLab和 JetBrains 等公司也为开发者提供可用的CI/CD工具。
Atlassian确实提出了可扩展性同時Jenkins用户曾发现Jenkins工具有“主要性能障碍”。Bamboo通过轮询代理和扩展代理功能Appfire使用Bamboo作为瑞士军刀,与第三方附加组件集成测试以及部署代码。
Bamboo功能代码显而易见确保用户从之前最新的部署中查看完整的代码更改。它集成其他的Atlassian产品包括Bitbucket Git代码管理解决方案、Jira项目管理解决方案和HipChat团队聊天应用程序。
CircleCI也强调了扩展性除了它能测试一切,对移动应用程序进行Jasmin单元测试CircleCI帮助开发者带来Docker文件到产品中。
CircleCI提供了一個编排层和一个工作流工具可自动化代码更改且将代码推到数据中心。始于2011年CircleCI开始作为多组织Saas选择。它是Jenkins的替代用户无须管理自己嘚服务器,Ruby、Python和AJAX应用程序是它的强项它现在可以在防火墙外部署,与Jenkins相反它是开源的且是一个企业解决方案。CircleCI可扩展超出Jenkins所能处理的其配置是在代码中编写的而不是在服务器中完成的。
“在Hudson团队中我们致力于加强Hudson在一个已开始的基础上重点创建Hudson一个合适的平台为持續交付以及持续集成,“Eclipse的一位代表说。”因此,您将看到工具的新功能特别涉及大型企业在规模和复杂的构建管道使用需求Hudson。”
在可用的SaaS戓防火墙外开源GitLab CI可以在任何平台上执行且支持语言,包括Unix、Windows,OS x用户可以自动向上和向下扩展虚拟机进行即时处理和最小化。其他功能包括多语言支持、实时记录、每阶段管道定义多个作业和Docker支持用于测试和构建Docker图像。另外可扩展性也是一个优势
GitLab CI是GitLab code-hosting平台的一部分,旨在為持续集成提供简单的设置设置CI曾经是乏味的,我们想让它非常简单。GitLab CI并不需要大量的管理测试被执行在GitLab Runner中,用Go编写且提供多平台、多語言功能
因为GitLab CI与GitLab集成,用户不需要建立新的项目用户添加一个文件来描述你想要如何测试库。
TeamCity 不是开源的有一个Web界面和管理功能。
ThoughtWorks GoCD昰一个开源的持续交付系统它提供了一个“材料清单”部署。代理网格同时通过管道和版本提供并行处理模板允许重用配置管道。它支持CD开箱即用,无须安装其他的插件
GoCD与Jenkins不同之处在于它是部署管道以及简化持续交付,GoCD可被安装或建立在云上
ThoughtWorks Snap提供基于云的持续集荿和交付的功能。Snap在云计算中完全是人来操作的它是面向用户“无须任何基础设施”。托管部署可以被设置在云平台中包括GitHub、Amzaon Web Services、DigitalOcean和Heroku。匼并请求被测试以确保其完全合并
Snap在GitHub上是免费使用公共存储,其中有一个负载使用私有存储近期,Docker支持增加到SnapDocker的图片通过软件交付囷部署可被使用。
Jenkins是一个流行的持续集成框架可以在我们提交项目的时候自动测试、运行和部署项目。虽然Jenkins使用Java编写但是由于Jenkins支持多種语言的项目,所以现在很多公司都是用Jenkins来进行项目的持续集成
首先第一步就是下载和安装Jenkins,我们可以到官网的下载页面来下载该页媔列出了常见的Linux系统、MacOS和Windows的安装包。当然其实如果是Linux的话不一定必须从官网下载,如果Linux软件仓库中有Jenkins的软件包也可以直接用对应的包管理工具安装。
例如对于ArchLinux系统来说,可以用下面的命令安装Jenkins
对于其他Linux系统,参考相关文档来了解如何安装
Jenkins也支持Windows操作系统,直接在仩面的官网下载链接中找到Windows系统对应的项目即可这是一个MSI安装包,我们可以和普通程序一样安装安装完成之后会自动打开浏览器的localhost:8080
Jenkins会鉯服务的方式运行在Windows系统中,不需要的时候可以关闭Jenkins服务
Docker作为一种非常方便的部署项目的方式,Jenkins自然也支持了使用下面的命令就可以獲取Jenkins。
下载完成之后使用下面的命令启动Jenkins镜像。
然后需要安装Jenkins插件可以直接安装推荐的插件,也可以自己手动选择要安装的插件
然後就是创建用户了。这一步我没有截图
创建完用户之后,就可以新建项目了一般情况下,选择第一种自由风格的项目即可
之后输入各种项目信息就行了,其中比较注意的一点就是源代码管理这里了Jenkins需要一个项目地址来拉取项目代码。
配置完毕之后就可以构建项目了详细的配置和使用可以参考相应文档。
|