mark是用来对测试方法进行标记的一个装饰器。装饰器可以根据字面意思理解就是对测试方法的修饰,在测试方法的上方调用装饰器函数,就可以使得测试方法在实现自己功能之外还可以有其他的功能。
一、标记测试函数
在命令行模式下可以使用pytest --markers查看官方提供的mark,如下图所示,共有8个mark函数。
各个mark的含义如下:
1、@pytest.mark.filterwarnings(warning):在标记的测试方法上添加警告过滤。
2、@pytest.mark.skip(reason=None):执行时跳过标记的测试方法,reason为跳过原因,默认为空。
3、@pytest.mark.skipif(condition):通过条件判断是否跳过标记的测试方法。如果condition的判断结果为真则跳过,否则不跳过。
4、@pytest.mark.xfail(condition, reason=None, run=True, raises=None, strict=False):如果条件condition为True,则将测试预期结果标记为False。
5、@pytest.mark.parametrize(arguments, argvalues):测试函数参数化,即调用多次函数,传递不同的参数。
6、pytest.mark.uesfixtures(fixturename1, fixturename2, ...):将测试用例标记为需要指定的所有fixture(固件),和直接使用fixture的效果是一样的,只不过不需要把fixture名称作为参数放在方法声明当中。
7、pytest.mark.tryfirst:标记一个挂钩实现函数,使所标记的测试方法可以首先或尽早执行。
8、pytest.mark.trylast:标记一个挂钩实现函数,使所有标记的测试方法可以最后或尽可能晚执行。
下面详细说下xfail和parametrize的用法。
二、xfail
xfail可以拆成x和fail理解,x表示预期的结果,fail为失败,标记的是预期结果为失败的用例。xfail装饰器解决的是对于很清楚测试用例运行结果为失败,但是又需要执行的用例,可以在结果中给出很明显的标识。
以下两个用例断言结果分别是成功和失败,都用xfail做了标记
@pytest.mark.xfail(reason='这个用例预期结果是失败的')
def test_add1():
assert add(2, 3) == 5 #断言结果成功
@pytest.mark.xfail(reason='这个用例预期结果是失败的')
def test_add2():
assert add(2, 3) == 4 #断言结果失败
简化的执行结果为Xx:X为test_add1的运行结果,表示xpass,意思是预期结果是失败的,但是断言结果却为成功;x为test_add2的运行结果,表示xfail,意思是预期结果是失败的,断言结果也是失败的。
详细的执行结果如下:
三、parametrize
parametrize用于对测试用例的数据进行参数化,使得同一个测试方法可以用不同的测试数据进行测试。使用时会用两种场景:一是单参数的使用;二是多个参数的使用。
1、单参数的使用
例子如下:
#-*-coding:utf-8-*-
import pytest
list = [1, 2, 3, 4] #定义一个列表
@pytest.mark.parametrize('num', list) #'num'为测试方法的参数,给参数赋值为list
def test_add1(num):
assert add_number(1, num) == num+1
运行结果如下:可以看到将list中的数据分别进行了测试
2、多个参数的使用
先看个例子:
#-*-coding:utf-8-*-
import pytest
list_two = [(1, 2, 3), (2, 3, 5), (3, 5, 6)]
def add_number(a, b):
return a+b
#num1,num2,sum都是测试方法的参数,运行时将list[0]、list[1]、list[2]分别赋值给参数
@pytest.mark.parametrize('num1, num2, sum', list_two)
def test_add1(num1, num2, sum):
assert add_number(num1, num2) == sum
即运行的第一组参数为:num1=1,num2=2,sum=3;第二组参数为:num1=2,num2=3,sum=5;第三组参数为:num1=3,num2=5,sum=6
运行结果如下:
希望这些内容对码友们会有帮助(*^▽^*)