写点什么

干货 | 一改测试步骤代码就全写?为什么不试试用 Yaml 实现数据驱动?

  • 2022 年 9 月 09 日
    北京
  • 本文字数:1853 字

    阅读完需:约 6 分钟

理念与同“UI 自动化测试框架”中的“测试步骤的数据驱动”相同,接口中的测试步骤的数据驱动就是将接口的参数(比如 method、url、param 等)封装到 yaml 文件中管理。当测试步骤发生改变,只需要修改 yaml 文件中的配置即可。数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议使用一种结构化的文件(例如 yaml,json 等)来对数据进行存储,然后在测试用例中读取这些数据。


原理与前面章节“UI 自动化测试框架”中的“测试数据的数据驱动”大同小异。依然使用 @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 headerenv={"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: 4default:"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 文件来直接修改配置信息。


点击下方链接免费领取:性能测试+接口测试+自动化测试+测试开发+测试用例+简历模板+测试文档

http://qrcode.testing-studio.com/f?from=infoQ&url=https://ceshiren.com/t/topic/22265

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019.10.23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
干货 | 一改测试步骤代码就全写?为什么不试试用 Yaml实现数据驱动?_霍格沃兹测试开发学社_InfoQ写作社区