Windows 桌面应用自动化和 Jenkins 持续集成

2,334 阅读7分钟

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

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

依赖

环境

  • Java8以上
  • Windows7或更高

准备文件

  • jenkins.war:Jenkins的WebApplicationARchive(WAR)文件,能够通过Java在各类操作系统上安装。建议使用2.107及以上版本。

实现方法

问题原因

传统安装方法会将 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: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批处理文件,内容如下:

  • 运行Jenkinsmaster
cd \JenkinsFilePath\
java -jar jenkins.war

  • 运行Jenkinsslave:
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 中就能够运行了。

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》: www.cnblogs.com/sparkdev/p/…
[2] 标签和过滤:* www.cuketest.com/zh-cn/featu…