pytest的fixture

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之后
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值