自动化测试中,测试数据与脚本分离以及参数化方法

测试数据和测试代码在实际的测试工作中,往往是分开存放的,利于测试数据和测试脚本的分开来维护。比如,为测试用例添加几组新的测试数据,只需要修改测试数据文件,测试代码不需要动;如果是测试用例增加了新的校验点,只需要修改测试脚本,不需要修改测试数据文件。

如果你想学习软件测试,我这边给你推荐一套视频,这个视频可以说是B站百万播放全网第一的自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取

B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibiliB站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click

一、准备测试数据

现在在data/目录下创建一个用于存放测试数据的Yaml文件test_in_theaters.yaml,内容如下:

---
tests:
- case: 验证响应中start和count与请求中的参数一致
  input:
    method: GET
    path: /v2/movie/in_theaters
    headers:
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
    params:
      apikey: 0df993c66c0c636e29ecbb5344252a4a
      start: 0
      count: 10
  expected:
    response:
      title: 正在上映的电影-上海
      count: 10
      start: 0
- case: 验证响应中title"正在上映的电影-北京"
  input:
    method: GET
    path: /v2/movie/in_theaters
    headers:
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
    params:
      apikey: 0df993c66c0c636e29ecbb5344252a4a
      start: 1
      count: 5
  expected:
    response:
      title: 正在上映的电影-北京
      count: 5
      start: 1

熟悉Yaml格式的同学,应该很容易看懂上面测试数据文件的内容。这个测试数据文件中,有一个数组tests,里面包含的是两条完整的测试数据。一个完整的测试数据由三部分组成:

  1. case,表示测试用例名称。
  2. input,表示输入参数。
  3. expected,表示预期结果。

上面的input输入参数,是一个http请求对象,包含了被测接口的所有参数,包括请求方法、请求路径、请求头、请求参数。expected表示预期结果,上面的测试数据中,只列出了对请求响应的预期值,实际测试中,还可以列出对数据库的预期值。

二、编写测试脚本

新建一个测试脚本
test_paramtrize_by_data_driven.py,内容如下:

import pytest

class TestDataDriven:
    @pytest.mark.datafile('data/test_in_theaters.yaml')  # 相对于项目根目录的相对路径
    def test_data_driven(self, parameters):
        print(parameters['input'])
        print(parameters['expected'])

首先看一下测试函数,在测试函数上方使用了一个叫做datafile的marker来为测试函数提供数据。测试数据的路径是相对于项目根路径的相对路径,这里表示的是测试数据是在项目的根路径下data目录中的test_in_theaters.yaml。测试函数通过parameters这个fixture拿到测试数据内容。

三、实现pytest_generate_tests Hook

上面测试脚本使用测试数据的方法,是在tests/conftest.py文件中的pytest_generate_tests函数中实现的。

import yaml
import json

def pytest_generate_tests(metafunc):
    ids = []
    markers = metafunc.definition.own_markers
    for marker in markers:
        if marker.name == 'datafile':  # 读取外数据
            test_data_path = os.path.join(metafunc.config.rootdir, marker.args[0])  # 拼接测试数据路径
            with open(test_data_path) as f:
                ext = os.path.splitext(test_data_path)[-1]
                if ext in ['.yaml', '.yml']:
                    test_data = yaml.safe_load(f)
                elif ext == '.json':
                    test_data = json.load(f)
                else:
                    raise TypeError('datafile must be yaml or json,root must be tests')
    if "parameters" in metafunc.fixturenames:   # 用外部数据进行参数化
        for data in test_data['tests']:  # 用test_data中的case作为测试用例名称
            ids.append(data['case'])
        # 用test_data这个列表对parameters进行参数化。
        metafunc.parametrize("parameters", test_data['tests'], ids=ids, scope="functi

metafunc.definition.own_markers可以读取到测试函数中所有的marker,如果存在datafile这个marker,表示需要从外部读取测试数据,测试数据可以是YAML格式也可以是Json格式。如果测试函数的metafunc.fixturenames中含有parameters这个fixture函数,就用外部测试数据对它进行参数化。

四、参数化套路

有了pytest_generate_tests这个Hook函数后,对测试函数进行参数化需要做三个改动:

  • 在data目录下新加一个YAML或者Json格式文件。文件内容格式参考上面的例子。
  • 指定测试数据文件的路径@pytest.mark.datafile('data/test_in_theaters.yaml')
  • 给测试数据提供一个叫做 parameters的fixture

现在,整个项目的目录结构应该是如下所示:

$ tree
.
├── Pipfile
├── Pipfile.lock
├── data
│   └── test_in_theaters.yaml
├── tests
│   └── conftest.py
│   └── test_data_driven.py

五、总结

本文实现测试脚本和测试数据的分离的核心,还是实现了Hook函数,在Hook函数中读取测试数据文件,并对测试函数的fixture进行参数化。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值