篇幅较长,要耐心阅读哦~
基础知识简要回顾
- 持续集成、持续交付的好处与产生的必然性
- Jenkins服务的搭建方法
- Jenkins节点管理与用户权限
- Jenkins插件
- Jenkins父子多任务关联运行
- Jenkins报警机制
目录
- SeleniumUI自动化测试持续集成演练
- 接口自动化测试持续集成演练
一、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运行方法
测试代码
-
目录树
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怎么找?
- 本机需要安装chrome浏览器
- Chrome driver版本与chrome浏览器版本有支持对应关系
- Chrome driver 下载参考网站:http://npm.taobao.org/mirrors/chromedriver/
Selenium自动化测试演练
- 运行环境可以与Jenkins同一台机器,也可以与Jenkins不同机器
- 实例使用与Jenkins同一台机器便于演示
- 运行环境上需要事先配置python3运行环境,保证pytest可以运行
- 确保环境配置是OK的,可以运行Selenium的web自动化测试程序
配置Allure报告
- Allure Report -更好看一些
- 环境准备:
- 运行环境上需要安装allure report运行环境
- Jenkins allure report 插件
- 环境准备:
- Python依赖准备:
pip install allure-pytest
- Python依赖准备:
- 添加代码:
@allure.feature(' feature name')
@allure.story('story name')
- 运行命令:
pytest -sv test/web_ut.py --alluredir ./allure-results
Jenkins配置
-
Jenkins中新建一个自由风格的项目
-
配置git 地址链接(ssh格式),添加Checkout to sub-directory
添加命令加载python库:
pip install -r requirements.txt
-
添加运行命令:
pytest -sv test/web_ut.py
- 其中
. ~/.bash_profile
是为了获取本机的环境变量 -
cd iSelenium_Python
:切换到项目目录
- 其中
-
添加运行参数,控制是否为有界面运行,此步骤之前可以先试运行程序,没有错误后再添加
-
添加Allure Report到 Post-build Actions中用于展示测试结果
进行构建
-
查看控制台输出
-
查看allure报告
-
查看allure曲线图(至少运行两次)
本章小结
- 自动化测试实例:Python代码的 Selenium_Python项目
- 利用配置文件记录环境参数,保证相同的代码可以在不同环境上去运行
- Selenium 驱动UI测试运行
- 利用参数控制是否带界面运行
- 自动化测试框架pytest控制测试程序的生命周期
- Allure Report生成测试报告
- Jenkins任务集成整个自动化测试运行过程
二、接口自动化测试
接口自动化测试项目介绍
- 接口测试应用:http://www.weather.com.cn/data/cityinfo/
- 接口功能:获得对应城市的天气预报
- 源码:Python
- 功能包:HttpClient
- 请求方法:Get
- 自动化测试框架:pytest
- 开发工具:PyCharm
- 源码位置:https://github.com/princeqjzh/iInterface_python
业务过程
- 请求接口传入对应参数
- 解析返回JSON串
- 获取对应[城市]返回值
- 校验结果正确性
-
输出报告
接口自动化测试项目源码讲解
- 打开PyCharm
- HttpClient:网络Http请求类
- Weather():测试用例类
- README.md:说明
- 目录树
- 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
-
Jenkins中创建自由风格任务
-
添加Git地址
-
添加sub-directory
添加命令加载Python库:
pip3.9 install -r requirements.txt
-
添加运行命令:
pytest -sv test/weather_test.py -alluredir ./allure-results
-
配置Allure Report插件
-
post-build Actions
运行Jenkins
本章小结
- 自动化测试实例:Python代码
- 利用Python常用package中的类发起接口请求、获取接口返回值、解析JSON字段、校验结果正确性
- 利用pytest框架来运行接口测试,控制程序的生命周期
- Allure report测试结果展示
- Jenkins任务:源码同步、运行任务、展示测试报告、发送邮件
三、总结
- Web UI自动化测试持续集成
- 接口自动化测试持续集成
- 通过参数来控制运行方式
- 控制有界面or无界面运行
- Allure Report展示测试结果报告
- Jenkins + python + allure