pytest的Fixture使用

Pytest测试框架最强大的功能除了丰富的第三方插件外,还有就是它的Fixture和共享Fixture的conftest.py

Fixture一点需要考虑的是初始化与清理,也就是说在一个完整的测试用例中,都必须都得有初始化与清理的部分,这样才是一个完整的测试用例的。Fixture可以很轻松的来解决这部分,还有一点需要说的是Fixture的函数也可以和返回值整合起来,如添加书籍成功后,把数据ID返回来,下面就以查看书籍为案例,那么查看书籍前提是需要添加书籍,这样可以查看,最后把添加的书籍删除,这样一个测试用例执行完成后才符合它的完整流程

使用fixture装饰器来实现部分用例的前后置

@pytest.fixture(scope="",params="",autouse="",ids="",name="")

scope:标记的作用域。function(默认)、class、module、package
params:参数化
autouse:True自动执行,默认是False
ids:当使用params参数化时,给每一个值设置一个变量名,意义不大
name:给标记的方法取一个别名

1、scope,默认是 function,针对函数执行前后置方法 (指定某个测试用例添加前后置)

scope = "function"

import pytest

@pytest.fixture(scope='function')
def test_fixture():
    print("\n前置方法,可以实现部分及全部用例的后置")
    yield
    print("\n后置方法,可以实现部分及全部用例的后置")

class Test_01:
    def test_001(self, test_fixture):    # 函数以test_开头
        a = 1
        assert a == 1

    def test_002(self):
        b = 2
        assert b == 2
  • 生成前后置

2、scope = "class",针对测试类执行前后置方法 (指定某个测试用例添加前后置)

import pytest

@pytest.fixture(scope='class')
def test_fixture():
    print("\n前置方法,可以实现部分及全部用例的后置")
    yield
    print("\n后置方法,可以实现部分及全部用例的后置")

class Test_01:
    def test_001(self, test_fixture):    # 函数以test_开头
        a = 1
        print("test_01 - test_001")
        assert a == 1

    def test_002(self):
        b = 2
        print("test_01 - test_002")
        assert b == 2


class Test_02:
    def test_001(self):    # 函数以test_开头
        c = 3
        print("test_02 - test_001")
        assert c == 3

    def test_002(self):
        d = 4
        print("test_02 - test_002")
        assert d == 4

执行 Test01 测试类的第一个测试方法时,触发 test_fixture 方法,在整个测试类执行完毕后,执行后置方法

如果 test_fixture 方法放置在 test_002 中,则在执行 test_002 方法触发 test_fixture 方法,在整个测试类执行完毕后,执行后置方法

import pytest

@pytest.fixture(scope='class')
def test_fixture():
    print("\n前置方法,可以实现部分及全部用例的后置")
    yield
    print("\n后置方法,可以实现部分及全部用例的后置")

class Test_01:
    def test_001(self):    # 函数以test_开头
        a = 1
        print("test_01 - test_001")
        assert a == 1

    def test_002(self, test_fixture):
        b = 2
        print("test_01 - test_002")
        assert b == 2

    def test_003(self):
        b = 3
        print("test_01 - test_003")
        assert b == 3

image

3、autouse自动使用:,给当前文件下的所有测试类内的测试方法添加前后置

scope="function", autouse=True

import pytest

@pytest.fixture(scope='function', autouse=True)
def test_fixture():
    print("\n前置方法,可以实现部分及全部用例的后置")
    yield
    print("\n后置方法,可以实现部分及全部用例的后置")

class Test_01:
    def test_001(self, test_fixture):    # 函数以test_开头
        a = 1
        assert a == 1

    def test_002(self):
        b = 2
        assert b == 2


class Test_02:
    def test_001(self):    # 函数以test_开头
        c = 3
        assert c == 3

    def test_002(self):
        d = 4
        assert d == 4
  • 所有方法都加上前后置

4、scope="class", autouse=True,给当前文件下的所有测试类添加前后置

scope="function", autouse=True

import pytest

@pytest.fixture(scope='class', autouse=True)
def test_fixture():
    print("\n前置方法,可以实现部分及全部用例的后置")
    yield
    print("\n后置方法,可以实现部分及全部用例的后置")

class Test_01:
    def test_001(self):    # 函数以test_开头
        a = 1
        print("test_01 - test_001")
        assert a == 1

    def test_002(self):
        b = 2
        print("test_01 - test_002")
        assert b == 2


class Test_02:
    def test_001(self):    # 函数以test_开头
        c = 3
        print("test_02 - test_001")
        assert c == 3

    def test_002(self):
        d = 4
        print("test_02 - test_002")
        assert d == 4

image

params,用例可以使用提前准备的参数(需要在每个测试方法继承才能实现)

scope="class" 时,每次执行测试类,触发获取一个值,每个值均触发一次执行测试类
scope="function" 时,每次执行测试类,触发获取一个值,每个值均触发一次执行测试类

import pytest

@pytest.fixture(scope="class", autouse=True, params=['成龙','甄子丹'])
def my_fixture(request):
    print("\n前置方法,可以实现部分及全部用例的后置")
    yield request.param
    print("\n后置方法,可以实现部分及全部用例的后置")

class Test_01:
    def test_001(self, my_fixture):    # 函数以test_开头
        a = 1
        print("test_01 - test_001 " + my_fixture)
        assert a == 1

    def test_002(self, my_fixture):
        b = 2
        print("test_01 - test_002 " + my_fixture)
        assert b == 2

class Test_02:
    def test_001(self):    # 函数以test_开头
        c = 3
        print("test_02 - test_001 ")
        assert c == 3

    def test_002(self):
        d = 4
        print("test_02 - test_002 ")
        assert d == 4

想要获取 params 中的值,需要在测试方法中继承 my_fixture 才能使用,因此使用 scope="class", autouse=True 意义不大,在实际应用中,scope、autouse不设置即可


import pytest

@pytest.fixture(params=['成龙','甄子丹'])
def my_fixture(request):
    print("\n前置方法,可以实现部分及全部用例的后置")
    yield request.param
    print("\n后置方法,可以实现部分及全部用例的后置")

class Test_01:
    def test_001(self, my_fixture):    # 函数以test_开头
        a = 1
        print("test_01 - test_001 " + my_fixture)
        assert a == 1

    def test_002(self):
        b = 2
        print("test_01 - test_002 ")
        assert b == 2

class Test_02:
    def test_001(self):    # 函数以test_开头
        c = 3
        print("test_02 - test_001 ")
        assert c == 3

    def test_002(self):
        d = 4
        print("test_02 - test_002 ")
        assert d == 4

name:取别名

通过别名去给测试方法继承

import pytest

@pytest.fixture(params=['成龙','甄子丹'], name="test_01_class")
def my_fixture(request):
    print("\n前置方法,可以实现部分及全部用例的后置")
    yield request.param
    print("\n后置方法,可以实现部分及全部用例的后置")

class Test_01:
    def test_001(self, test_01_class):    # 函数以test_开头
        a = 1
        print("test_01 - test_001 " + test_01_class)
        assert a == 1

    def test_002(self, test_01_class):
        b = 2
        print("test_01 - test_002 " + test_01_class)
        assert b == 2

class Test_02:
    def test_001(self):    # 函数以test_开头
        c = 3
        print("test_02 - test_001 ")
        assert c == 3

    def test_002(self):
        d = 4
        print("test_02 - test_002 ")
        assert d == 4

通过conftest.py和@pytest.fixture()结合使用实现全局的前置应用

conftest.py文件是单独存放的一个夹具配置文件,名称不能更改。
用处可以在不同的py文件中使用同一个fixture函数。
原则上conftest.py需要和运行的用例放到同一层。并且不需要做任何的imprt导入的操作
上层的 conftest.py 定义的@pytest.fixture() 可以在子级目录的测试类使用
参考文档:https://www.cnblogs.com/blog-123/p/14893903.html

conftest.py:

# conftest.py

import pytest

def read_data():
    return ['sql111','sql222']

@pytest.fixture(params=read_data(), name="wufantest")
def execute_sql(request):
    print('\n执行sql')
    yield request.param
    print('\n关闭数据库连接')

test_conftest用例类:

import pytest

class Test04:
    def test_01(self,wufantest):
        print('测试百里守约'+wufantest)

    def test_02(self):
        print('测试娜可露露')

    def test_03(self):
        print('测试蔡文姬')

posted @ 2022-04-18 14:37  DeyouKong  阅读(142)  评论(0编辑  收藏  举报