众所周知,Jenkins 作为 CI/CD 的主流工具,除了执行编译流水线,还能执行功能测试和回归测试,但不少同学在配置 Jenkins 执行桌面GUI应用的自动化测试时经常会有些疑惑。本文我们会结合常用的桌面自动化测试工具CukeTest,讲解如何在Jenkins里配置自动化测试。
桌面应用自动化通常指Windows应用、包括原生应用、混合应用、.NET、WPF等,以及Java应用等。这些都是可以通过 Jenkins 配合 CukeTest 实现。CukeTest 除了有图形化操作界面,还提供了命令行运行工具,因此适合与 Jenkins 配合完成桌面自动化。下面使用这两者实现桌面应用的自动化 测试。
依赖
环境
- Java 8 以上
- Windows 7 或更高
准备文件
- jenkins.war:Jenkins 的 Web Application ARchive(WAR)文件,能够通过 Java 在各类操作系统上安装。建议使用
2.107
及以上版本。
实现方法
问题原因
传统安装方法会将 Jenkins 注册为一个系统服务,而 Windows 的系统服务会在用户登录前启动,与用户登录后的桌面不是同一个会话(session),会导致Jenkins服务无法操作登录以后的桌面,这也是Windows服务状态下的 Jenkins 不能直接执行桌面自动化的原因。
因此解决问题的关键在于让 Jenkins 执行端与桌面操作的在同一个会话中,这可以有两种方法:
- 避免将 Jenkins 注册为服务:而使用命令行安装和启动 Jenkins;
- 使用 Jenkins master/slave模式:master以Windows服务运行,而 Jenkins slave使用 Windows 的计划任务登录后自动启动。
从命令行安装 Jenkins
由于正常的安装会使得 Jenkins 注册为一个服务,而服务无法操作 Windows 桌面,因此我们采用从命令行的方式,让 Jenkins 在当前桌面会话中启动。
java -jar jenkins.war --httpPort=8090
为避免与默认的 Jenkins 实例发生端口冲突,这里使用--httpPort
选项设置了另一个监听端口。接着打开浏览器访问http://localhost:8090可以进入Jenkins管理界面,如果是第一次进入将进入运行向导,按照指引完成设置。
从命令行安装的 Jenkins 的路径为%USERPROFILE%\.jenkins\
。
注意这个方法启动的是 Jenkins master,也就是控制台部分,如果是执行器环境,应该使用 Jenkins 的分布式环境安装 Slave(在后来的版本中称作 Agent)。
部署 Jenkins Slave(Agent)
Jenkins 描述执行器的术语在旧文档中为
slave
,在新文档中为agent
,指代的都是同一种东西,在下面我们统称为slave
。
在更多的场景中,我们会在本机上运行一个 Jenkins 的调度器(Master),在服务器上运行具体的测试项目,这就需要按照与上面类似的方法部署 Jenkins 的执行器(slave/agent)。具体步骤可以参考《Jenkins: 安装 master 和 slave》[1]。
通过计划任务在登录后启动 Jenkins
Windows 提供了计划任务的功能,可以创建一个在登录时启动的计划任务。任务启动时运行一个.bat
批处理文件,内容如下:
- 运行 Jenkins master
cd \JenkinsFilePath\
java -jar jenkins.war
- 运行 Jenkins slave:
cd \JenkinsFilePath\
java -jar {Slave or Agent .jar File} -jnlpUrl http://{Your Jenkins Server}:{Your Jenkins Port}/computer/{Your Jenkins Node}/slave-agent.jnlp [-secret {Your JenkinsSecret Character}]
举个例子比如:
java -jar agent.jar -jnlpUrl http://localhost:8080/computer/Slave1/slave-agent.jnlp -secret e3637f4dfeb6c1bf8298aee7cb56cc4b79f4add79dd19fcd3fdf34fe21772b2f -workDir ""
上述例子使用的是新版 Jenkins 因此使用了
agent.jar
启动程序,节点的名称为Slave1
,并且由于添加了全局安全设置(Global Security),因此需要使用密码字符串认证登录。
即使忘记了 Slave 的启动指令,也可以前往
Manage Node
页面查看具体的命令。
使用
创建桌面自动化样例
创建一个桌面自动化的项目,如果有合适的项目可以直接跳过这一步。打开 CukeTest,可以在欢迎界面的右下角创建一个windows_controls
的样例。
配置启动命令
CukeTest 提供了运行命令的配置界面,它帮助生成你需要的命令行语句。打开项目后,点击工具栏中“运行项目”按钮右下角的▼
编辑运行配置。新建运行配置RunInJenkins
,如下:
- 项目名称:即运行配置的名称;
- 报告格式、报告文件、输出目录:运行结果报告的相关选项。
- 报告格式:报告的文件格式,默认仅选中
html
,由于Cucumber reports
生成报告需要.json
文件,因此将json
选项勾选上; - 报告文件:报告的命名方式,
使用相同的文件名
会使旧的报告文件被覆盖;每次新建文件名
会保留之前所有的报告文件。这里我们选择前者是因为 jenkins 自带了运行历史管理,并且单个报告文件有利于 Cucumber reports 插件生成页面; - 输出目录:报告的存储目录,缺省为项目根目录的
reports
文件夹下,因此不需要修改;
- 报告格式:报告的文件格式,默认仅选中
- 标签过滤器:根据标签筛选运行内容。如果项目过大,建议为各个场景打上标签并通过过滤器分别运行。关于标签的更多内容点击标签和过滤[2]
完成配置后下方会生成相应的运行命令,这个命令放到 Jenkins 中就能够运行了。
Freestyle Object 示例
执行接下来的操作前,建议先安装
Cucumber reports
插件,用于解析运行报告并显示。
在 Jenkins 中新建 Freestyle Object 项目,我们在构建(Build)环节添加两个命令行步骤,执行以下两步:
- 将项目文件复制到 Jenkins 的工作空间;
- 使用
cuke
命令运行项目;
因此两个命令行步骤中的内容分别为:
xcopy C:\Program File\cuke\windows_controls /S /Y
chcp 65001 && cuke --run --format html --format json --overwrite --no-color
由于 Jenkins 的
Console Output
显示格式为 plain text,无法显示命令行输出的样式,这会导致样式标识符呈现为乱码,因此在 cuke 命令后追加了--no-color
选项。
配置完如下所示:
添加可视化运行报告
在构建后(Post Build)环节,可以添加一个 Cucumber reports 步骤来生成可视化的运行报告。
在 Cucumber reports 的“Advanced”配置中,将 File Include Pattern,即生成报告所使用的.json
文件的路径,这里我们指定为*/reports/*.json
,避免匹配到package.json
文件发生报错。
Pipeline 项目实例
使用 Pipeline 项目也类似,只是用 pipeline 语法将上节中的步骤包括起来即可,如下:
pipeline {
agent any
stages {
stage('Build') {
steps {
bat 'xcopy C:\Program File\cuke\windows_controls /S /Y'
}
}
stage('Test'){
steps {
bat 'chcp 65001 && cuke --run --format html --format json --overwrite --no-color'
}
}
stage('Cucumber Report'){
steps {
cucumber buildStatus: "UNSTABLE",
fileIncludePattern: "**/reports/*.json",
jsonReportDirectory: "reports"
}
}
}
}
运行
点击开始构建(Build Now)运行,可以注意到桌面应用Simple Style.exe
顺利的启动并且开始执行自动化,在完成后可以再 Jenkins 左侧查看Cucumber reports
,报告界面如下:
关于报告样式:CukeTest 的运行结果返回了
.json
文件,因此可以根据该运行结果使用自定义的样式满足报告需求。
总结
对于 上面介绍的两种Jenkins方式,master/slave是比较推荐的选择。master可以运行在任何平台上,甚至是Linux平台。而slave可以根据自动化的需要运行在Window上。但 CukeTest 不仅于运行在Windows上,它也可以在Linux或Mac上执行自动化测试。因此您可以根据需要配置多个平台的Jenkins slave,根据需要执行在不同的平台上的自动化测试,如果您的项目还没有实现自动化,不妨来试试吧!
参考资料
[1] | 《Jenkins: 安装 master 和 slave》: https://www.cnblogs.com/sparkdev/p/7102622.html |
[2] | 标签和过滤: http://www.cuketest.com/zh-cn/features/tags.html |