上一篇讲了setup和teardown,但是我们并不是任何时候都需要全局去设置,那么这一篇来说一说这个@pytest.fixtrue()装饰器
这个装饰器的作用是实现部分用例的前后置,也就是说这个是自己可控可选的。
先来了解一下@pytest.fixtrue()的参数
@pytest.fixtrue(scope=‘’,params=‘’,autouse=‘’,ids=‘’,name=‘')
这个装饰器中我们可以填入5个参数,我们来一个一个去看
(1)scope表示的是被@pytest.fixtrue装饰器标记的方法的作用域。function(默认),class,module,package/session,这里的默认就是给每一条用例加上前后置,class就等于setup_class()只给类设置前后置,而module就是当前模块,package就是当前的包。
(2)params的作用是参数化(支持列表,元组,字典列表[{},{}]),字典元组({},{}))
from rich import scope
import pytest
@pytest.fixture(scope='function',params=['1','2','3'])
def my_fixture(request):
print('这是前置')
print('这是后置')
return request.param
class TestClass:
def test_one(self,my_fixture):
x = "this"
assert "h" in x
print(my_fixture)
def test_two(self):
x = "hello"
assert "h" not in x
首先要注意,我在类的外面定义了前置和后置,那么在类里面的方法如果要调用前后置,就要将my_fixture函数作为参数传进方法里。
前置函数接收参数必须在函数里传参request
可以通过return request.param取装饰器@pytest.fixture中参数化的参数
yield的作用是用于后置,在yield后面的代码就是后置
这里可以修改成
yield request.param
yield和return不能一起用
return和yield都表示返回
return的后面不能有代码,返回后不会继续执行
yield的后面可以有代码,作为后置是会完成后续的代码的
(3)autouse=True的作用是自动给每一个用例加上前后置,默认的是false
(4)ids的作用是当params参数化时,给每个值设置一个变量名,意义不大。
(5)name的作用是给@pytest.fixtrue标记的方法取一个别名,当取了别名之后,原来的方法名就无法使用了。
参数介绍完,我们来个代码示例:
import pytest
@pytest.fixture(scope='class',params=['1','2','3'])
def my_fixture(request):
print('这是前置')
yield request.param
print('这是后置')
class TestClass:
def test_one(self,my_fixture):
x = "this"
assert "h" in x
print(my_fixture)
def test_two(self):
x = "hello"
assert "h" not in x
我这里设置了装饰器只对class也就是类生效,然后进行参数化,传参1,2,3,我们看看运行结果
这里看到是只针对了当前的类生效的,那么为什么test_one会执行3次呢,因为我传递了3个参数,然后就是为什么从第二次执行开始都会先出现一个后置呢,因为我们每一次执行完了之后会再执行后置,所以会显示一个“这是后置”,而为什么最后一次执行的后置显示在test_two执行完之后呢,因为这一次程序把两条用例都执行完了,所以才会显示在test_two后面。
——————————————就算路是弯的,那也得走过才知道。因为你没有选择,这个社会,不前进,就灭亡。