Pytest框架实现一些前后置(固件、夹具)的处理,常用三种

发布时间 2023-05-10 00:35:17作者: vorn

一、setup/teardown,setup_class/teardown_class

为什么需要这些功能?比如:web自动化执行用例之前,需要打开浏览器,用例执行之后需要关闭浏览器

文件内容:

test_firmware.py

import pytest

class Test_FirmWare():

    #setup_class/teardown_class在所有的测试用例之前、之后只执行一次
    def setup_class(self):
        print('\n-----在每个类执行前的初始化工作,如:创建日志对象、创建数据库的连接、创建接口的请求对象-----')

    #setup/teardown在每个测试用例之前、之后都要执行一次
    def setup(self):
        print('\n-----在执行测试用例之前初始化的工作,如:打开浏览器,加载网页-----')

    def test01(self):
        print('测试01')

    def test02(self):
        print('测试02')

    def teardown(self):
        print('\n-----在执行测试用例之后的扫尾工作,如:关闭浏览器-----')

    def teardown_class(self):
        print('\n-----在每个类执行后的扫尾工作,如:销毁日志对象、销毁数据库的连接、销毁接口的求情对象-----')

注意:和unittest不一样,这里全是小写

执行结果:

#可以看到setup_class/teardown_class只执行了1次,setup/teardown对每个测试用例都执行了一遍,共执行了2次

D:\JetBrains\PycharmProjects\Pytest_Fireware>pytest -vs

firmware/test_firmware.py::Test_FirmWare::test01
-----在每个类执行前的初始化工作,如:创建日志对象、创建数据库的连接、创建接口的请求对象-----

-----在执行测试用例之前初始化的工作,如:打开浏览器,加载网页-----
测试01
PASSED
-----在执行测试用例之后的扫尾工作,如:关闭浏览器-----

firmware/test_firmware.py::Test_FirmWare::test02
-----在执行测试用例之前初始化的工作,如:打开浏览器,加载网页-----
测试02
PASSED
-----在执行测试用例之后的扫尾工作,如:关闭浏览器-----

-----在每个类执行后的扫尾工作,如:销毁日志对象、销毁数据库的连接、销毁接口的求情对象-----

 二、使用@pytest.fixture()装饰器来实现部分测试用例的前后置

setup/teardown,setup_class/teardown_class局限性较大,@pytest.fixture()则可以对全部测试用例设置前后置也可以对部分测试用例设置前后置

@pytest.fixture()语法:

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

 (1)scope:表示的是被@pytest.fixture标记的方法的作用域。函数(function(默认)),类(class),模块(module),包(package/session)
(2)params:参数化
(3)autouse:Ture自动执行,False不自动执行,默认False
(4)ids :当使用params参数化时,给每一个值设置一个变量名,意义不大
(5)name:给被@pytest.fixture标记的方法取一个别名

scope和autouse:

#全局使用前后置:

代码1:对所有类执行前后置

test_fireware.py

import pytest

@pytest.fixture(scope='class',autouse=True)  #class表示作用域的是类,True表示对所有类都执行下面前后置方法
def my_fixture():  #my_fixture这个函数名可以自定义名称
    print('\n-----这是前置的方法-----')
    yield
    print('\n-----这是后置的方法-----')

class Test_FirmWare1():

    def test01(self):
        print('测试01')

    def test02(self):
        print('\n测试02')

class Test_FirmWare2():

    def test03(self):
        print('测试03')

    def test04(self):
        print('\n测试04')

执行结果:

D:\JetBrains\PycharmProjects\Pytest_Fireware>pytest -vs
================================================= test session starts =================================================

firmware/test_firmware.py::Test_FirmWare1::test01
-----这是前置的方法-----
测试01
PASSED
firmware/test_firmware.py::Test_FirmWare1::test02
测试02
PASSED
-----这是后置的方法-----

firmware/test_firmware.py::Test_FirmWare2::test03
-----这是前置的方法-----
测试03
PASSED
firmware/test_firmware.py::Test_FirmWare2::test04
测试04
PASSED
-----这是后置的方法-----


================================================== 4 passed in 0.01s ==================================================

代码2:对所有测试用例执行前后置

test_fireware.py

import pytest

@pytest.fixture(scope='function',autouse=True)  #将作用域修改为函数,并且对每个函数自动执行下面前后置方法
def my_fixture():
    print('\n-----这是前置的方法-----')
    yield
    print('\n-----这是后置的方法-----')

class Test_FirmWare1():

    def test01(self):
        print('测试01')

    def test02(self):
        print('测试02')

class Test_FirmWare2():

    def test03(self):
        print('测试03')

    def test04(self):
        print('测试04')

执行结果:

D:\JetBrains\PycharmProjects\Pytest_Fireware>pytest -vs
================================================= test session starts =================================================

firmware/test_firmware.py::Test_FirmWare1::test01
-----这是前置的方法-----
测试01
PASSED
-----这是后置的方法-----

firmware/test_firmware.py::Test_FirmWare1::test02
-----这是前置的方法-----
测试02
PASSED
-----这是后置的方法-----

firmware/test_firmware.py::Test_FirmWare2::test03
-----这是前置的方法-----
测试03
PASSED
-----这是后置的方法-----

firmware/test_firmware.py::Test_FirmWare2::test04
-----这是前置的方法-----
测试04
PASSED
-----这是后置的方法-----


================================================== 4 passed in 0.01s ==================================================

代码3:对所有模块执行前后置

test_fireware.py

import pytest

@pytest.fixture(scope='module',autouse=True) #改为module(模块),文件test_fireware.py就是一个模块
def my_fixture():
    print('\n-----这是前置的方法-----')
    yield
    print('\n-----这是后置的方法-----')

class Test_FirmWare1():

    def test01(self):
        print('测试01')

    def test02(self):
        print('测试02')

class Test_FirmWare2():

    def test03(self):
        print('测试03')

    def test04(self):
        print('测试04')

执行结果:

D:\JetBrains\PycharmProjects\Pytest_Fireware>pytest -vs
================================================= test session starts =================================================

firmware/test_firmware.py::Test_FirmWare1::test01
-----这是前置的方法-----
测试01
PASSED
firmware/test_firmware.py::Test_FirmWare1::test02 测试02
PASSED
firmware/test_firmware.py::Test_FirmWare2::test03 测试03
PASSED
firmware/test_firmware.py::Test_FirmWare2::test04 测试04
PASSED
-----这是后置的方法-----


================================================== 4 passed in 0.01s ==================================================

#部分使用前后置:

代码1:

test_fireware.py

import pytest

@pytest.fixture(scope='function')  #作用域为函数,关闭全局参数autouse
def my_fixture():
    print('\n-----这是前置的方法-----')
    yield
    print('\n-----这是后置的方法-----')

class Test_FirmWare1():

    def test01(self):
        print('测试01')

    def test02(self):
        print('测试02')

class Test_FirmWare2():

    def test03(self,my_fixture):  #仅给test03测试用例执行前后置
        print('测试03')

    def test04(self):
        print('测试04')

执行结果:

D:\JetBrains\PycharmProjects\Pytest_Fireware>pytest -vs
================================================= test session starts =================================================

firmware/test_firmware.py::Test_FirmWare1::test01 测试01
PASSED
firmware/test_firmware.py::Test_FirmWare1::test02 测试02
PASSED
firmware/test_firmware.py::Test_FirmWare2::test03
-----这是前置的方法-----
测试03
PASSED
-----这是后置的方法-----

firmware/test_firmware.py::Test_FirmWare2::test04 测试04
PASSED

================================================== 4 passed in 0.01s ==================================================