当前位置:网站首页>一改测试步骤代码就全写 为什么不试试用 Yaml实现数据驱动?
一改测试步骤代码就全写 为什么不试试用 Yaml实现数据驱动?
2022-07-06 08:57:00 【自动化测试七叔】
前言
理念与同“UI自动化测试框架”中的“测试步骤的数据驱动”相同,接口中的测试步骤的数据驱动就是将接口的参数(比如 method、url、param等)封装到 yaml 文件中管理。当测试步骤发生改变,只需要修改 yaml 文件中的配置即可。
数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议使用一种结构化的文件(例如yaml,json等)来对数据进行存储,然后在测试用例中读取这些数据。
依然使用 @pytest.mark.parametrize 装饰器来进行参数化,使用参数化来实现数据驱动。
通过参数化的方式,分别判断id为2,3的部门的parentid为1:
import pytest
class TestDepartment:
department = Department()
@pytest.mark.parametrize("id", [2, 3])
def test_department_list(self, id):
r = self.department.list(id)
assert self.department.jsonpath(expr="$..parentid")[0] == 1
上面的代码首先使用 @pytest.mark.parametrize 装饰器,传递了两组数据,测试结果显示有两条测试用例被执行,而不是一条测试用例。也就是 pytest 会将两组测试数据自动生成两个对应的测试用例并执行,生成两条测试结果。
当测试数据量大的情况下,可以考虑把数据存储在结构化的文件中。从文件中读取出代码中所需要格式的数据,传递到测试用例中执行。本次实战以YAML进行演示。YAML以使用动态字段进行结构化,它以数据为中心,比 excel、csv、Json、XML 等更适合做数据驱动。
将上面参数化的两组数据存储到 yaml 文件中,创建一个data/department_list.yml文件,代码如下:
-2
-3
上面的代码定义了一个 yaml 格式的数据文件department_list.yml,文件中定义了一个列表,列表中有两个数据,最后生成的是这样的数据格式:[1,2]。将测试用例中参数化的数据改造成从 department_list.yml 文件中读取,代码如下:
class TestDepartment:
department = Department()
@pytest.mark.parametrize("id", \
yaml.safe_load(open("../data/department_list.yml")))
def test_department_list(self, id):
r = self.department.list(id)
assert self.department.jsonpath(expr="$..parentid")[0] == 1
上面的代码,只需要使用yaml.safe_load()方法,读取department_list.yml文件中的数据,分别传入到用例 test_department_list() 方法中完成输入与结果的验证。
实际工作中,对于环境的切换和配置,为了便于维护,通常不会使用硬编码的形式完成。在“多环境下的接口测试”章节中已经介绍了,如何将环境的切换作为一个可配置的选项。本章节会把这部分内容进行重构,使用数据驱动的方式完成多环境的配置。
根据“多环境下的接口测试”章节,将此章节中的环境配置部分改为数据驱动的模式
代码如下:
#把host修改为ip,并附加host header
env={
"docker.testing-studio.com": {
"dev": "127.0.0.1",
"test": "1.1.1.2"
},
"default": "dev"
}
data["url"]=str(data["url"]).replace(
"docker.testing-studio.com",
env["docker.testing-studio.com"][env["default"]]
)
data["headers"]["Host"]="docker.testing-studio.com"
依然以yaml为示例,将所有的环境配置信息放到 env.yml 文件中。如果怕出错,可以先使用yaml.safe_dump(env)将dict格式的代码转换为yaml。
如下所示,打印出来的,就是成功转换yaml格式的配置信息:
def test_send(self):
env={
"docker.testing-studio.com": {
"dev": "127.0.0.1",
"test": "1.1.1.2"
},
"default": "dev"
}
yaml2 = yaml.safe_dump(env)
print("")
print(yaml2)
将打印出来的内容粘贴到 env.yml 文件中: env.yml
docker.testing-studio.com:
dev: "127.0.0.1"
test: "1.1.1.2"
level: 4
default:
"dev"
将环境准备中的代码稍作修改,把env变量从一个典型dict改为,使用yaml.safe_load读取 env.yml:
# 把host修改为ip,并附加host header
env = yaml.safe_load(open("./env.yml"))
data["url"] = str(data["url"]).\
replace("docker.testing-studio.com",
env["docker.testing-studio.com"][env["default"]])
data["headers"]["Host"] = "docker.testing-studio.com"
如此一来,就可以实现使用数据驱动的方式,通过修改 env.yml 文件来直接修改配置信息
总结
今天的文章就到这里了哟,喜欢的小伙伴可以点赞收藏加关注哟
边栏推荐
- The problem and possible causes of the robot's instantaneous return to the origin of the world coordinate during rviz simulation
- Mise en œuvre de la quantification post - formation du bminf
- Leetcode: Sword Finger offer 42. Somme maximale des sous - tableaux consécutifs
- Digital people anchor 618 sign language with goods, convenient for 27.8 million people with hearing impairment
- Bitwise logical operator
- IJCAI2022论文合集(持续更新中)
- Simple use of promise in uniapp
- Intel Distiller工具包-量化实现1
- Tdengine biweekly selection of community issues | phase III
- Introduction to the differences between compiler options of GCC dynamic library FPIC and FPIC
猜你喜欢
ant-design的走马灯(Carousel)组件在TS(typescript)环境中调用prev以及next方法
IJCAI2022论文合集(持续更新中)
Delay initialization and sealing classes
Problems encountered in connecting the database of the project and their solutions
Intel Distiller工具包-量化实现2
Improved deep embedded clustering with local structure preservation (Idec)
ROS compilation calls the third-party dynamic library (xxx.so)
Swagger setting field required is mandatory
Export IEEE document format using latex
MySQL uninstallation and installation methods
随机推荐
TP-LINK enterprise router PPTP configuration
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
LeetCode:387. The first unique character in the string
Guangzhou will promote the construction of a child friendly city, and will explore the establishment of a safe area 200 meters around the school
The harm of game unpacking and the importance of resource encryption
[OC]-<UI入门>--常用控件-提示对话框 And 等待提示器(圈)
BMINF的后训练量化实现
LeetCode:剑指 Offer 04. 二维数组中的查找
The network model established by torch is displayed by torch viz
[OC]-<UI入门>--常用控件-UIButton
ant-design的走马灯(Carousel)组件在TS(typescript)环境中调用prev以及next方法
LeetCode:剑指 Offer 48. 最长不含重复字符的子字符串
【嵌入式】Cortex M4F DSP库
Promise 在uniapp的简单使用
甘肃旅游产品预订增四倍:“绿马”走红,甘肃博物馆周边民宿一房难求
Target detection - pytorch uses mobilenet series (V1, V2, V3) to build yolov4 target detection platform
Unsupported operation exception
LeetCode:124. 二叉树中的最大路径和
LeetCode:673. 最长递增子序列的个数
随手记01