当前位置:网站首页>一改测试步骤代码就全写 为什么不试试用 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 文件来直接修改配置信息
总结
今天的文章就到这里了哟,喜欢的小伙伴可以点赞收藏加关注哟

边栏推荐
- Alibaba cloud server mining virus solution (practiced)
- Roguelike game into crack the hardest hit areas, how to break the bureau?
- CUDA implementation of self defined convolution attention operator
- Introduction to the differences between compiler options of GCC dynamic library FPIC and FPIC
- SimCLR:NLP中的对比学习
- [sword finger offer] serialized binary tree
- LeetCode:214. Shortest palindrome string
- Unsupported operation exception
- 广州推进儿童友好城市建设,将探索学校周边200米设安全区域
- 如何有效地进行自动化测试?
猜你喜欢

Charging interface docking tutorial of enterprise and micro service provider platform
![[OC-Foundation框架]-<字符串And日期与时间>](/img/75/e20064fd0066810135771a01f54360.png)
[OC-Foundation框架]-<字符串And日期与时间>

甘肃旅游产品预订增四倍:“绿马”走红,甘肃博物馆周边民宿一房难求

Problems encountered in connecting the database of the project and their solutions

SimCLR:NLP中的对比学习

Using C language to complete a simple calculator (function pointer array and callback function)

704 binary search

I-BERT

自定义卷积注意力算子的CUDA实现
![[OC-Foundation框架]--<Copy对象复制>](/img/62/c04eb2736c2184d8826271781ac7e3.png)
[OC-Foundation框架]--<Copy对象复制>
随机推荐
数字人主播618手语带货,便捷2780万名听障人士
[OC-Foundation框架]--<Copy对象复制>
LeetCode:39. 组合总和
Esp8266-rtos IOT development
Using label template to solve the problem of malicious input by users
Current situation and trend of character animation
多元聚类分析
Swagger setting field required is mandatory
可变长参数
Crash problem of Chrome browser
力扣每日一题(二)
LeetCode:673. 最长递增子序列的个数
Detailed explanation of dynamic planning
After reading the programmer's story, I can't help covering my chest...
【嵌入式】Cortex M4F DSP库
项目连接数据库遇到的问题及解决
UML圖記憶技巧
Implement window blocking on QWidget
自动化测试框架有什么作用?上海专业第三方软件测试公司安利
LeetCode:236. The nearest common ancestor of binary tree