pytest的fixture
fixture 和 普通前后置条件的区别
fixture 的作用和 setup / teardown 功能类似,都是在case执行前和执行后自动执行的,但是他更加灵活
1、setup 和 teardown 是拿不到返回值的,使用 fixture 是可以的
2、steup 和 teardown 无法指定在某个case上运行, fixture 是可以的
3、setup 和 teardown 多文件使用,每个文件都需要写,fixture 可以只写一次
4、fixture 就是一个普通的函数, 使用@pytest.fixture装饰之后,就变成了一个fixture,使用 yield 关键字,来决定前置条件还是后置条件
1、普通的setup和teardown
import pytest
class TestUser:
@classmethod
def setup_class(cls):
print('setup_class')
@classmethod
def teardown_class(cls):
print('teardown_class')
def setup_method(self):
print('setup_method')
def teardown_method(self):
print('teardown_method')
def test_user(self):
print('testuser')
if __name__ == '__main__':
pytest.main([__file__, '-s'])
运行结果是:
test.py setup_class
setup_method
testuser
.teardown_method
teardown_class
2、fixture -普通的
import pytest
@pytest.fixture
def fixture1():
print('这是fixture1')
def test_user1(fixture1):
print('test_user1')
if __name__ == '__main__':
pytest.main([__file__, '-s'])
方法被 @pytest.fixture 装饰了之后,就可以被使用的函数调用
运行顺序是:
1-pytest 找到了 test_开头的函数 test_user1
2-test_user1 这个测试函数,需要一个参数fixture1,于是fixture1函数就被找到
3-fixture1被调用来创建一个实例
运行的结果是:
test2.py 这是fixture1
test_user1
.
3、fixture-有返回值,单个返回值和多个返回值
import pytest
@pytest.fixture
def fixture2():
print('这是fixture2')
return 1
def test_user2(fixture2):
ret = fixture2
print(ret)
print('test_user1')
@pytest.fixture
def fixture3():
print('这是fixture3')
return 2, 3
def test_user3(fixture3):
ret1 = fixture3[0]
ret2 = fixture3[1]
print(ret1)
print(ret2)
print('test_user3')
if __name__ == '__main__':
pytest.main([__file__, '-s'])
执行结果
test2.py 这是fixture2
1
test_user1
.这是fixture3
2
3
test_user3
.
4、fixture-加关键字autouse=True
import pytest
@pytest.fixture(autouse=True)
def fixture1():
print('这是fixture1')
def test_user1():
print('test_user1')
class TestUser1:
def test_user2(self):
print('test_user2')
def test_user3(self):
print('test_user3')
if __name__ == '__main__':
pytest.main([__file__, '-s'])
autouse这个参数的作用是自动使用fixture,自动使用的话,就不需要传入fixture了,case在运行之前他会自动运行fixture
使用atuouse的话,返回值就获取不到了,需要用返回值的话 ,还是需要传入fixture
执行结果:
test.py 这是fixture1
test_user1
.这是fixture1
test_user2
.这是fixture1
test_user3
.
5、fixture-加关键字 scopr=" class/functiom/module/session "
import pytest
@pytest.fixture(scope='function', autouse=True)
def fixture4():
print('这是fixture4')
@pytest.fixture(scope='class', autouse=True)
def fixture5():
print('这是fixture5')
def test_user4():
print('test_user4')
class TestUser5:
def test_user5(self):
print('test_user5')
def test_user6(self):
print('test_user6')
if __name__ == '__main__':
pytest.main([__file__, '-s'])
当出现多个范围装饰的时候,优先实例化范围优先级高的。
也就是优先级从大到小:session–>module–->class–->function
运行结果:
test2.py 这是fixture5
这是fixture4
test_user4
.这是fixture5
这是fixture4
test_user5
.这是fixture4
test_user6
.
6、fixture实现后置,只需要用yield关键字
import pytest
@pytest.fixture(autouse=True)
def fixture1():
print('这是fixture1的前置')
yield
print('这是fixture1的后置,在yield之后')
def test_user1():
print('test_user1')
class TestUser1:
def test_user2(self):
print('test_user2')
def test_user3(self):
print('test_user3')
if __name__ == '__main__':
pytest.main([__file__, '-s'])
执行结果:
test.py 这是fixture1的前置
test_user1
.这是fixture1的后置,在yield之后
这是fixture1的前置
test_user2
.这是fixture1的后置,在yield之后
这是fixture1的前置
test_user3
.这是fixture1的后置,在yield之后