一、契機
相信很多使用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{ sh "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的各種使用方法,過程中的各種坑。有問題大家可以留言。