PlayWright(十九)- Pytest之fixture测试夹具

2023-10-17 10:00:39 浏览数 (2)

fixture是Pytest的测试夹具,相当于unittest的setup和teardown,这个在之前我们也有介绍

setup和teardown详情可看:https://cloud.tencent.com/developer/article/2344406

那为什么我们不用setup和teardown呢,因为我们使用fixture更加灵活,具体有独立的命名,然后呢,还可以按模块化的方式实现,每个fixture都可以互相调用,并且呢范围可以跨函数、类、模块、还有整个session范围

那fixture怎么使用呢?

1、fixture初步使用

我们直接在函数前定义就可以

@pytest.fixture()

但是这块是有一些注意事项:要定义的函数最好不要以test开头,和用例分开,并且fixture定义的函数是有返回值的,下边的测试用例可以调用fixture的返回值

我们看下实战

代码语言:javascript复制
@pytest.fixture()
def set():
    print("----在用例前执行----")

def test_01(set):
    print('用例1')

这里我们定义了一个测试夹具,然后再test_01中使用了测试夹具的参数,那么执行结果应该是会先调用这个夹具函数,然后再执行用例函数

看下执行结果:

2、fixture进一步使用

我们还有一种使用fixture的方式

@pytest.mark.usefixtures(fixture_name)

这样使用,我们如果用在类上呢,这个类下的所有用例都会调用这个fixture

直接看实战:

代码语言:javascript复制
@pytest.fixture()
def set():
    print("----在用例前执行----")


@pytest.mark.usefixtures('set')
class Test_Demo():

    def test_01(self):
        print('用例1')

    def test_02(self):
        print('用例2')

看下结果:

每个用例前都执行了测试夹具

那么还有一种只作用在用例上呢

看实战:

代码语言:javascript复制
@pytest.fixture()
def set():
    print("----在用例前执行----")


class Test_Demo():
    @pytest.mark.usefixtures('set')
    def test_01(self):
        print('用例1')

    def test_02(self):
        print('用例2')

执行结果:

只有用例1前执行了测试夹具

3、fixture作用域

在我们之前用了setupClass和tearDownclass,指的是在每个类前会执行前置,在执行后置

那我们在fixture中,也可以这样使用

并且有好几个:

  • unction:默认作用域,每个测试用例都运行一次
  • class:每个测试类只执行一次
  • module:每个模块只执行一次
  • package:每个python包只执行一次
  • session:整个会话只执行一次,即运行项目时整个过程只执行一次

如果设置多个的话,会有一个优先级:session > package > module > class > function

那我们以其中的作用域为class做一个实战场景:

代码语言:javascript复制
@pytest.fixture(scope='class')
def set():
    print("----在用例前执行----")

class Test_Demo1:
    def test_01(self,set):
        print('用例1执行')
    def test_02(self,set):
        print('用例2执行')

class Test_Demo2():
    def test_01(self,set):
        print('第二个类中的用例1')

我们在夹具函数上定义每个类只执行一次

现在猜下执行结果是什么,是不是夹具——>Test_Demo1,夹具——>Test_Demo2

直接看结果:

对于测试夹具,我们就暂时写到这里了

0 人点赞