框架简介:使用pytest库,去运行测试用例,用yaml做数据驱动,allure生成测试报告。
一、pytest.ini文件
pytest的配置文件,用来配置运行规则和运行命令。
addopts 为运行命令,命令之间用空格隔开.。-vs:表示显示详细调试信息;./temps 为allure测试报告生成目录 ;–clean 为清除历史报告。
testpaths 填写测试用例的目录。
python_files、python_classes、python_functions分别定义了文件名、类名、函数名的规则,只有满足规则才会被执行。
[pytest]
addopts = -vs --alluredir ./temps --clean-alluredir
testpaths = ./test_cases
python_files = test_*.py
python_classes = Test*
python_functions = test_*
二、封装基本接口请求方法
封装GET和POST请求,根据method去执行并返回res。
import requests
import json
class RequestMethod:
session = requests.session() # 会话
def all_send_request(self, method, url, data, headers, **kwargs):
method = str(method).lower()
if method == "get":
res = RequestMethod.session.request(method=method, url=url, params=data, **kwargs)
elif method == "post":
str_data = json.dumps(data)
# print(str_data)
res = requests.request(method=method, url=url, data=str_data, headers=headers)
else:
print("不支持的请求方式")
return res
三、Yaml文件测试用例
写完用例后可以用 BEJSON 去校验一下格式是否正确。
Yaml语法可以参考 菜鸟教程
-
title: 消费记录订单列表
method: post
url: https://xxxxxxx.com/bes/getOrderList
payload:
pageNum: 1
pageSize: 10
packageName:
oendTime:
beginTime:
validate:
equals: 200
-
title: 消费记录订单列表
method: post
url: https://xxxxxxxxx.com/bes/getOrderList
payload:
pageNum: 2
pageSize: 1
packageName:
oendTime:
beginTime:
validate:
equals: 200
四、读取Yaml文件数据
这里使用YamlUtil().read_extract_yaml(“文件路径”)函数去读取文件数据。
import os
import yaml
class YamlUtil:
# 读取extract.yml文件
def read_extract_yaml(self,path):
with open(path, mode="r", encoding='utf-8')as f:
value = yaml.load(stream=f, Loader=yaml.FullLoader)
return value
# 写入save.yml文件
def write_save_yaml(self, data):
with open(os.getcwd() + "/data/save.yml", mode="a", encoding='utf-8')as f:
yaml.dump(data=data, stream=f, allow_unicode=True)
# 清除yaml文件
def clear_save_yaml(self):
with open(os.getcwd() + "/data/save.yml", mode="w", encoding='utf-8')as f:
f.truncate()
五、用例执行文件
下面附上allure装饰器的用法。
@pytest.mark.parametrize(‘args’,
YamlUtil().read_extract_yaml(os.getcwd() + “/data/Consumption/consumption_list.yml”))
@pytest.mark.parametrize装饰期能参数化数据,多组数据会执行多次。如上三所示的Yaml文件中的两组数据会执行两次,这样便于同一个接口设计多条测试用例。
import os
import re
import allure
import pytest
from common.yaml_util import YamlUtil
from method.request_method import RequestMethod
@allure.feature("消费记录") # 一级菜单
class TestConsumption:
token = YamlUtil().read_extract_yaml(os.getcwd() + "/data/token.yml")["token"]
@allure.severity(allure.severity_level.CRITICAL) # 设置用例优先级
@allure.story("订单列表") # 二级菜单
@pytest.mark.parametrize('args',
YamlUtil().read_extract_yaml(os.getcwd() + "/data/Consumption/consumption_list.yml"))
def test_consumption_list(self, args):
"""
订单列表,post请求,/bes/order/getOrderList,正例:正常参数请求,获取订单列表
"""
print(f"当前驱动数据:{args}")
response = RequestMethod().all_send_request(method=args["method"], url=args["url"],
headers=TestConsumption.token, data=args["payload"])
with allure.step("响应结果"):
allure.attach(response.text)
assert response.status_code == 200
六、前后置用例
在目录下建一个conftest.py文件,文件名称固定的,使用其他名称无效。
实现部分前置
@pytest.fixture(scope="作用域",params="数据驱动",autouse="自动执行",ids="自定义参数名",name="重命名")
作用域:function,class,module,package/session
yield和return都表示返回,yield返回多次多个数据,return只会返回一次,return后不能接代码
@pytest.fixture()一般会和conftest.py文件一起使用
@pytest.fixture(scope="class",autouse=True)
def login_alipay():
pass
yield
pass
七、运行文件
import os
import pytest
if __name__ == '__main__':
pytest.main()
os.system("allure generate ./temp -o ./report --clean")