Jenkins + selenium + pytest + allure 自动化测试

本篇文章将描述如何使用 jenkins,selenium,pytest 和 allure 运行自动化测试并且生成 allure 报告

我们知道 selenium 需要使用能够相互兼容的 driver 和 chrome 才能正确工作,不兼容的版本之间会造成各种古怪问题

所以这里我直接使用了 joyzoursky/python-chromedriver:3.7-selenium 镜像作为base,但是这个镜像没有安装 allure

所以用这个镜像作为base我创建了一个自己的镜像 ibaibai/selenium-runner 

Jenkinsfile

def label = "mypod-${UUID.randomUUID().toString()}"

podTemplate(label: label, yaml: """

kind: Pod

metadata:

  name: selenium-runner

spec:

  imagePullSecrets:

  - name: regcred

  containers:

  - name: selenium-runner

    image: libaibai/selenium-runner

    imagePullPolicy: Always

    command:

    - /bin/cat

    tty: true

    volumeMounts:

      - name: jenkins-docker-cfg

        mountPath: /root

    securityContext:

      privileged: false

  volumes:

  - name: jenkins-docker-cfg

    projected:

      sources:

      - secret:

          name: regcred

          items:

            - key: .dockerconfigjson

              path: .docker/config.json

"""

) {

    node(label) {

      stage('Calling selenium') {

        sh label: '', script: 'free -m'

        timeout(time: 1, unit: 'HOURS'){

          dir('workdir') {

            git credentialsId: '1b09346a-ac0b-4e71-b9c3-2e73ef43dbc0', url: 'https://lizhe@lizhe.name/autotest.git'

          }

        }

        container(name: 'selenium-runner', shell: '/bin/sh') {

          catchError {

            sh label: '', script: ' sh -c set +e; pytest /home/jenkins/workspace/testtires/workdir/pytestpoc/hello.py --alluredir allure-results ; set -e'

          }

          

          sh label: '', script: ' whoami'

          sh label: '', script: ' chmod -R 777 /home/jenkins/workspace/testtires/allure-results'

          allure includeProperties: false, jdk: '', results: [[path: 'allure-results']]

        }

        sh label: '', script: 'free -m'

      }

 

    }

}

这个脚本中可控的东西并不多,主要是需要调用

allure includeProperties: false, jdk: ”, results: [[path: ‘allure-results’]]

来生成allure报告, 注意这里 allure 使用的 results 目录是 allure-results

这个目录的声明需要和前面 py 脚本生成的result路径一致

hello.py –alluredir allure-results

hello.py

import allure

import pytest

import os, sys

from selenium import webdriver

import time

 

@allure.feature('test_module_01')

@allure.story('test_story_01')

def test_case_01():

    option = webdriver.ChromeOptions()

    option.add_argument("headless")

    option.add_argument("--no-sandbox")

    driver = webdriver.Chrome(chrome_options=option)

    # driver = webdriver.Chrome()

    driver.get("https://lizhe.com/?site=abc")

    time.sleep(10)

    print(driver.title)

    driver.get("https://lizhe.com/abc/zh/Root/Tire/c/50000000")

    tires = driver.find_elements_by_class_name("product__listing--price")

    print(len(tires))

    for tire in tires:

        print(tire.text)

    driver.quit()

    assert len(tires) != 0

 

@allure.feature('test_module_01')

@allure.story('test_story_02')

def test_case_02():

    assert 0==1

 

@allure.feature('test_module_01')

@allure.story('test_story_03')

def test_case_03():

    assert 0==0

 

if __name__ == '__main__':

    pytest.main(['-s', '-q', '--alluredir', 'allure-results'])

 

allure.issues.tracker.pattern

http://tracker.company.com/%s

git pipeline 指定 tag

def label = "mypod-${UUID.randomUUID().toString()}"
podTemplate(label: label, yaml: """
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:debug
    imagePullPolicy: Always
    command:
    - /busybox/cat
    tty: true
    volumeMounts:
      - name: jenkins-docker-cfg
        mountPath: /root
  volumes:
  - name: jenkins-docker-cfg
    projected:
      sources:
      - secret:
          name: regcred
          items:
            - key: .dockerconfigjson
              path: .docker/config.json
"""
) {
    node(label) {
    stage('Build with Kaniko') {
      sh label: '', script: 'free -m'
      timeout(time: 2, unit: 'HOURS'){
        dir('ab7files') {
          checkout scm: [$class: 'GitSCM', userRemoteConfigs: [[url: 'xxxxxx.git', credentialsId: 'xxxxxxx']], branches: [[name: 'refs/tags/v1.0.0']]],poll: false
        }
      }
      timeout(time: 2, unit: 'HOURS'){
        dir('hybrisfiles') {
          git branch: 'master', credentialsId: 'xxxxxx', url: 'xxxxxx.git'
        }
      }
      timeout(time: 2, unit: 'HOURS'){
        dir('tools') {
          git branch: 'master', credentialsId: 'xxxxxx', url: 'xxxxxxxx.git'
        }
      }
      timeout(time: 2, unit: 'HOURS'){
        dir('dockersource') {
          git branch: 'master', credentialsId: 'xxxxxxxxxxx', url: 'xxxxxxxxxxxx.git'
        }
      }


      container(name: 'kaniko', shell: '/busybox/sh') {
        withEnv(['PATH+EXTRA=/busybox:/kaniko']) {
          sh '''#!/busybox/sh
          /kaniko/executor -f /home/jenkins/workspace/buildhybris/dockersource/hybris/Dockerfile -c `pwd` --destination=xxxx/xxxx:test0.1
          '''
        }
      }
    }
  }
}

kubectl create secret docker-registry regcred --docker-server=https://index.docker.io/v1/ --docker-username=baibaibaibai --docker-password=7575757575 --docker-email=marshal_li_b@163.com -n autotest