pytest 前置 / 后置

本贴最后更新于 1002 天前,其中的信息可能已经时移世改
前置:准备工作
后置:清理工作

unittest框架用的: setUp/tearDown 测试方法级别
                 setUpClass/tearDownClass 测试类级别
                 前置/后置方法名固定,只能是这几个
pytest框架: 有两种机制
            1. xunit-style: setup_method/teardown_method 测试方法级别
                            setup_class/teardown_class   测试类级别
                            setup_function/teardown_class 测试模块级别
               备注: pytest也支持unittest的框架, 支持以下特性:
                            @unittest.skip
                            setUp/tearDown;
                            setUpClass/tearDownClass;
                            setUpModule/tearDownModule;

            2. fixture: (1)若一个函数用@pytest.fixture修饰了, 那这个函数就是一个fixture,
                           只关心它的修饰符是这个,而函数名称可随便取
                        (2)如何分前置和后置? fixture中使用yield关键字作为分割符, yield之前的是前置,yield只会的是后置
                           前置
                           yield
                           后置
                        (3)作用域:
                           在定义fixture时,通过设置scope参数的值来设置fixture的作用域 @pytest.fixture(scope='作用域')
                           作用域取值有四种 测试会话(session)、测试模块(module)、测试类(class)、测试用例(function),
                           scope不传的话,默认是测试用例方法function级别
                        (4)返回值:
                           在定义的fixture函数内部, 如果是yield 某值, 就表示这个执行这个fixture前置代码后会返回这个跟着的值
                           可以有多个返回值, 即yield value1, value2, value3
                           使用场景: 若前置准备工作后,需要将某值传递给用例去使用
                        (5)调用:
                           (1)用例主动去调用, 需要用到哪个fixture就去调用哪个, 且可以调用多个fixture, 就近原则,挨着哪个fixture近就先调用哪个,
                               且谁的前置最先执行,谁的后置就最后执行, 对称的
                               且由先到后 测试用例文件中的fixture > 当前目录中的fixture > 上级目录中的fixture > 根目录中的fixture
                              @pytest.mark.usefixtures("定义的fixture函数名称"
                           (2)用例主动调用,且用例接收fixture的返回值的情况:
                              直接将之前定义的fixture函数的名称作为参数,传进来, 就可以
                              fixture函数的名称就代表了fixture函数yield的值
                           (3)自动调用,(不推荐)
                              定义fixture时,有个参数, autouse
            思考:
            什么情况下,pytest的测试用例函数会有传参呢?
            (1) 用例方法接收了fixture的返回值
                @pytest.fixture
                def my_init():
                    print('准备工作进行中...')
                    my_sql_obj = '哈哈哈'
                    yield my_sql_obj, '卧虎藏龙','激流勇进'
                    print('测试完了呢')

                def test_demo01(my_init):
                    print('这是一个怎样的时代~~~{}'.format(my_init))


            (2) 参数化要传参数
                @pytest.mark.parameterize("case", case_data_list)
                def test_login_api(case)


import pytest


@pytest.fixture(scope='class')
def my_init1():
    print('类的准备工作进行中...')
    my_sql_obj = '哈哈哈'
    yield my_sql_obj, '卧虎藏龙', '激流勇进'
    print('类测试完了呢')


@pytest.fixture  # 不传scope参数的话,默认定义的是函数级别的fixture
def my_init2():
    print('函数的准备工作进行中...')
    my_sql_obj = '哈哈哈'
    yield my_sql_obj, '卧虎藏龙', '激流勇进'
    print('函数测试完了呢')


@pytest.mark.usefixtures("my_init1")
@pytest.mark.usefixtures('my_init2')
class TestOhYeah:

    def test_demo01(self,my_init2):
        print('测试demo1进行中...')
        print('这是一个怎样的时代~~~{}'.format(my_init2))

    def test_demo0(self):
        print('测试demo2进行中...')
        print('幸福生活是奋斗出来哒')


if "__name__" == "__main__":
    pytest.main()
回帖
请输入回帖内容 ...