众所周知,Jenkins 作为 CI/CD 的主流工具,除了执行编译流水线,还能执行功能测试和回归测试,但不少同学在配置 Jenkins 执行桌面 GUI 应用的自动化测试时经常会有些疑惑。本文我们会结合常用的桌面自动化测试工具 CukeTest,讲解如何在 Jenkins 里配置自动化测试。

桌面应用自动化通常指 Windows 应用、包括原生应用、混合应用、.NET、WPF 等,以及 Java 应用等。这些都是可以通过 Jenkins 配合 CukeTest 实现。CukeTest 除了有图形化操作界面,还提供了命令行运行工具,因此适合与 Jenkins 配合完成桌面自动化。下面使用这两者实现桌面应用的自动化 测试。

依赖

环境

准备文件

实现方法

问题原因

传统安装方法会将 Jenkins 注册为一个系统服务,而 Windows 的系统服务会在用户登录前启动,与用户登录后的桌面不是同一个会话(session),会导致 Jenkins 服务无法操作登录以后的桌面,这也是 Windows 服务状态下的 Jenkins 不能直接执行桌面自动化的原因。

因此解决问题的关键在于让 Jenkins 执行端与桌面操作的在同一个会话中,这可以有两种方法:

  1. 避免将 Jenkins 注册为服务:而使用命令行安装和启动 Jenkins;
  2. 使用 Jenkinsmaster/slave 模式:master 以 Windows 服务运行,而 Jenkinsslave 使用 Windows 的计划任务登录后自动启动。

从命令行安装 Jenkins

由于正常的安装会使得 Jenkins 注册为一个服务,而服务无法操作 Windows 桌面,因此我们采用从命令行的方式,让 Jenkins 在当前桌面会话中启动。

java -jar jenkins.war --httpPort=8090

为避免与默认的 Jenkins 实例发生端口冲突,这里使用--httpPort选项设置了另一个监听端口。接着打开浏览器访问http://localhost:8090Jenkins 管理界面,如果是第一次进入将进入运行向导,按照指引完成设置。可以进入

从命令行安装的 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批处理文件,内容如下:

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,如下:

完成配置后下方会生成相应的运行命令,这个命令放到 Jenkins 中就能够运行了。

Freestyle Object 示例

执行接下来的操作前,建议先安装Cucumber reports插件,用于解析运行报告并显示。

在 Jenkins 中新建 Freestyle Object 项目,我们在构建(Build)环节添加两个命令行步骤,执行以下两步:

  1. 将项目文件复制到 Jenkins 的工作空间;
  2. 使用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*


↙↙↙阅读原文可查看相关链接,并与作者交流