上回书说道,将测试脚本和测试数据相分离,读取数据的时候就出现了如下代码:
在读取的时候写的多少是有些麻烦了,而且如果有多条测试数据存储在yaml中,每一次都重复写一次取数据的语句都很麻烦,所以接下来,就用到了参数化这个概念,一键取数据,自动依次执行测试用例。
首先在yaml中新建立一个case,现在就有两条测试数据了。
其次,在测试脚本中,得到yaml中存储的完整测试数据。
cases,list_params=commlib.get_test_data(data_path)
#data_path是yaml地址
#get_test_data是获取yaml数据的方法
#cases返回的是yaml中case后方标记的用例名称
接下来利用@pytest.mark.parametrize
这个装饰器进行参数化获取。
@pytest.mark.parametrize("case,http,expected",list_params,ids=cases)
list_params是一个list,里面存储的每一条测试用例是一个tuple,包括case、http以及expected,但parametrize的神奇之处是可以自动获取到变量值对应的字段或是字典;ids则是获取到测试用例的名称,在运行时通过-v可以打印出来。
测试函数则是运用到参数化装饰器中的变量作为参数,依次进行数据的传递,接下来改写图1的测试函数。
@pytest.mark.parametrize("case,http,expected",list_params,ids=cases)
def test_statistics(self,case,http,expected):
now_url=url+http["path"]
params=http["params"]
response=requests.get(now_url,params=params)
res=expected["response"]["statuscode"]
assert response.status_code==res
我觉得是简洁了很多,毕竟当初我还因为返回值的层级关系print了好一阵...运行pytest -v test-statistics.py
如下所示:
ids的值虽然打印出来了,但是由于是中文显示的是Unicode编码,在这里引入一个新的文件
pytest.ini
,作为pytest的配置文件,可在里面进行一些配置,在运行时可以直接应用。比如为了解决这个中文编码的问题,就需要在这个文件中增加如下代码:
[pytest]
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True
然后在重新运行测试脚本,就可以正常显示了。
自我记录,有错误欢迎指正~