Pickles與Jenkins的結合

在上一篇文章中,介紹了如何使用Pickles將Feature的Test case自動轉成Live document。這樣的方式雖然已經能夠很方便,很快速的產出Live document,但是每次還是需要"人"來執行轉換指令,還是需要浪費到人的時間。那該如何讓Featurec和Live document的轉換變成自動化呢?

本篇文章將介紹如何透過CI Server在每一次的系統建置過程中,依序將建置、測試、產Live document一鏡到底,絕不NG不需要人工介入

Pickles執行指令

上一篇文章中所提到使用指令執行MsTest與Pickles是分開的,在這邊需要將這些指令整合成為一份cmd檔案,整合的結果如下

@echo off
IF exist "C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\TestResults" ( echo "C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\TestResults" exists ) ELSE ( mkdir "C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\TestResults" && echo "C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\TestResults" created)

if Exist 'C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\TestResults\TestResult.trx'
del "C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\TestResults\TestResult.trx"

cd C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\
MsTest.exe /testcontainer:"C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\Pickles_Website_MsTest_Lab.Test\bin\Debug\Pickles_Website_MsTest_Lab.Test.dll" /resultsfile:"C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\TestResults\TestResult.trx"

cd C:\Program Files (x86)\Jenkins\jobs\NineYi.SCM\workspace\packages\Pickles.CommandLine.*\tools

pickles.exe run --feature-directory="C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\Pickles_Website_MsTest_Lab.Test" --output-directory="C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\PicklesResults" --documentation-format="dhtml" --test-results-format=mstest --link-results-file="C:\Program Files (x86)\Jenkins\jobs\Pickles_MsTest\workspace\TestResults\TestResult.trx"

這份整合指令主要可以分為四個步驟,以下將各別說明每一個步驟所代表的用意

  1. 檢查要存放MsTest測試結果的資料夾是否存在,不存在的話將建立TestResults資料夾
  2. 檢查TestResults資料夾中testResult.trx是否存在,因為MsTest無法將新的測試結果直接覆蓋掉舊的測試結果,所以會造成執行錯誤而中斷流程,所以必須在執行測試前先檢查上一次的測試結果是否存在,存在則將其刪除。
  3. 執行MsTest.exe,會指定Dll位置與測試結果的存放位置
  4. 執行Pickles.exe

當執行這一份cmd時,就能夠執行測試並執行Pickles.exe產生Live document。

CI Server設定

這邊將使用Jenkins建置CI Server,這邊將不會介紹

  • 如何安裝Jenkins

  • 自動化編譯設定

  • 自動化測試設定

如果有需要學習如何安裝Jenkins,如何設定的朋友可以到CI Server三十天,先學習如何安裝與設定。

Jenkins上設定執行Pickles

有了前面所敘述的指令後,就可以在Job建置的流程中加入執行Pickles整合指令。由於該指令中包含測試的執行,所以原本Job設定中如果有包含執行測試,請記得移除。

Job設定

設定完成後就可以按下儲存,並且手動建置試試看是否成功。在建置的過程中,可以由Jenkins的Console output可以看到一些執行訊息

發布Live document

當Job建置完成後,Live document也跟著產生在CI Server上。但是,為了讓團隊成員能夠方便快速的瀏覽,所以需要將這一份文件發佈到CI Server上。在Jenkins上安裝HTML Publisher Plugin,再透過這一個擴充套件,將Live document能夠在CI Server上瀏覽。

HTML Publisher Plugin一樣需要在Job的Configure中設定

設定完成與建置後,可以在頁面上看到HTML Report的選項,點下後就可以看到自動產生的Live document

Jenkins安全性設定

Jenkins在1.641/1.625.3版後,增加了安全性設定,預設在瀏覽HTML Report時不能執行任何的Script。但是,由Pickles所產生出的HTML在載入完成後,是需要執行一段Javascript,將資料填到HTML的DOM中。

如果沒有修改Jenkins的安全性設定,在瀏覽Report會變成這樣

由瀏覽器的偵錯工具可以看到頁面上禁止執行任何的Script,所以無法將資料填到頁面上,而導致這樣的情況。那該如何設定Jenkins的安全性呢? 在Jenkins的文件中,可以找到一份文件。在文件中提到,如果是透過HTML Publisher Plugin來發布Report,則需要先將HTML Publisher Plugin先升級到1.10版,並且需要執行一段Script

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox; script-src 'unsafe-inline';")

有了指令,那該到哪邊執行呢?在Manage Jenkins頁面中,有一個Script Console的功能

執行完成後,下方會顯示結果

但是,HTML Report還是一樣不能看是在莊孝維嗎

原因是因為,Jenkins的文件中所設定的屬性可能已經過期,現在新的瀏覽器認不出該屬性,所以還是一樣封鎖Script的執行。在Content Security Policy的網頁中可以找到,現在要設定瀏覽器可以執行Script,是設定"allow-scripts",所以將剛剛Jenkins執行的Script改為

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox; allow-scripts 'unsafe-inline';")

執行完成後,這個時候再連到Report的頁面,會發現還是一樣沒有資料您老師咧。其實筆者也不知道為什麼沒有作用。但是,另外找到了另一個解法,在系統的Jenkins資料夾中,會有一份Jenkins.xml,需要將Xml中,"arguments"的參數稍微修改

<arguments>
    -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle "-Dhudson.model.DirectoryBrowserSupport.CSP=allow-scripts 'unsafe-inline';" -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"
</arguments>

存檔後,需要透過Windows的服務將Jenkins Server重啟,重啟完成後就可以發現Pickles產出的HTML一切都正常了。

結論

透過CI Server將需要人工執行的事情自動化,可以移除人工的介入,減少人工成本、錯誤的操作。並且,當需求與測試案例改變,工程師也將系統修改為符合需求,當系統在CI上建置後,也會一併更新整個團隊在使用的文件,絕對不會發生系統改了而文件卻沒有修改的情形。

參考資料

免責聲明:

"文章一定有好壞,文章內容有對有錯,使用前應詳閱公開說明書"