哈喽,大家好,我是小王~本期内容说说pytest中的工厂函数。说完本期内容,pytest基础使用就告一段落。下期就开始围绕封装思想展开细说。好了,废话少说,开整。
01 前言
上期内容说到了pytest装饰器中的跳过、预期失败、以及数据参数化;还有分布式执行的内容。其中数据参数化,更是在日常工作中,必用到的一个点。
那么本期内容,就来说pytest比较有意思的一个函数。工厂函数。也可以叫它夹具--fixture函数
fixture函数的效果与setup、teardown效果类似。setup、teardown应用于在模块内部。可以是类、可以是方法。但是不能跨模块使用。fixture则可以应用于每个模块中。
02 fixture
使用方式:
fixture是通过pytest中的pytest.fixture()装饰器来标记工厂函数。在函数中,用yield来标记前置处理与后置处理,yield前的代码表示前置处理,yield后的代码表示后置处理。
import pytest
class TestFixture:
@pytest.fixture()
def be(self):
print('be')
# 如果需要使用后置方法。需要增加一个yield关键字。而后在关键字后面写入后置代码
# 效果类似teardown
yield
print('退出')
# 方法1方法名的括号中。添加上工厂函数名即可
def test_login(self, be):
print('login1')
# 方法2 @pytest.mark.usefixtures('工厂函数名')
@pytest.mark.usefixtures('be')
def test_login2(self):
print('login2')
参数说明:
scope:标记fixture的作用域
function:在函数或方法运行时执行fixture函数的功能 默认作用域
class:在类运行时调用一次。
module:在一个模块(一个py文件为一个模块)被运行时,执行一次fixture
package:当前被使用fixture的文件所在的包,执行一次fixture
session:当前被使用fixture的文件所在的整个项目目录,执行一次fixture
ids:当使用参数化时,给每一个参数的值一个变量名(用处不大)
params:一个可选的参数列表,它将导致对夹具函数和所有使用它的测试的多次调用。使用参数是
特别说明:ids与params结合使用。
name:给fixture函数起一个别名
autouse:自动执行工厂函数 。默认false
在修饰工厂函数时,将autouse参数设置为True;@pytest.fixture(autouse = True)
作用域:
在修饰工厂函数时,添加参数scope;@pytest.fixture(autouse = True,scope = ‘class’)
scope = ‘class’ 为类函数
需要指定某一个类使用工厂函数的话。就可以使用usefixtures的装饰器装饰该类
@pytest.mark.usefixtures('fixure')
class Test2():
def test01(self, fixure):
print('第二个类中的函数')
03 conftest.py
conftest.py是夹具的文件。可以将所有夹具方法,写入这个文件中。当fixture放在这个文件中后,结合fixture装饰器中的scope参数,可以明确夹具执行的时机以及覆盖的作用域。
conftest.py也有他自己的作用域。如果是根目录。则作用域是属于根目录的。如果是模块内。那作用域就在模块内。
结合这个特性。可以根据不同的业务场景。定制属于自己的夹具方法。
04 实际应用
应用场景1:清理日志,默认保留30天。在每次脚本运行前检查日志。超过30天的文件清空。
应用场景2:在某条业务线中,每个接口都需要登录才能进行后续验证。在该业务线的模块下,定义夹具,调用login接口。生成所用的数据并存入临时文件中,以便后续方法调用。
如上两个场景是小王在近期工作中应用到夹具的场景。还是非常好用的
05 结语
好了。本期内容到这里了。大佬们下期见~小王先退下了