哈喽~大家好,上期我们聊了聊yaml数据。本期内容是他的兄弟篇。yaml数据驱动与yaml部分模块的封装。废话不多,昊料开始。
01 yaml数据驱动
数据驱动在自动化中起到了一个很重要的作用。它实现了一条case,多次执行。很多的接口测试工具,也都把数据驱动利用的淋漓尽致。就拿我们最熟悉的jmeter来说。它的数据驱动是依靠CSV文件(一种通用文本格式。常用于数据之间的转换。一行就是一条数据,数据中多个值用“,”分割。)设置的,通过编写CSV表格,然后设置好对应的参数。在接口中调用这些参数所属的变量。即可实现数据驱动。
上期内容我们说到,在做接口自动化的过程中,由于yaml格式的数据与现在流行的restful数据结构一样。所以yaml作为接口自动化中的数据源文件是最合适的。在yaml中,也可以实现数据驱动。
02 初识数据驱动
在没开始说数据驱动之前。先引入一个场景,如果我们想要测一个接口,抛开这个接口有多少个字段不说,就从参数覆盖上,我们要做一条正向用例,然后要校验这个参数是否必填、长度是否符合标准、类型是否是正确的、就要设计4、5条用例。就会出现如下图所示的情况
同一个接口为了覆盖参数是否合法,就做了5条用例。而且除了data参数不一致以外。其他的都是一样的。这很不符合python代码的特性。
为解决这个问题。数据驱动就上场了。
pytest中有一个装饰器是@pytest.mark.parametrize(参数名,数据源);这个装饰器主要功能是将列表转换成用例,列表中的元素个数表示用例个数。举个小例子
单条
data = "s"
@pytest.mark.parametrize("caselist",data)
def test_case(caselist):
print(caselist)
执行结果
多条
data_list = ["zhangsan","lisi","wangwu"]
@pytest.mark.parametrize("caselist",data_list)
def test_case(caselist):
print(caselist)
执行结果
上面这个小例子演示了数据驱动的简单实现。pytest.mark.parametrize()接收两个参数,一个是参数名,一个是数据列表。
参数名:表示给每个数据源起一个名称。在用例方法中,需要将这个参数名作为参数传入。
数据源:是主要的数据载体。可以传一个值或传多个值,但是这里注意,所传的参数必须是可迭代的。否则会报xx类型是不可被迭代的错。
比如我们传一个int类型参数,如下图所示。
传入数据源后,这个装饰器就会进行解析,然后将这个数据源中的每一个元素转成一条用例。
通过pytest的特性。我们就可以使用数据驱动进行用例的维护了。实现接口用例覆盖的同时,也提高了代码复用率。
03 yaml数据驱动
上面说到数据驱动的优势,接下来我们说说yaml数据驱动。
在yaml中。我们可以将数据使用列表嵌套字典+关键字的方式来实现数据驱动。定义yaml文件时。在最外层使用“-”(上期介绍过,“-”在yaml文件里面表示数组的意思。)包裹字典数据。然后传入pytest.mark.parametrize()中。
yaml文件
-
name: 张三
age: 24
sex: 女
-
name: 李四
age: 24
sex: 男
用例代码
import pytest
import yaml
with open("test.yaml","r",encoding="utf-8") as f:
data = yaml.load(stream=f,Loader=yaml.FullLoader)
@pytest.mark.parametrize("caselist",data)
def test_case(caselist):
print(caselist)
执行结果
上面这个小练习,演示了yaml作为数据驱动的效果。
实现思路就是使用列表嵌套字典的数据结构来定义yaml文件,然后读取这个yaml文件,读取后的参数数据结构,如下图所示,是我们想要的[{},{}...]的格式。
把读取到的数据传入装饰器的数据源参数中。就大功告成了~
04 结语
好了~本期内容先到这里,下期我们就yaml数据驱动的封装以及参数化介绍。
为了不浪费大家时间。我的分享尽量保持在1500字左右。篇幅太长不宜大家阅读。