前言:

实际Web UI自动化中的开发场景,比如是一个登录框

  1. 你肯定需要测试账号空、密码空、账号密码都为空、账号不存在、密码错误、账号密码正确等情况
  2. 这些用例的区别就在于输入的测试数据和对应的交互结果
  3. 所以我们可以只写一条登录测试用例,然后把多组测试数据和期望结果参数化,节省很多代码量

Pytest 的参数化测试实现方式有三种:

  1. - @pytest.mark.parametrize 允许在测试函数或类中定义多组参数和fixtures
  2. - pytest.fixture() 允许fixture有参数化功能(后面讲解)
  3. - pytest_generate_tests 允许定义自定义参数化方案或拓展

1. 通过@pytest.mark.parametrize 装饰器实现

1.1 一个简单的例子

              **       代码:                  **

# -*- coding:utf-8 -*-
# Author:tang_ren_li
# 2022-2-20 22:45

import pytest

def add(a,b):
    return a+b

#测试了加法方法的一种可能 没有使用参数化
def test_add():
    assert add(3,2)==5
#这里通过一个字符串,里面的参数用逗号隔开定义了一组参数
#通过一个列表里面包含了一组列表的方式, 最里面的一个列表对应的一组测试的数值
@pytest.mark.parametrize("a,b,sum0",[[1,2,3],[4,6,10],[11,12,23]])
def test_add_dataDriver(a,b,sum0):
    assert add(a,b)==sum0


运行结果:

===================== test session starts =============================
collecting … collected 4 items

Test_Data_Demo0.py::test_add PASSED [ 25%]
Test_Data_Demo0.py::test_add_dataDriver[1-2-3] PASSED [ 50%]
Test_Data_Demo0.py::test_add_dataDriver[4-6-10] PASSED [ 75%]
Test_Data_Demo0.py::test_add_dataDriver[11-12-23] PASSED [100%]

===================== 4 passed in 0.02s ==============================

说明:

  1. 可以发现参数化的测试用例执行了3次,每次测试对应不通的测试数据
  2. 所有的测试数据都保存在一个列表里,如果我们有大量的测试数据,

    我们就可以一同样的格式将数据保存在某个文件里,然后通过打开文件的方式导出这些数据
    就可以实现数据和测试用例的分离。这就是数据驱动测试的基本思想。