一、使用背景

当我们在设计用例的时候,经常会出现需要不同参数的情况,例如一个登录的用例,我们需要测试它登录名正常、为空、长度过长、过短、特殊字符等情况,因此就需要有不同情况下的参数,而当这些参数过多时,我们如果要一步一步的输入,便会显得有点繁琐,因此就需要有参数化的概念。这里用到pytest里的parametrize+yaml来实现参数化。

 

二、parametrize

首先我们需要知道parametrize的用法。下面是官方文档中的说明

pytest参数化时用例名称 pytest参数化yaml文件数据_用例

 

这里我总结了一下:

@pytest.mark.parametrize("参数名",列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。

接下来直接用代码说明:

@pytest.mark.parametrize("a, b, c", [(1, 2, 3), (4, 5, 9), (1, 3, 6)])
def test_add01(a, b, c):
    res = a + b
    assert res == c

  

这里是比较a+b是否等于c,显然只有2个满足该条件,故断言只有2个通过  

运行结果:

pytest参数化时用例名称 pytest参数化yaml文件数据_用例_02

 

 

三、yaml

能用来做参数化的形式其实有很多种,可以用xlrd读取excel表做参数化也可以。这里我选择用yaml来做参数化。因为yaml是一个可读性高,用来表达数据序列化的格式,它不是一门语言,跟json有点类似,是一种储存数据的载体,且支持多种语言,也比较容易理解。需要注意的是yaml比较注重格式,下面是yaml格式的一些基本语法:

pytest参数化时用例名称 pytest参数化yaml文件数据_参数化_03

 

 示例:

-
  - 1
  - 2
  - 3

-
  - 3
  - 4
  - 7

  

- case1:
  - search_key: "python"
- case2:
  - search_key: "ddt"
- case3:
  - search_key: "selenium"

  

四、将yaml数据转换成parametrize可读的列表形式

从上面我们知道了parametrize需要传一个数据参数 ,所以现在的关键点是怎么把yaml格式的数据转换成parametrize可接受的数据格式。

import yaml


def get_yaml(yaml_file):
    with open(yaml_file, "r", encoding="utf-8") as fp:
        f = fp.read() # 读出来是字符串
        print(type(f))
    d = yaml.load(f) # 转列表
    print("读取到yaml文件数据")
    print(d)
    print(type(d))
    return d

 封装一个方法,该方法用来将yaml中的数据转换成列表。上面的两个yaml示例转换成列表后如下:

pytest参数化时用例名称 pytest参数化yaml文件数据_数据_04

pytest参数化时用例名称 pytest参数化yaml文件数据_pytest参数化时用例名称_05

 

 知道了yaml格式和如何转换yaml数据之后,接下来要实现用例的参数化就好办多了。

test_parametrize.py

import pytest
from testyaml import get_yaml


file = get_yaml("D:\\python project\\test\\test.yaml")
@pytest.mark.parametrize("a, b, c", file)
def test_add02(a, b, c):
    res = a + b
    assert res == c

test_yaml

-
  - 1
  - 2
  - 3

-
  - 3
  - 4
  - 7

  运行测试用例后,可以看到有两组用例测试通过

pytest参数化时用例名称 pytest参数化yaml文件数据_用例_06

 

 如果后续想继续加数据,可直接将数据写再yaml文件里即可。即实现了参数化功能,做到数据与代码分离。