使用jenkins pipeline,併發selenium測試 --- 你值得了解
一、契機
相信很多使用selenium進行UI測試,再對接jenkins時,都是簡單的在jenkins上將命令輸入就完事了。
但是,相信你一定會遇到以下問題:
1、你需要同時跑不同檔案或不同類的用例,怎麼處理?用selenium grid,但我僅僅是功能,不想去區分瀏覽器,並且程式碼中我也不想寫grid?
2、在jenkins中併發,怎麼將報告合併成一份?
3、用測試框架的併發外掛,比如nose processes, pytest的xdist,都是在一臺機器上,執行selenium 同時開啟多個瀏覽器,你確保機器能受得了?
二、思路
帶著以上幾個問題,網上一直沒有好的解決方法,普遍使用的是selenium grid,但相信很多人對grid都不喜歡
最近在看jenkins中的pipeline模式,發現其中有一個很好用的功能:parallel 併發,那就來用parallel來解決我們以上的問題
三、解決
jenkins的pipeline就不多介紹,看官網https://jenkins.io/doc/book/pipeline/就行,以後看時間會寫寫這方面的文章
1)先看看用Declarative方法寫的併發parallel
pipeline { agent none stages { stage('Run Tests') { parallel { stage('Run_test1') { agent { label "10.3.208.151" } steps { script{ shView Code"sleep 20" } } } //----------------------------------------------------------- stage('Run_test2') { agent { label "10.3.208.151" } steps { script{ sh "sleep 10" } } } //----------------------------------------------------------- //---------------------------------------------------------- } } } }
這麼簡單的一個併發指令碼,看看執行時間,總的構建時長為23秒
那有了這個基礎後,我們將我們的在jenkins上執行selenium指令碼全改成pipeline方式,按類或者按檔案執行,這裡就由你自己控制了。
2)問題一解決了,我們看看問題二,將報告合併
相信很多測試者生成的報告有很多種,有xml格式的,有html格式的,有用allure生成的。這裡我們介紹xml和allure格式的,因為html格式的還要自己寫合併程式,太麻煩
1, xml方式的,在jenkins上會直接生成TestReport,所以這個很好處理,只需要在pipeline中的每個stage中用post將 xml釋出,如下
post { always { junit 'acl.xml' } }
2, allure方式的,這個我們瞭解下allure原理,allure是將本地的生成的xml檔案最後用allure命令生成報告的,所以我們的難點是怎麼拿到在不同機器上的檔案,然後再放在一臺機器上,最後生成報告。
還好,pipeline有一個stash的方式,是在構建後將檔案存在master上,給後續的job使用,後續的job再用unstash拿到
所以我們可以在每個stage中這麼寫
stash includes: 'allure-results\\*', name: 'xxxxx'
將報告存起來,名字叫xxxx
然後我們在parallel併發的stage外再起一個stage,拿到檔案,最後生成報告,如下
stage('Report') { agent { label "master" } steps { unstash 'xxxxxx' unstash 'xxxxxx2' } post { always { allure includeProperties: false, jdk: '', results: [[path: 'allure-results']] } } }
完美解決
3) 任務的併發限制
如果你想控制你的併發數量,可以有兩種方式實現
1,用節點的executors來限制
2,下載jenkins外掛 Throttle Concurrent Plugin
好了,基本解決方案已實現,但實際落地,還需要學習很多。比如jenkins中pipeline的各種使用方法,過程中的各種坑。有問題大家可以留言。