1. 程式人生 > >使用jenkins pipeline,併發selenium測試 --- 你值得了解

使用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{
                           sh 
"sleep 20" } } } //----------------------------------------------------------- stage('Run_test2') { agent { label "10.3.208.151" } steps { script{ sh "sleep 10" } } } //----------------------------------------------------------- //---------------------------------------------------------- } } } }
View Code

   這麼簡單的一個併發指令碼,看看執行時間,總的構建時長為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的各種使用方法,過程中的各種坑。有問題大家可以留言。