今天尝试将测试数据放入yaml
文件,url
地址放入配置文件,虽然增加了一些文件,但让整体的逻辑结构更加清晰了,在这里记录一下这个实施过程以及值得注意的地方。
整体配置流程如图所示:
文件结构如下:
config
配置文件所在的文件夹,在config.yaml
可以标明一些常规配置,这里配置了url
地址,用于后续测试用例应用。
host:
test: https://test.com/
conftest.py
配置一些fixture
,这里配置了在会话开始之初读取上方的config.yaml
。
import pytest
import os
import yaml
@pytest.fixture(scope="session")
def url(request):
config_path=os.path.join(request.config.rootdir,'config','config.yaml')
with open(config_path) as f:
data=yaml.safe_load(f)
return data
注意点
request.config.rootdir
可以直接返回项目的根目录,通过os.path.join
则可以获得config.yaml
的地址。
data
此文件夹下主要存储测试数据yaml
文件。
- case: 测试用例一
http:
method: POST
path: /user
json:
nickname: "11"
expected:
response:
statuscode: 200
name: "11"
pytest.ini
pytest
主配置文件,可以规定pytest
执行时候的一些默认行为,在这里主要是标明了当后续执行需要输出每个用例的ids
,为保证中文正常输出,在pytest.ini
文件中增加如下配置:
[pytest]
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True
utils
commlib.py
文件所在文件夹,主要是用于读取存储在data
下方yaml
文件的测试数据。
import os
import yaml
def get_test_data(data_path):
case=[]
http=[]
expected=[]
with open(data_path,mode='r',encoding='utf-8') as f:
data=yaml.safe_load(f)
data=data['test']#剥离出test
for td in data:
case.append(td.get('case',''))#剥离出case
http.append(td.get('http',{}))#剥离出http
expected.append(td.get('expected', {}))#剥离出expected
parameters=zip(case,http,expected)#将case、http、expected合并成一个tuple
list_params=list(parameters)##zip变成一个list
return case,list_params
tests
包括test_case.py
,测试用例执行的文件。
import requests
import pytest
import os
from root.utils import commlib
path=os.path.abspath(os.path.pardir)
datapath=os.path.join(path,'data','test_case_data.yaml')
cases,list=commlib.get_test_data(datapath)
class Test_class():
@pytest.mark.parametrize("case,http,expected",list,ids=cases)
def test_one(self,url,case,http,expected):
now_url=url["host"]["test"]+http["path"]
json=http["json"]
res=requests.post(url=now_url,json=json)
response=res.json()
assert res.status_code==expected["response"]["statuscode"]
assert response["name"]==expected["response"]["name"]
注意点
- 文件引用。
在test_case.py
文件中,需要引用在utils
文件夹下方的commlib.py
文件,如果不做任何特殊操作,直接引用,程序会报错,提示根目录root
找不到。
为了解决这个问题,需要在各个涉及到引用的文件夹中建立__init__.py
文件,空文件即可。这个文件可以标明当前的文件夹是一个包,内部的各个模块即各个文件可以被引用。 - 获取上级目录的方法。
os.path.pardir
可以获取到上级目录,但是形式是..,为获取测试数据的yaml
文件地址,需要获取到它的绝对路径:
os.path.abspah(os.path.pardir)
总结
在yaml
中写入测试数据,针对每一个测试用例,可以标明不同的params
、expected
等测试数据结构,而在测试用例文件中,只需要一个测试函数即可执行全部的测试用例,逻辑清晰且有效的降低了测试函数的编写工作量,同时将测试数据与测试用例操作相分离,如果后续有更改,也会更加方便。
自我记录,有错误欢迎指正~