首先来看看设置unittest前置后置的方法:
unittest:
setup/teardown
setup当中得到的变量,怎么传递给测试用例的:self.XXX = value
setupClass,tearDownClass
setupClass当中得到的变量,怎么传递给测试用例的:cls.XXX = value
fixture前置后置的方法:
原则上:先定义再调用、共享。
定义:
1、用函数实现,函数名称不固定。--- 如何知道它是前置还是后置?
@pytest.fixture
def fix():
pass
2、前置操作和后置操作,写在一个函数里。 --用yeild 关键字区分前置后置
@pytest.fixture
def fix():
前置代码
yeild #分隔线
后置代码
3、4个作用域,即给到这4个类型的语句试用的前置后置,4选一,默认是测试函数类型。测试函数(function)、测试类(class)、测试模块文件(module)、测试会话(session)
@pytest.fixture(scope=function(默认值)/class/module/session)
def fix():
前置代码
yeild #分隔线
后置代码
4、不跟测试类/测试函数放在一起。 ---如果说有测试类要用的话,怎么办?需要的时候再调用。
5、前置操作得到的一些数据,如何传递给测试用例?
yeild返回值
在测试用例当中:以fixture函数名作为用例参数。用例参数接收返回值。
测试函数的参数:1、fixture 2、参数化
6、共享机制:conftest.py
conftest.py定义fixture,可以定义多个。
7、调用:
用例/类 主动调用fixtures.
哪儿需要哪儿调:
@pytest.mark.usefixtures("fixture的函数名称")
测试类/测试函数
如果fixture有返回值,那么,将它作为测试函数的参数时,则可以不用使用:@pytest.mark.usefixtures("fixture的函数名称")
参考代码:
conftest.py共享
原则上:
1、所在目录下全面共享
2、支持嵌套
conftest.py规则:
1、放的都是fixture
2、fixtures可以对外共享。
3、共享的范围:
当前conftest.py所在目录下的(含子孙目录),所有用例共享
4、conftest.py,是可以创建多个,在不同的包下。可以层级创建的。
5、优先级:就近原则!!
发现fiXture:用例自己的模块 -》用例所在目录下的conftest.py -》目录的父级目录下的conftest.py
6、嵌套方式:
6.1什么时候嵌套? 一个fixture,想完全使用另外一个fixture,并在人家的基础上新增一些代码。
6.2怎么嵌套?
@pytest.fixture
def fix1():
pass
@pytest.fixture
def fix2(fix1):
#新增的代码
pass
6.3嵌套后的执行顺序?
fix1的前置
fix2的前置
fix2的后置
fix1的后置
6.4可以任意fixture级别嵌套吗?
fix1 >= fix2的级别
数据驱动实现:
@pytest.mark.parametrized()
在测试用例的前面加上:
@pytest.mark.parametrize("参数名",列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。
@pytest.mark.parametrize("参数1,参数2",[(数据1,数据2),(数据1,数据2)])
示例:
@pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])
def test_add(a,b,c):
res = a + b
assert res == c
组合参数化:多组参数,依次组合。
使用多个@pytest.mark.parametrize
示例:用例有4个:0,2/0,3/1,2/1,3 迪卡尔积
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):
pass
打标记:mark功能
对用例打标记,运行的时候,只运行打标记的用例。
300个回归用例。-- 打标记50个,作为冒烟测试。
1、得先注册标记名
pytest.ini
[pytest]
markers=
标签名:说明(只能是英文)
标签名
标签名
图示:
2、给测试用例/测试类打标记
@pytest.mark.已注册的标记名
3、运行时设置只运行标记的用例
使用方法-1: pytest命令行:-m标记名
在收集到的所有用例当中,只运行有标记名的用例。
另外一种方式:
打标记范围:测试用例、测试类、模块文件
使用方法-2:
在测试类里,使用以下申明(测试类下,所有用例都被打上该标签):
class TestClass(object):
pytestmark = pytest.mark.已注册标签名
pytestmark = [pytest.mark.标签1, pytest.mark.标签2] #多标签模式
在 模块文件里,同理(py文件下,所有测试函数和测试类里的测试函数,都有该标签):
import pytest
pytestmark = pytest.mark.webtest
pytestmark = [pytest.mark.标签1, pytest.mark.标签2] #多标签模式
失败重运行机制 :
用例失败的情况下,可以重运行用例。
一旦用例失败,马上重运行。重运行的次数?
Pytest提供了失败重试机制:
插件名称:rerunfailures
安装方法:pip install pytest-rerunfailures
使用方式:
命令行参数形式:
命令:pytest --reruns 重试次数
比如:pytest --reruns 2 表示:运行失败的用例可以重新运行2次。
命令:pytest --reruns 重试次数--reruns-delay 次数之间的延时设置(单位:秒)
Pytest --reruns 2 --reruns-delay 5
表示失败的用例可以重新运行2次。第一次和第二次的间隔时间为5秒钟。