众所周知,Jenkins 作为 CI/CD 的主流工具,除了执行编译流水线,还能执行功能测试和回归测试,但不少同学在配置 Jenkins 执行桌面GUI应用的自动化测试时经常会有些疑惑。本文我们会结合常用的桌面自动化测试工具CukeTest,讲解如何在Jenkins里配置自动化测试。
桌面应用自动化通常指Windows应用、包括原生应用、混合应用、.NET、WPF等,以及Java应用等。这些都是可以通过 Jenkins 配合 CukeTest 实现。CukeTest 除了有图形化操作界面,还提供了命令行运行工具,因此适合与 Jenkins 配合完成桌面自动化。下面使用这两者实现桌面应用的自动化 测试。
2.107
及以上版本。 传统安装方法会将 Jenkins 注册为一个系统服务,而 Windows 的系统服务会在用户登录前启动,与用户登录后的桌面不是同一个会话(session),会导致Jenkins服务无法操作登录以后的桌面,这也是Windows服务状态下的 Jenkins 不能直接执行桌面自动化的原因。
因此解决问题的关键在于让 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
,指代的都是同一种东西,在下面我们统称为 slave
。
在更多的场景中,我们会在本机上运行一个 Jenkins 的调度器(Master),在服务器上运行具体的测试项目,这就需要按照与上面类似的方法部署 Jenkins 的执行器(slave/agent)。具体步骤可以参考《Jenkins: 安装 master 和 slave》[1]。
Windows 提供了计划任务的功能,可以创建一个在登录时启动的计划任务。任务启动时运行一个 .bat
批处理文件,内容如下:
cd /JenkinsFilePath/ java -jar jenkins.war 复制代码
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
,由于 Cucumberreports
生成报告需要 .json
文件,因此将 json
选项勾选上; 使用相同的文件名
会使旧的报告文件被覆盖; 每次新建文件名
会保留之前所有的报告文件。这里我们选择 前者 是因为jenkins自带了运行历史管理,并且单个报告文件有利于Cucumberreports插件生成页面; reports
文件夹下,因此不需要修改; 标签过滤器:根据标签筛选运行内容。如果项目过大,建议为各个场景打上标签并通过过滤器分别运行。关于标签的更多内容点击标签和过滤[2]
完成配置后下方会生成相应的运行命令,这个命令放到 Jenkins 中就能够运行了。
执行接下来的操作前, 建议 先安装 Cucumber reports
插件,用于解析运行报告并显示。
在 Jenkins 中新建 Freestyle Object 项目,我们在构建(Build)环节添加两个命令行步骤,执行以下两步:
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 { 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,根据需要执行在不同的平台上的自动化测试,如果您的项目还没有实现自动化,不妨来试试吧!