Windows 桌面應用自動和 Jenkins 持續整合

imzack發表於2020-05-15

眾所周知,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: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批處理檔案,內容如下:

  • 執行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》: https://www.cnblogs.com/sparkdev/p/7102622.html
[2] 標籤和過濾:* http://www.cuketest.com/zh-cn/features/tags.html*

相關文章