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