当前位置:网站首页>自动化测试中,测试数据与脚本分离以及参数化方法
自动化测试中,测试数据与脚本分离以及参数化方法
2022-08-10 01:34:00 【测试小鬼】
测试数据和测试代码在实际的测试工作中,往往是分开存放的,利于测试数据和测试脚本的分开来维护。比如,为测试用例添加几组新的测试数据,只需要修改测试数据文件,测试代码不需要动;如果是测试用例增加了新的校验点,只需要修改测试脚本,不需要修改测试数据文件。
—、准备测试数据
现在在data/目录下创建一个用于存放测试数据的Yaml文件test_in_theaters.yaml,内容如下:
---
tests:
- case: 验证响应中start和count与请求中的参数一致
input:
method: GET
path: /v2/movie/in_theaters
headers:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
params:
apikey: 0df993c66c0c636e29ecbb5344252a4a
start: 0
count: 10
expected:
response:
title: 正在上映的电影-上海
count: 10
start: 0
- case: 验证响应中title"正在上映的电影-北京"
input:
method: GET
path: /v2/movie/in_theaters
headers:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
params:
apikey: 0df993c66c0c636e29ecbb5344252a4a
start: 1
count: 5
expected:
response:
title: 正在上映的电影-北京
count: 5
start: 1
熟悉Yaml格式的同学,应该很容易看懂上面测试数据文件的内容。这个测试数据文件中,有一个数组tests,里面包含的是两条完整的测试数据。一个完整的测试数据由三部分组成:
case,表示测试用例名称。
input,表示输入参数。
expected,表示预期结果。
上面的input输入参数,是一个http请求对象,包含了被测接口的所有参数,包括请求方法、请求路径、请求头、请求参数。expected表示预期结果,上面的测试数据中,只列出了对请求响应的预期值,实际测试中,还可以列出对数据库的预期值。
二、编写测试脚本
新建一个测试脚本test_paramtrize_by_data_driven.py,内容如下:
import pytest
class TestDataDriven:
@pytest.mark.datafile('data/test_in_theaters.yaml') # 相对于项目根目录的相对路径
def test_data_driven(self, parameters):
print(parameters['input'])
print(parameters['expected'])
首先看一下测试函数,在测试函数上方使用了一个叫做datafile的marker来为测试函数提供数据。测试数据的路径是相对于项目根路径的相对路径,这里表示的是测试数据是在项目的根路径下data目录中的test_in_theaters.yaml。测试函数通过parameters这个fixture拿到测试数据内容。
三、实现pytest_generate_tests Hook
上面测试脚本使用测试数据的方法,是在tests/conftest.py文件中的pytest_generate_tests函数中实现的。
import yaml
import json
def pytest_generate_tests(metafunc):
ids = []
markers = metafunc.definition.own_markers
for marker in markers:
if marker.name == 'datafile': # 读取外数据
test_data_path = os.path.join(metafunc.config.rootdir, marker.args[0]) # 拼接测试数据路径
with open(test_data_path) as f:
ext = os.path.splitext(test_data_path)[-1]
if ext in ['.yaml', '.yml']:
test_data = yaml.safe_load(f)
elif ext == '.json':
test_data = json.load(f)
else:
raise TypeError('datafile must be yaml or json,root must be tests')
if "parameters" in metafunc.fixturenames: # 用外部数据进行参数化
for data in test_data['tests']: # 用test_data中的case作为测试用例名称
ids.append(data['case'])
# 用test_data这个列表对parameters进行参数化。
metafunc.parametrize("parameters", test_data['tests'], ids=ids, scope=
metafunc.definition.own_markers可以读取到测试函数中所有的marker,如果存在datafile这个marker,表示需要从外部读取测试数据,测试数据可以是YAML格式也可以是Json格式。如果测试函数的metafunc.fixturenames中含有parameters这个fixture函数,就用外部测试数据对它进行参数化。
四、参数化套路
有了pytest_generate_tests这个Hook函数后,对测试函数进行参数化需要做三个改动:
在data目录下新加一个YAML或者Json格式文件。文件内容格式参考上面的例子。
指定测试数据文件的路径
@pytest.mark.datafile('data/test_in_theaters.yaml')
给测试数据提供一个叫做
parameters
的fixture
现在,整个项目的目录结构应该是如下所示:
$ tree
.
├── Pipfile
├── Pipfile.lock
├── data
│ └── test_in_theaters.yaml
├── tests
│ └── conftest.py
│ └── test_data_driven.py
五、总结
本文实现测试脚本和测试数据的分离的核心,还是实现了Hook函数,在Hook函数中读取测试数据文件,并对测试函数的fixture进行参数化。
只是通过一个小小的例子完成了postman关于参数化的介绍,当然小伙伴们需要自己动手操作下才能加深自己的记忆哦
最后在我的QQ技术交流群里整理了我这10几年软件测试生涯整理的一些技术资料,包括:电子书,简历模块,各种工作模板,面试宝典,自学项目等。如果在学习或工作中遇到问题,群里也会有大神帮忙解答,群号 798478386 ( 备注 今日头条555 )
全套软件测试自动化测试教学视频
300G教程资料下载【视频教程+PPT+项目源码】
全套软件测试自动化测试大厂面经
边栏推荐
猜你喜欢
以太网PHY芯片LAN8720A芯片研究
51单片机驱动HMI串口屏,串口屏的下载方式
Fusion Compute网络虚拟化
宝塔服务器PHP+mysql网页URL跳转问题
type-C 边充电边听歌(OTG) PD芯片方案,LDR6028 PD充电加OTG方案
Problems and solutions related to Chinese character set in file operations in ABAP
Initial attempt at UI traversal
Unity reports Unsafe code may only appear if compiling with /unsafe. Enable “Allow ‘unsafe’ code” in Pla
数据库治理利器:动态读写分离
首次在我们的centos登录我们的Mysql
随机推荐
【机器学习】随机森林、AdaBoost、GBDT、XGBoost从零开始理解
高压之下,必有懦夫
unity 报错 Unsafe code may only appear if compiling with /unsafe. Enable “Allow ‘unsafe‘ code“ in Pla
Sikuli's Automated Testing Technology Based on Pattern Recognition
【每日一题】1413. 逐步求和得到正数的最小值
Unity3D创建道路插件EasyRoads的使用
解决sed替换文本,里面含有“/“、“#”等特殊字符的问题
基于设计稿识别的可视化低代码系统实践
[网鼎杯 2020 青龙组]AreUSerialz
【SSRF漏洞】实战演示 超详细讲解
Not, even the volume of the king to write code in the company are copying and pasting it reasonable?
[语法糖] 关于类别字符串到类别数字id的映射
sqlmap dolog外带数据
[QNX Hypervisor 2.2用户手册]10.14 smmu
Button countdown reminder
Unity vertex animation
Problems and solutions related to Chinese character set in file operations in ABAP
Experimental support for decorators may change in future releases.Set the "experimentalDecorators" option in "tsconfig" or "jsconfig" to remove this warning
首次在我们的centos上安装MySQL
OpenSSF的开源软件风险评估工具:Scorecards