pytest是一个单元测试框架
什么是单元测试
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。而这个最小可测单元,指的就是代码中的函数/方法。
由此我们推出第二个问题:函数/方法的入口和出口是什么
函数/方法的入口是内部的参数列表,出口是return值。
需求知道了,然后我们要做什么?
我们需要提供参数列表来尽可能的穷举出无限种可能情况,来确认他的返回值是否为预期情况。
这个为测试函数/方法提供多个参数的过程,就叫做参数化。
我认为单元测试从微观上来说的核心就是参数化入参,以及断言参数化。
至于setup 和teardown只是一些基础配置类
而pytest 本身就支持这些,而unittest本身并不支持数据的参数化,需要借助第三方工具DDT来实现参数化。
需求:函数 equivalent(a,b) 需要验证参数a,b之和是否为10 。
方案:为了不更改函数名称,我们保留原函数名和参数列表,在外层包括一层函数def test_add2(a,b)。因为pytest只能检测test开头或者结尾的函数。
参数化:
1.参数化在当前类:
在测试类内,添加装饰器@pytest.mark.parametrize('形参列表',[(第一组参数1,第一组参数2..),(第二组)参数1,第一组参数2)]
例子:
@pytest.mark.parametrize('a,b',[(5,5),(6,4),(3,7),(8,2)
])
2.外部文件参数化。参照下面的代码:
直接在外部文件定义变量,写入多组参数列表;内部引用时,from 。import * 导入 ,就可以使用
断言:
pytest直接使用assert 表达式 ,可以自定义表达式。
,同时可以声明断言提示信息。
outconfig.py #外部参数化文件
dataout=[(1,4),(7,8)]
test_para.py #测试类文件
import pytest #导入参数化包
from case.test.import * #导入参数化文件,文件内参数
@pytest.mark.parametrize('a,b',dataout) #参数化:指定参数变量和值
def test_add2(a,b):
def equivalent(a,b):
return a+b
assert 10 == equivalent(a,b) ,"%s +%s 不等于10 " %(a,b)
# 自定义断言结构 # 断言失败提示信息
执行结果:
ptest.py .F
AssertionError: 7 +8 不等于10
10 != 15
执行文件: ptest.py
执行结果 : . F 点代表执行成功;F代表执行失败fail
执行成功:不显示断言信息
执行失败: 显示assert 逗号部分的信息、 以及断言的前后内容结果