您现在的位置是:网站首页> 编程资料编程资料
Pytest+Request+Allure+Jenkins实现接口自动化_python_
2023-05-26
325人已围观
简介 Pytest+Request+Allure+Jenkins实现接口自动化_python_
- 利用
Pytest+Request+Allure+Jenkins实现接口自动化; - 实现一套脚本多套环境执行;
- 利用参数化数据驱动模式,实现接口与测试数据分离
- 使用
logger定制实现自动化测试日志记录
实现步骤:

框架结构:

1、接口自动化项目代码编写(先在window实现)
1.1 项目准备
先在window安装响应的环境依赖
- 安装python3.7(要保证pip能用,一般安装python3.7会自动安装pip)
- 安装pytest框架---- pip install pytest
- 安装request库---- pip install request
- 安装openpyxl库(测试数据保存在excel中,需要依赖读取excel的库)---- pip install openpyxl
- 安装pycharm(编写python脚本工具)
注意:可能还需要一些依赖的东西,项目步骤里会依据需要进行安装
1.2 设计基于pytest的测试框架结构
在pycharm中开发构建项目结构

common:存放公共方法
config:存放环境配置信息
lib:存放第三方库
main:框架主入口
report:存放allure测试报告
test_case:存放测试用例
test_data:存放测试数据
1.3 实现接口公共请求发送能力
从这一步开始正式编写代码

封装http请求的公共能力(封装request库,变成自己的公共处理能力),放到common目录下。
# encoding: utf-8 import requests import urllib3 # from urllib3.exceptions import InsecureRequestWarning urllib3.disable_warnings() # 加这句不会报错(requests证书警告) # requests.packages.urllib3.disable_warnings(InsecureRequestWarning) class HTTPRequests(object): def __init__(self, url): self.url = url self.req = requests.session() # 依据自己公司的请求头默认值配置 self.head = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko', 'Accept': 'image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, ' 'application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, ' 'application/msword, */*', 'Accept-Language': 'zh-CN'} # 封装自己的get请求,获取资源 def get(self, uri='', params='', data='', headers=None, cookies=None, verify=False): if headers is None: headers = self.head # print("请求头是:{}".format(headers)) url = self.url + uri response = self.req.get(url, params=params, data=data, headers=headers, cookies=cookies, verify=verify) return response # 封装自己的post请求,获取资源 def post(self, uri='', params='', data='', headers=None, cookies=None, verify=False): if headers is None: headers = self.head url = self.url + uri response = self.req.post(url, params=params, data=data, headers=headers, cookies=cookies, verify=verify) return response # 封装自己的put请求,获取资源 def put(self, uri='', params='', data='', headers=None, cookies=None, verify=False): if headers is None: headers = self.head url = self.url + uri response = self.req.put(url, params=params, data=data, headers=headers, cookies=cookies, verify=verify) return response # 封装自己的delete请求,获取资源 def delete(self, uri='', params='', data='', headers=None, cookies=None, verify=False): if headers is None: headers = self.head url = self.url + uri response = self.req.delete(url, params=params, data=data, headers=headers, cookies=cookies, verify=verify) return response1.4 抽离测试环境配置信息
这个步骤的目的有三个
- 为了配置三个不同环境(测试、开发、生产)的URL,每个环境接口测试的URL是不一样的,设置这样一个枚举类,方便后面的程序根据不同的环境,获取不同环境的URL,里面的URL依据自己公司的地址修改,放到config目录
- 获取token需要登录,这里可以设置一个全局的账号密码,这个账号密码获取的token可以给整个接口自动化使用
- 配置获取token的uri,这个uri三个环境的是一致的,登录的接口依据环境只是URL不同,URI还是一致的。

# encoding: utf-8 import enum class URLConf(enum.Enum): """环境配置信息""" url_mapping = { 'dev': 'https://www.dev.com', 'test': 'https://www.test.com', 'prod': 'https://www.prod.com' } # token固定的用户名密码,固定用"/"分割用户名和密码 email_user = { 'dev': 'dev@qq.com', 'test': 'zidonghua@qq.com/96e79218965eb72c92a549dd5a330112', 'prod': 'prod@qq.com' } login_uri = r'/api/auth/login/account/v1'1.5 创建conftest.py放置一些公共的fixture
1、pytest_addoption,设置了只允许输入dev/test/prod三个参数,以区分测试、开发、生产三个环境
2、get_env的fixture,它的作用是你在命令行执行接口自动化时,可以输入--env test将对应的环境信息传入进去
3、http的fixture,这里依据--env test传入的环境信息,去枚举类里获取对应环境的URL,然后返回一个http的session,供测试案例使用
4、get_token_head,依据--env test传入的环境信息,调用获取token方法,并将token放置到请求头head里返回(token一般放在请求头里,这里依据自己公司的请求,返回对应的token信息就可以了)
# encoding: utf-8 # 代码来源:全栈测开训练营 import logging import os import pytest from common.http_request import HTTPRequests from config.url_config import URLConf datadir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test_data") logger = logging.getLogger('conftest日志') def pytest_addoption(parser): # choices 只允许输入的值的范围 parser.addoption( "--env", action="store", default='test', choices=['dev', 'test', 'prod'], help="set env" ) # 获取命令行参数的fixture @pytest.fixture(scope='session') def get_env(request): # print("fixutre..................") return request.config.getoption('--env') # 声明一个返回http请求对象的fixture,所有用例在一个session中 # @pytest.fixture(scope='module', autouse=True) @pytest.fixture(autouse=True) def http(request): env = request.getfixturevalue("get_env") url_mapping = URLConf.url_mapping.value url = url_mapping.get(f'{env}') http = HTTPRequests(url) return http @pytest.fixture(scope='session') def get_token_head(request): env = request.getfixturevalue("get_env") url_mapping = URLConf.url_mapping.value url = url_mapping.get(f'{env}') http = HTTPRequests(url) user = URLConf.email_user.value user_list = user.get(f'{env}').split("/") username = user_list[0] password = user_list[1] param = {'clientType': 2, 'language': 'en', 'loginId': username, 'loginPassword': password} logger.info("请求的url=={}".format(url)) response = http.post(uri=r'/api/auth/login/account/v1', data=param) logger.info("获取的返回值是:".format(response.text)) token = None if response.status_code == 200: token = response.json().get('result')['token'] else: token = 'get token fail' head = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko', 'Accept': 'image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, ' 'application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, ' 'application/msword, */*', 'Accept-Language': 'zh-CN', 'Authorization': token} yield head1.6 将测试数据放到excel中
我们的测试数据是放在excel中,注意,这里有prod\test\dev三个目录,对应三个环境的测试数据,我这里只创建了test测试环境的测试数据。这里的测试数据需要包含两部分:
- 你调用接口传入的所有参数;
- 你要断言的所有信息,因为你传的参数不同,返回的内容就不同,你断言的内容也就不相同了。


那么这时候,就需要一个读取excel的公共方法了,放到common里

# 创建解析excel的方法 import logging from openpyxl import load_workbook logger = logging.getLogger("读取excel") class ParseExcel(object): def __init__(self, excelPath, sheetName): self.wb = load_workbook(excelPath) self.sheet = self.wb[sheetName] self.maxRowNum = self.sheet.max_row # 依据传入的数字,决定获取几列excel数据 def getDataFromSheet(self, num): dataList = [] for line in self.sheet.rows: tmplist = [] for i in range(num): tmplist.append(line[i].value) dataList.append(tmplist) print("dadddddd:{}".format(dataList)) return dataList[2:]这里,还需要再test_data中,创建一个文件,为了获取前面test_data依据环境创建的dev/test或prod文件目录

1.7 开始编写自动化测试案例了
测试案例中有几个点,需要解释一下:
1、authBaseDir,这个就是根据test_data/test拼接出来的获取测试数据的目录
2、allure.feature,在测试报告中,会展现这个接口名称,这个名称最好与你公司的开发写的接口模块保持一致,方便后续查找问题
3、allure.story 这里也要与开发写的具体某个接口的名称保持一致。
4、pytest.mark.parametrize,这里就是运用的DDT数据驱动的模式,从excel中一条一条的获取数据,然后执行同一条接口测试用例,excel中比如有3条数据,那么就表示这个案例依据每一条数据的参数,总共执行了三次
# encoding: utf-8 """ Account Api模块 """ import logging import os import allure import pytest from common.get_data_url import get_data_url from common.parse_excel import ParseExcel datadir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test_data") data_url = get_data_url() # 获取到test_data\test的目录,如果是prod环境,那么就是获取test_data\prod目录 authBaseDir = os.path.join(datadir, data_url) logger = logging.getLogger("Account Api模块日志") @allure.feature("AccountApi模块") @pytest.mark.webtest class TestAccountApi(object): """Query Related Achievements: /api/auth/account/achievement/related/query/v1 """ Query_Related_Achievements_dir = os.path.join(authBaseDir, 'Query_Related_Achievements.xlsx') logger.info("Query_Related_Achievements测试数据的路径是:{}".format(Query_Related_Achievements_dir)) parse = ParseExcel(Query_Related_Achievements_dir, 'Sheet1') Query_Related_Achievements_params = parse.getDataFromSheet(5) @allure.story("Query Related Achievements(查询用户成就信息)") @pytest.mark.parametrize("clientType,language,retCode,istoken,result", Query_Related_Achievements_params) def test_001_Query_Related_Achievements(self, get_token_head, http, clientType, language, retCode, istoken, result): uri = '/api/auth/account/achievement/related/query/v1' params = {"clientType": clientType, "language": language} if istoken == 'yes': header = get_token_head response = http.get(uri=uri, params=params, headers=header) json_req = response.json() logger.info("Query_Related_Achievements有token的返回值是:{}".format(json_req)) assert json_req.get('retCode') == 200 assert json_req.get('result')[0]['smallImg'] == result else: response = http.get(uri=uri, params=params) json_req = response.json() logger.info("Query_Related_Achievements没有token的返回值是:{}".format(json_req)) assert json_req.get('retCode') == 4
相关内容
- Python3.9用pip安装wordcloud库失败的解决过程_python_
- pytest多线程与多设备并发appium_python_
- PyCharm安装库numpy失败问题的详细解决方法_python_
- Python中可以用三种方法判断文件是否存在_python_
- Pytest框架之fixture详解(三)_python_
- Pytest框架之fixture详解(二)_python_
- Pytest框架之fixture详解(一)_python_
- Pytest自定义mark标记筛选用例_python_
- Python利用字典和列表实现学生信息管理系统_python_
- pip install如何指定包的安装路径_python_
点击排行
本栏推荐
