Python测试框架之pytest知识库:fixture(二)

fixture基本用法、后置处理、pytest.mark.usefixtures调用。
164阅读 · 2020-8-19 23:51发布

pytest之fixture

pytest核心功能fixture装饰器函数,它可以使代码单一的单元测试扩展到复杂的功能测试,它提供了前置、后置和传参等操作。通常用于初始化配置、初始化数据库等场景。

fixture基本语法

使用fixture装饰器装饰函数,被装饰的函数就可以在其他函数中被调用(被装饰函数不需要以test_开头或结尾)。

源码中可以fixture装饰器看到有5个关键字可以使用:

import pytest
@pytest.fixture(scope="function",params=None,autouse=False,ids=None,name=None)
  • scope:逻辑优先级是:session > module > class > function。
作用域 说明
session(多个文件级别) 多个文件调用一次,可以跨.py文件调用,每个.py文件就是module。
module级别(针对单模块) 每个模块(.py)执行一次,不管类中测试方法还是类外的测试方法。
class级别(针对测试类) 每个类执行一次,一个类可以有多个测试方法(用例)。
function级别(针对函数) 每个测试用例运行之前运行。
  • params:向被装饰函数传递参数,列表形式(可以是函数返回值的形式传递给params),每个值会像for一样传递给被装饰函数(通过内建的request接收参数)。
import pytest

seq = [1,2,3]

@pytest.fixture(params=seq)
def test_data(request):
    print("参数")
    return request.param

class TestData:
    def test_1(self,test_data):
        print("用例",test_data)

if __name__ == '__main__':
    pytest.main()

  • ids:通常配合params一起使用,用于表示每次参数循环时对应的参数名称。
import pytest

seq = [1,2,3]

@pytest.fixture(params=seq,ids=['haha','hehe','heihei'])
def test_data(request):
    print("参数")
    return request.param

class TestData:
    def test_1(self,test_data):
        print("用例",test_data)

if __name__ == '__main__':
    pytest.main()

  • autouse:设置为True时,test函数不调用该fixture装饰器,被装饰的函数也会被执行。
import pytest

seq = [1,2,3]

@pytest.fixture(params=seq,ids=['haha','hehe','heihei'],autouse=True)
def test_data(request):
    print("参数")
    return request.param

class TestData:
    def test_1(self):
        print("用例")

if __name__ == '__main__':
    pytest.main()
  • name:如果定义了该字段,调用fixture装饰的函数时,需要使用name对应的值(原来的函数名无效)。
import pytest

seq = [1,2,3]

@pytest.fixture(params=seq,ids=['haha','hehe','heihei'],autouse=True,name="test11")
def test_data(request):
    print("参数")
    return request.param

class TestData:
    def test_1(self,test11):
        print("用例",test11)

if __name__ == '__main__':
    pytest.main()

fixture后置处理

使用yield关键字,可以实现fixture装饰的函数在调用函数执行完之后,再运行特定的逻辑代码。

import pytest

seq = [1,2,3]

@pytest.fixture(params=seq,ids=['haha','hehe','heihei'],name="test11")
def test_data(request):
    print("之前")
    yield test_data
    print("之后")

class TestData:
    def test_1(self,test11):
        print("用例")

if __name__ == '__main__':
    pytest.main()

单独调用fixture

在不需要返回值的情况下,可以使用@pytest.mark.usefixtures()运行指定的fixture(可以叠加多个装饰器执行多个fixture)。

import pytest

rep = [1,2,3]
def parm1():
    return [11,22,23]

@pytest.fixture(params=parm1())
def test_data(request):
    print("之前")
    return request.param

@pytest.mark.usefixtures('test_data')
class TestData:
    def test_1(self):
        print("用例")

if __name__ == '__main__':
    pytest.main()