Jenkins UI与接口自动化测试持续集成实战

篇幅较长,要耐心阅读哦~

基础知识简要回顾

  • 持续集成、持续交付的好处与产生的必然性
  • Jenkins服务的搭建方法
  • Jenkins节点管理与用户权限
  • Jenkins插件
  • Jenkins父子多任务关联运行
  • Jenkins报警机制

目录

  1. SeleniumUI自动化测试持续集成演练
  2. 接口自动化测试持续集成演练

一、SeleniumUI自动化测试持续集成演练

Selenium自动化测试项目介绍

  • 用例业务内容:测试百度网首页搜索关键词之后,跳转页面标题的正确性
  • python代码实现
  • Web UI 测试框架 Selenium (WebDriver)
  • 自动化测试框架pytest
  • 开发工具 PyCharm
  • 源码位置:https://github.com/princeqjzh/iSelenium_Python
测试过程动作:
  • 访问首页,搜索“今日头条”,验证正确性
  • 访问首页,搜索“王者荣耀”,验证正确性
    #######测试代码知识点:
  • 运行类需继承unittest.TestCase
  • setUp()测试准备方法,用于环境初始化
  • tearDown()测试结束方法,用于环境清理
  • 所有测试执行方法需要以test_开头
  • 两个测试动作执行方法 test_webui_1()test_webui_2()
  • get_config()方法读取配置文件
  • 运行程序之前需要将配置文件iselenium.ini 复制/粘贴到自己测试执行环境的user.home目录下,并按照自己机器的实际路径配置 chrome_driver的路径
Demo代码工程讲解
  • 开发工具PyCharm
  • 本地IDE运行测试类可以创建py.test运行方法
测试代码
  • 目录树


    image.png
  • web_ut.py 文件

import allure
import configparser
import os
import time
import unittest

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options


@allure.feature('Test Baidu WebUI')
class ISelenium(unittest.TestCase):
    # 读入配置文件
    def get_config(self):
        config = configparser.ConfigParser()
        config.read(os.path.join(os.environ['HOME'], 'iselenium.ini'))
        return config

    def tearDown(self):
        self.driver.quit()

    def setUp(self):
        config = self.get_config()

        # 控制是否采用无界面形式运行自动化测试
        try:
            using_headless = os.environ["using_headless"]
        except KeyError:
            using_headless = None
            print('没有配置环境变量 using_headless, 按照有界面方式运行自动化测试')

        chrome_options = Options()
        if using_headless is not None and using_headless.lower() == 'true':
            print('使用无界面方式运行')
            chrome_options.add_argument("--headless")

        self.driver = webdriver.Chrome(executable_path=config.get('driver', 'chrome_driver'),
                                       options=chrome_options)

    @allure.story('Test key word 今日头条')
    def test_webui_1(self):
        """ 测试用例1,验证'今日头条'关键词在百度上的搜索结果
        """

        self._test_baidu('今日头条', 'test_webui_1')

    @allure.story('Test key word 王者荣耀')
    def test_webui_2(self):
        """ 测试用例2, 验证'王者荣耀'关键词在百度上的搜索结果
        """

        self._test_baidu('王者荣耀', 'test_webui_2')

    def _test_baidu(self, search_keyword, testcase_name):
        """ 测试百度搜索子函数

        :param search_keyword: 搜索关键词 (str)
        :param testcase_name: 测试用例名 (str)
        """

        self.driver.get("https://www.baidu.com")
        print('打开浏览器,访问 www.baidu.com .')
        time.sleep(5)
        assert f'百度一下' in self.driver.title

        elem = self.driver.find_element_by_name("wd")
        elem.send_keys(f'{search_keyword}{Keys.RETURN}')
        print(f'搜索关键词~{search_keyword}')
        time.sleep(5)
        self.assertTrue(f'{search_keyword}' in self.driver.title, msg=f'{testcase_name}校验点 pass')
  • iselenium.ini 配置文件,配置文件需放到系统的家目录下,并添加chromedriver文件路径
[driver]
chrome_driver=<Your chrome driver path>
  • requirements.txt 依赖包文件
allure-pytest
appium-python-client
pytest
pytest-testconfig
requests
selenium
urllib3
  • README.md 帮助文件
**Selenium 自动化测试程序(Python版)**
运行环境:
- selenium web driver
- python3
- pytest
- git

配置文件:iselenium.ini
- 将配置文件复制到本地磁盘的[user.home]目录
- 填入设备的chromwebdriver文件的全路径

运行命令:
pytest -sv test/web_ut.py --alluredir ./allure-results
代码clone
  • 将iSelenium_Python源码克隆到你的本地
  • 可以先Fork然后再克隆你Fork之后的源码项目(源码修改后可以push到github)
  • 也可以直接下载(源码修改后不能push到github)
  • 克隆参考代码:git clone git@github.com:princeqjzh/iSelenium_Python.git
额外知识点:chrome driver怎么找?

Selenium自动化测试演练

  • 运行环境可以与Jenkins同一台机器,也可以与Jenkins不同机器
  • 实例使用与Jenkins同一台机器便于演示
  • 运行环境上需要事先配置python3运行环境,保证pytest可以运行
  • 确保环境配置是OK的,可以运行Selenium的web自动化测试程序

配置Allure报告

  • Allure Report -更好看一些
  • 环境准备:
    • 运行环境上需要安装allure report运行环境
    • Jenkins allure report 插件
  • 环境准备:
    • Python依赖准备:pip install allure-pytest
  • 添加代码:
    • @allure.feature(' feature name')
    • @allure.story('story name')
  • 运行命令:
    • pytest -sv test/web_ut.py --alluredir ./allure-results

Jenkins配置

  • Jenkins中新建一个自由风格的项目


    image.png

    image.png
  • 配置git 地址链接(ssh格式),添加Checkout to sub-directory


    image.png

    image.png
  • 添加命令加载python库:pip install -r requirements.txt

  • 添加运行命令:pytest -sv test/web_ut.py

    • 其中. ~/.bash_profile是为了获取本机的环境变量
    • cd iSelenium_Python:切换到项目目录
      image.png
  • 添加运行参数,控制是否为有界面运行,此步骤之前可以先试运行程序,没有错误后再添加


    image.png
  • 添加Allure Report到 Post-build Actions中用于展示测试结果


    image.png

    image.png

进行构建

  • 查看控制台输出


    image.png
  • 查看allure报告


    image.png

    image.png
  • 查看allure曲线图(至少运行两次)


    image.png

本章小结

  • 自动化测试实例:Python代码的 Selenium_Python项目
  • 利用配置文件记录环境参数,保证相同的代码可以在不同环境上去运行
  • Selenium 驱动UI测试运行
  • 利用参数控制是否带界面运行
  • 自动化测试框架pytest控制测试程序的生命周期
  • Allure Report生成测试报告
  • Jenkins任务集成整个自动化测试运行过程

二、接口自动化测试

接口自动化测试项目介绍

业务过程
  • 请求接口传入对应参数
  • 解析返回JSON串
  • 获取对应[城市]返回值
  • 校验结果正确性
  • 输出报告


    image.png

接口自动化测试项目源码讲解

  • 打开PyCharm
  • HttpClient:网络Http请求类
  • Weather():测试用例类
  • README.md:说明
  • 目录树
image.png
  • jmx是与性能测试相关的,这里忽略
  • httpclient.py 封装和请求方法相关的函数
import requests
import urllib3


class HttpClient:
    """Generic Http Client class"""

    def __init__(self, disable_ssl_verify=False, timeout=60):
        """Initialize method"""

        self.client = requests.session()
        self.disable_ssl_verify = disable_ssl_verify
        self.timeout = timeout
        if self.disable_ssl_verify:
            urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

    def Get(self, url, headers=None, data=None, json=None, params=None, *args, **kwargs):
        """Http get method"""

        if headers is None:
            headers = {}

        if self.disable_ssl_verify:
            response = self.client.get(url, headers=headers, data=data, json=json, params=params
                                       , verify=False, timeout=self.timeout, *args, **kwargs)
        else:
            response = self.client.get(url, headers=headers, data=data, json=json, params=params
                                       , timeout=self.timeout, *args, **kwargs)
        response.encoding = 'utf-8'
        print(f'{response.json()}')

        return response
  • weather_test.py 测试文件
import allure

from unittest import TestCase
from library.httpclient import HttpClient


@allure.feature('Test Weather api')
class Weather(TestCase):
    """Weather api test cases"""

    def setUp(self):
        """Setup of the test"""

        self.host = 'http://www.weather.com.cn'
        self.ep_path = '/data/cityinfo'
        self.client = HttpClient()

    @allure.story('Test of ShenZhen')
    def test_1(self):
        city_code = '101280601'
        exp_city = '深圳'
        self._test(city_code, exp_city)

    @allure.story('Test of BeiJing')
    def test_2(self):
        city_code = '101010100'
        exp_city = '北京'
        self._test(city_code, exp_city)

    @allure.story('Test of ShangHai')
    def test_3(self):
        city_code = '101020100'
        exp_city = '上海'
        self._test(city_code, exp_city)

    def _test(self, city_code, exp_city):
        url = f'{self.host}{self.ep_path}/{city_code}.html'
        response = self.client.Get(url=url)
        act_city = response.json()['weatherinfo']['city']
        print(f'Expect city = {exp_city}, while actual city = {act_city}')
        self.assertEqual(exp_city, act_city, f'Expect city = {exp_city}, while actual city = {act_city}')
  • requirements.txt 依赖库
allure-pytest
appium-python-client
pytest
pytest-testconfig
requests
selenium
urllib3
  • README.md 说明文档
**接口功能自动化测试程序(Python版)**
运行环境:
- python3
- pytest
- allure report
- git

依赖准备:
pip install allure-pytest

运行命令:
pytest -sv test/weather_test.py --alluredir ./allure-results
  • 模拟接口测试用例通过:actual _value == expect _value
  • 模拟接口测试用例失败:actual value != expect_ _value
  • 本地代码讲解和运行演示-Demo

Jenkins配置

  • 复习知识点:Slave节点配置管理演示
  • 权限配置
  • Known host操作:Know host 是机器的ssl的校验机制,在机器的home目录下一般有.ssh的目录,该目录下有known hosts 文件,该文件存放的是被当前机器所信任的服务器ip
image.png

image.png

image.png
image.png
  • Jenkins中创建自由风格任务


    image.png
  • 添加Git地址


    image.png
  • 添加sub-directory


    image.png
  • 添加命令加载Python库:pip3.9 install -r requirements.txt

  • 添加运行命令:pytest -sv test/weather_test.py -alluredir ./allure-results

    image.png

  • 配置Allure Report插件


    image.png
  • post-build Actions


    image.png

运行Jenkins

image.png
image.png

本章小结

  • 自动化测试实例:Python代码
  • 利用Python常用package中的类发起接口请求、获取接口返回值、解析JSON字段、校验结果正确性
  • 利用pytest框架来运行接口测试,控制程序的生命周期
  • Allure report测试结果展示
  • Jenkins任务:源码同步、运行任务、展示测试报告、发送邮件

三、总结

  • Web UI自动化测试持续集成
  • 接口自动化测试持续集成
  • 通过参数来控制运行方式
  • 控制有界面or无界面运行
  • Allure Report展示测试结果报告
  • Jenkins + python + allure
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容