WebUI自动化测试框架Demo(下)

上篇博客我们已经完成了Demo Project的代码优化, 这篇文章我们就利用Jenkins和GoCD这两种工具来实现Demo Project的持续集成。
CI&CD介绍
是什么
持续集成CI(Continuous Integration)
持续集成指的是,频繁地(一天多次)将代码集成到主干。基本流程为:
提交代码
执行第一轮测试(单元/集成测试)
代码合到master
持续交付(Continuous Delivery)
持续交付指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,当前代码就是一个可以直接部署的版本。基本流程为:
代码集成完成
构建项目,将源码转换为可以运行的实际代码
执行第二轮测试(端到端/手工测试)
持续部署(Continuous Deployment)
持续部署是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。基本流程为:
- 持续交付流程完成
- 利用工具自动部署到生产环境
持续部署和持续交付的区别在于,前者可以自动化部署过程,后者只能手工部署。
怎么做
CI&CD的实现离不开自动化工具,比较流行的有关注持续集成的Jenkins/Travis CI/…, 关注持续交付/部署的GoCD等等。
使用Jenkins集成
Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
完成后的效果,小太阳标志:
首先把本地的DemoProject推送到Github,然后请直接按照 这篇文章的Jenkins部分 设置,已经写的很详细了,主要包括:
1. Jenkins安装:在本地8080端口运行Jenkins并设置管理员账号
小知识:WAR(Web应用程序归档,英語:Web application archive),也是一种Java归档,存储XML文件、Java类、JSP和Web应用程序中的其他文件。
2. Jenkins配置:添加JDK和Maven
3. Jenkins添加GitHub server:Github生成token并在github的DemoProject项目里添加本地Webhook
这部分Payload URL里的Jenkins server IP就是你电脑的IP,可以通过ifconfig命令获得,在结果的最后一行。
4. Jenkins新建并配置Maven项目:绑定Github的DemoProject
5. Jenkins运行Maven项目并查看结果
使用GoCD集成
GoCD是一种开源工具,用于软件开发,可帮助团队和组织使软件的持续交付/部署(CD)自动化。
完成后的效果,绿色的pipeline:
下载GoCD Server&Agent
Server和Agent
GoCD的基础架构由Server和Agent组成,Server 负责配置和控制,Agent负责执行。
Server:控制一切配置,关联仓库,触发pipeline执行,配置每个Job对应的Agent,将Job分配给Agent去执行,整理信息判断该Stage的状态。
Agent:接收Server分配的Job,执行Job下的Task(运行命令、部署等),并将Job的状态报告给Server。
打开GoCD官网 下载页面, 根据系统下载:
这里我们下载19.9.0版本,所以点击下方 show old releases按钮,下载Server&Agent:
解压后放在新建的Pipeline文件夹下,就安装完成了:
启动Server&Agent
首先确保自己安装了Java11, 然后切换到server目录执行:
./bin/go-server console
启动GoCD Server:
Server启动成功后,默认的端口号是 8153/8154 (HTTPS),访问 https://localhost:8154 就可以看到GoCD Server页面啦:
打开一个新的终端窗口,同样切换到agent目录执行:
./bin/go-agent console
启动GoCD Agent:
创建Pipeline
回到Server页面,点击页面按钮,创建Pipeline。
Pipeline: 管道,在GoCD里,Pipeline就像是一个工作流水线。它的结构如下所示:


Material
用来触发Pipeline的条件,可以是代码的存储仓库,可以是其他Pipeline某个Stage执行成功后的产出。在这里,我们把Github仓库作为Material,如果有新的改动会触发Pipeline重新运行。
接着输入Pipeline名字,自定义就可以。这里我设为Auto:
输入Stage名字,这里我设为Test:
Stage
pipeline可以有多个Stage,每个Stage按照顺序执行,一个Stage Fail,则不会执行后边的Stage,pipeline也会是Fail状态。比如常见的这几个stage: Build,Package,Deploy,Smoke,FunctionTest
创建job和tasks,这里创建了一个名为run_tests的job, 并给它加上一个task,脚本命令:mvn test
Job
一个Stage可以有多个Job,多个Job之间是相互独立的,一个Job失败,不会影响其他Job的执行,但是一个Stage中的任何一个Job失败,则这个Stage失败
Task
一个Job由一个或多个Task组成,且Task按照顺序执行,一个Task fail,则后续的Task都不会被执行。Task就是Script,用命令行对代码进行进行编译,部署,或者运行测试。
点击”Save + Edit Full Config”按钮,保存pipeline并进入pipeline的设置界面,可以看到,它是按照 pipeline(Auto)-> stage(Test) -> job(run_tests)的结构展示的,在job的Tasks tab中,也已经加上了我们上边设置的mvn test:
首先打开Auto pipeline设置,在Materials Tab下,可以看到我们设置的远程仓库地址:
接着点击上边的Url, 进入Edit Material页面,给Material加上一个Destination Directory,然后保存。因为在运行pipeline的时候,Server会从远程仓库克隆代码到Agent上去运行,需要设置Destination Directory,Server就会把克隆的的代码放进这个Destination Directory里,所以它的名字一般就是代码库的名字:
接着进入job设置页面,点击右边的Tasks Tab:
点击Custom Command按钮,进入Edit Custom Command task页面。将Working Directory设为我们刚才添加的Destination Directory,然后保存:
到这里,Pipeline就已经创建好了。
运行pipeline
运行成功
回到Pipeline首页, 点击Pause按钮,取消pipeline的暂停状态,取消之后pipeline就会自动运行了:
如果我们的代码没有问题,前面的设置也做好了的话,在运行过程中应该会跳出chrome/firefox窗口测试。pipeline就会运行成功了(绿色的标志):
console log和本地目录结构解读
点击绿色状态条进入运行结果界面,里面有当前代码库的版本号,作者,以及comment信息;还可以在右侧看到运行历史,以后多次运行的时候,也可以看到之前的运行结果:
点击上图中的job名称run_tests,可以看到本次运行的console log:
观察console log我们可以理解pipeline的运行流程:
1. Server开始准备并克隆代码到Agent
上图中,Agent会生成Auto/1/Test/1/run_tests文件夹记录本次运行信息,然后,Server克隆远程代码到Agent对应的Pipeline文件夹下:
第一次运行之后,Server将会持续check远程仓库中的代码更新,并自动运行Pipeline,这是它的默认机制。
2. 设置环境变量
3. 在Agent运行task
准备工作做好之后,Server就会把Job分配给Agent去执行,这里是build代码并执行命令 mvn test , 输出内容在本系列第一篇博客介绍Maven的时候已经给大家 剖析过了 :
4. Agent将运行结果报告给Server
Agent将记录本次运行信息的文件夹Auto/1/Test/1/run_tests,上传到本地Server文件夹下:
Artifact
Artifact是运行Job的产出物,在Agent生成,由Server接收并保存。存放在上图的 artifact 文件夹下。
比如此次运行中Agent生成的Auto/1/Test/1/run_tests文件夹,就是由Server接收保存的。它有一个保存运行日志console.log的cruise-output文件夹:
运行结束之后,在页面上也可以看到它:
利用Custom Tabs展示测试报告
我们已经理解了Artifact的概念,知道它是在Agent生成,由Server接收并保存的。
还记得我们在本系列第二篇博客中提到的 TestNG测试报告 吗?它也是在Agent生成的,这里我们就新建一个Artifact来让Server接收Agent生成的TestNG测试报告,并利用Custom Tabs将它展示在页面上。
回到首页,点击Auto的设置按钮:
进入Job run_tests的Artifacts Tab, 添加一个Test Artifact:
这里的Source就是指Artifact在Agent的生成路径,由于Agent的Working Directory是AutoTest文件夹,所以这里我们用Agent本地文件夹的绝对路径 AutoTest/target/surefire-reports 来获得测试报告。
没错,Maven的surefire插件会帮我们保存TestNG测试报告index.html:
Destination就是Server存放测试报告的路径,这里是相对路径。我们指定TestResult文件夹来保存测试报告,它比较完整的路径是 run_tests/TestResult,和上文中artifact文件夹下的run_tests/cruise-output是同一级。
保存之后,切换到Custom Tabs下,新建TestResult Tab,用来展示我们获取的index.html文件,路径 TestResult/surefire-reports/index.html :
保存,然后再次运行Pipeline:
运行完成之后,在console log可以看到Agent上传测试报告的过程,首先是把surefire-reports文件夹下的内容上传到Server的TestResult文件夹,然后还上传了Agent自己生成的index.html测试报告到系统默认的testoutput文件夹:
在Artifacts Tab可以看到多了两个artifact文件夹,TestResult文件夹是我们添加的,testoutput文件夹是系统默认生成的,它们都是test artifact:
图中一共有3个index.html文件,图片下方的index.html和testoutput/result文件夹里的index.html是Agent自己生成的测试报告,内容一致,默认会放在名为testoutput的Test Artifact文件夹里。展示在Test Tab下:
TestResult Tab里展示的是我们指定的surefire文件夹下的index.html文件:
其它的pipeline设置
以上都是最基本的GoCD使用,它还有很多比较高端的设置,这里再举几个例子。
1. Label Template
pipeline的build number可以自己配置,默认是1/2/3。实际项目中,build number一般会表示特定的含义,比如版本号等等:
2. Timer Settings
可以设置触发Pipeline的运行时间,有固定的语法,比如 ‘0 0 10 ? * MON-FRI’ 就是让pipeline在周内每天早上10点整运行:
3. Agent的Resource标签
当有多个Agent时,可能每个Agent有不同的配置,不同的空间大小,根据Agent的不同,可以通过设置Resource标签指定Job在某一类的Agent上执行: