Pytest08--数据驱动测试
数据驱动测试
测试函数+循环执行用例
- pytest认为,测试函数只执行一次,就是一次测试;只要循环在函数内部,执行多少次循环都是一个测试
- assert一旦断言失败,后续代码将不再执行,所以当断言失败时,退出本次测试函数执行,由于只有一个测试函数,所以整个测试结束
- 至于循环调用测试函数,pytest不支持/不认可
参数化的含义
- 参数化也叫数据驱动测试:代码只编写一份,使用不同的测试数据去执行这份代码,这种测试方式叫做数据驱动测试
- 参数化:是数据驱动测试的实现方式,二者是同义语
①将用例数据读到程序中,传递给测试函数或测试方法的形参,以进行测试,故名参数化
编写一个测试模块ce_calc3.py
定义2个测试函数,分别测试Calc类的add和sub方法,使用循环执行多个手工测试用例
class Calc:
def add(self, a, b):
return a + b
def sub(self, a, b):
return a -- b
运用for循环方式编写
# 参数化:对比在测试函数中使用循环实现执行大量用例
from calc import Calc
import pytest
# 测试固件:每次执行测试之前都要创建一个Calc对象
@pytest.fixture(autouse=True)
def create_calc_obj():
global c # 参考上一段代码中的全局变量的基础只是
c = Calc()
cases1 = [[1, 2, 3], [1, 0, 1], [-1, 2, 1], [-1, -2, -3]] # 加法的用例
# 测试加法
def test_add():
# 运用for循环方式编写
for case in cases1:
a, b, expect = case
actual = c.add(a, b)
assert actual == expect, f'加法用例{case}测试失败==预期:{expect}==实际:{actual}'
print(f'加法用例{case}执行完毕')
cases2 = [[1, 0, 1], [1, 2, -1], [3, 2, 1], [2, 3, -1]]
# 测试减法
def test_sub():
# 运用for循环方式编写
for case in cases2:
a, b, expect = case
actual = c.sub(a, b)
# assert actual == expect, f'减法用例{case}测试失败==预期:{expect}==实际:{actual}'# 出现错误后面不执行
pytest.assume(actual == expect, f'减法用例{case}测试失败==预期:{expect}==实际:{actual}')
print(f'减法用例{case}执行完毕')
if __name__ == '__main__':
pytest.main(['-v', '--tb=short', 'demo01.py'])
pytest参数化的形式
@pytest.mark.parametrize(‘形参1, 形参2, ...’, 二维列表用例)
def test***(形参1, 形参2, ...):
...
注意
①参数化后的形参必须以英文逗号间隔,放在字符串中
②形参的个数必须与二维列表中小列表列数一致
③上下的形参名必须同名
@pytest.mark.parametrize("参数1 , 参数2" ,
[
['数据11' , '数据12' ] ,
['数据21' , '数据22' ]
] )
def 测试函数名(参数1,参数2):
测试代码
实现Calc类测试代码参数化
编写一个测试函数,测试sub,紧接着测试add
from calc import Calc
import pytest
# 测试固件:每次执行测试之前都要创建一个Calc对象
@pytest.fixture(autouse=True) # 测试固件/测试夹具
def create_calc_obj():
global c # 参考上一段代码中的全局变量的基础只是
c = Calc()
cases_add = [[1, 2, 3], [1, 0, 1], [-1, 2, 1], [-1, -2, -3]] # 加法的用例
cases_sub = [[1, 0, 1], [1, 2, -1], [3, 2, 1], [2, 3, -1]] # 减法的用例
@pytest.mark.parametrize('a,b,expect', cases_add) # 参数化装饰器 封装了循环.一次取一条用例(小列表),把一条用例拆到/解包到引号中的变量中
def test_add(a, b, expect): # 这里有四条用例,本测试函数执行4次
actual = c.add(a, b)
assert actual == expect, f'加法用例(a,b,expect)==执行失败==预期:{expect}==实际:{actual}'
print(f'加法用例(a,b,expect)==执行通过')
@pytest.mark.parametrize('a,b,expect', cases_sub) # 参数化装饰器
def test_sub(a, b, expect): # 减法用例
actual = c.sub(a, b)
assert actual == expect, f'减法用例(a,b,expect)==执行失败==预期:{expect}==实际:{actual}'
print(f'减法用例(a,b,expect)==执行通过')
if __name__ == '__main__':
pytest.main(['-v', '--tb=short', 'demo01.py'])
本文来自博客园,作者:暄总-tester,转载请注明原文链接:https://www.cnblogs.com/sean-test/p/15547272.html

浙公网安备 33010602011771号