上一篇在一个py文件中,写了一堆test_开头的方法,所有数据和用例都在一个py文件中,本篇尝试读取json文件的测试数据,执行用例。
# data.json { "TestHttpMethods": { "interface_info": [ { "interface_method": "get", "method": "get", "headers": null, "url_data": null, "data": {"test": "testdata"}, "params": null, "auth": null, "cookies": null, "hooks": null, "json": null, "except": [200] }, { "interface_method": "post", "method": "post", "headers": null, "url_data": null, "data": {"test": "testdata"}, "params": null, "auth": null, "cookies": null, "hooks": null, "json": null, "except": [200] } ] }, "TestAuth": { "interface_info": [ { "interface_method": "basic-auth", "method": "get", "headers": null, "url_data": ["testuser", "testpasswd"], "data": null, "params": null, "auth": ["testuser", "testpasswd"], "cookies": null, "hooks": null, "json": null, "except": [200] }, { "interface_method": "bearer", "method": "get", "headers": {"Authorization": "justtestauth"}, "url_data": null, "data": null, "params": null, "auth": null, "cookies": null, "hooks": null, "json": null, "except": [200] } ] } }
@pytest.mark.parametrize
进行参数化,所以把每组数据都保持在一个元组中,元组存于列表中# conftest.py import sys sys.path.append('.') import json, codecs, os print(os.getcwd()) def get_case(): with codecs.open('data.json', 'r', encoding='utf-8') as f: f_dict = json.load(f) for collection, cases in f_dict.items(): for case in cases['interface_info']: yield {collection: case} def get_data(): cases = get_case() datas = [] for case_d in cases: for collection, case in case_d.items(): url_method = case['interface_method'] method = case['method'] headers = case["headers"] url_data = case['url_data'] # if case['url_data'] is None else tuple(case['url_data']) data = case['data'] params = case['params'] auth = case['auth'] cookies = case['cookies'] hooks = case['hooks'] json = case['json'] except_data = case['except'] t = (url_method, method, headers, url_data, data, params, auth, cookies, hooks, json, except_data) datas.append(t) return datas
结果:
print(type(get_case())) print(get_data()) <class 'generator'> [('get', 'get', None, None, {'test': 'testdata'}, None, None, None, None, None, [200]), ('post', 'post', None, None, {'test': 'testdata'}, None, None, None, None, None, [200]), ('basic-auth', 'get', None, ['testuser', 'testpasswd'], None, None, ['testuser', 'testpasswd'], None, None, None, [200]), ('bearer', 'get', {'Authorization': 'justtestauth'}, None, None, None, None, None, None, None, [200])]
__init__()
构造方法中进行初始化__init__()
中用了非常经典的三语表达式BASE_URL = 'http://192.168.68.128:8088/'
,主要用于存储一些配置信息(如果后面发邮件或者连数据库啥的,配置信息也可以写在这里面)# httpmethods.py
import sys
sys.path.append('.')
from urllib.parse import urljoin
import requests
from requests import Request, Session
import config
# print(config.BASE_URL)
class Http:
def __init__(self,
method=None, url=None, headers=None, files=None, data=None,
params=None, auth=None, cookies=None, hooks=None, json=None,
base_url=None, url_method=None, url_data=None):
# Default empty dicts for dict params.
data = [] if data is None else data
files = [] if files is None else files
headers = {} if headers is None else headers
params = {} if params is None else params
hooks = {} if hooks is None else hooks
url_data = () if url_data is None else tuple(url_data)
auth = None if auth is None else tuple(auth)
self.hooks = requests.hooks.default_hooks()
type(hooks)
for (k, v) in list(hooks.items()):
Request.register_hook(event=k, hook=v)
self.method = method
self.url = url
self.headers = headers
self.files = files
self.data = data
self.json = json
self.params = params
self.auth = auth
self.cookies = cookies
self.base_url = base_url
self.url_method = url_method
self.url_data = url_data
def method_new(self):
self.base_url = config.BASE_URL
s = Session()
url = urljoin(self.base_url, '/'.join((self.url_method,) + self.url_data))
print(url)
req = Request(method=self.method.upper(), url=url, headers=self.headers,
files=self.files, data=self.data, params=self.params, auth=self.auth,
cookies=self.cookies, json=self.json)
prepped = req.prepare()
# 如果需要设置代理,可以在s.send中添加并进行配置, 详情查看send的源码
resp = s.send(prepped)
return resp
pytest.mark.parametrize
进行参数化pytest -q --tb=no --html=./report.html
作者: 乐大爷 博客:https://www.jianshu.com/u/39cef8a56bf9 声明:本文已获作者授权转载,著作权归作者所有。