引言
前面分享的推文 自动化测试必会—数据驱动DDT 介绍过 unittest 框架中操作 JSON 和 YAML 文件实现数据驱动。那么在 pytest 中,又该如何实现呢?
Pytest 操作 JSON/YAML 文件实现数据驱动
首先按照使用 pytest 进行数据驱动的基本思路创建一个读取 JSON 文件和 YAML 文件的方法:
def test_read_data_from_json_yaml(data_file):
return_value = []
data_file_path = os.path.abspath(data_file)
print(data_file_path)
_is_yaml_file = data_file_path.endswith((".yml", ".yaml"))
with codecs.open(data_file_path, 'r', 'utf-8') as f:
#从YAML或JSON文件中加载数据
if _is_yaml_file:
data = yaml.safe_load(f)
else:
data = json.load(f)
for i, elem in enumerate(data):
if isinstance(data, dict):
key, value = elem, data[elem]
if isinstance(value, dict):
case_data = []
for v in value.values():
case_data.append(v)
return_value.append(tuple(case_data))
else:
return_value.append((value,))
return return_value
test_read_data_from_json_yaml 这个函数方法,实现了自动读取 JSON 文件和 YAML 文件,并且把 JSON 文件和 YAML 文件中的数据提取出来,并按照 pytest.mark.parametrize 可接收的方式返回。
有了这个函数方法,JSON 或者 YAML 文件的数据通过此方法就可以转换成 pytest.mark.parametrize 认可的格式直接传入了。
下面实践一下,在 APITest 项目根目录下创建如下文件目录:
|--APITest
|--tests_pytest_ddt
|--test_baidu_ddt.py
|--test_baidu_ddt.json
|--test_baidu_ddt.yaml
|--test_baidu_ddt.xlsx
|--__init__.py
|--conftest.py
其中,test_baidu_ddt.json 文件的内容如下:
{
"case1": {
"search_string": "testing",
"expect_string": "Testing"
},
"case2": {
"search_string": "hello_world.com",
"expect_string": "Testing"
}
}
test_baidu_ddt.yaml 文件的内容如下:
"case1":
"search_string": "testing"
"expect_string": "Testing"
"case2":
"search_string": "hello_world.com"
"expect_string": "Testing"
test_baidu_ddt.py 文件的代码如下:
import codecs
import json
import os
import time
import pytest
import yaml
def test_read_data_from_json_yaml(data_file):
return_value = []
data_file_path = os.path.abspath(data_file)
print(data_file_path)
_is_yaml_file = data_file_path.endswith((".yml", ".yaml"))
with codecs.open(data_file_path, 'r', 'utf-8') as f:
#从YAML或JSON文件中加载数据
if _is_yaml_file:
data = yaml.safe_load(f)
else:
data = json.load(f)
for i, elem in enumerate(data):
if isinstance(data, dict):
key, value = elem, data[elem]
if isinstance(value, dict):
case_data = []
for v in value.values():
case_data.append(v)
return_value.append(tuple(case_data))