Python自动化测试框架之Pytest相关用法-Fixture(2)

1、setup和teardown

        和unittest一样,pytest也有自己的前置后置条件:setup、teardown。但不同的是,pytest的类型比较多,多达10种,根据不同的生效范围分别为以下级别类型        

        模块级别:setup_module、teardown_module

        函数级别:setup_function、teardown_function,不在类中的方法

        类级别:setup_class、teardown_class

        方法级别:setup_method、teardown_method

        方法细化级别:setup、teardown

        首先来看类级别以下的前置后置条件的使用

class Test_Case:
    def setup_class(self):
        print('-----setup_class')

    def teardown_class(self):
        print('-----teardown_class')

    def setup_method(self):
        print('-----setup_method')

    def teardown_method(self):
        print('-----teardown_method')

    def setup(self):
        print('-----setup')

    def teardown(self):
        print('-----teardown')

    def test_case1(self):
        print('这是---用例1')

    def test_case2(self):
        print('这是---用例2')


if __name__ == '__main__':
    pytest.main(['./test_demo1.py', '-s'])

输出:

        可以看到,先后顺序是类级别>方法级别>方法细化级别。但是这三个级别的方法都是在同一个类中生效的。剩余的模块级别则是全局的,在模块运行前后执行。而函数级别则是将不在类中的方法前后执行。

        为了更方便理解,融入场景说明各个条件的作用

        不过相比之下,除了类级别、方法级别的条件使用较频繁外,其他并不经常使用。此外,比使用更频繁的是pytest的"外壳函数"-fixture,能够对某条用例单独设置前后置条件。

2、fixture

        Fixturepytest的核心功能,也是亮点功能,是一个装饰器函数,是用于将测试前后进行预备、清理工作的代码分离出核心测试逻辑的一种机制。作为pytest的 “外壳函数”,他可以当作参数传入,也可以返回值,而fixture机制的存在,也是pytest比unittest灵活的原因之一。

        1、基本用法

                在方法头前添加"@pytest.fixture(参数)",那么该方法就是个fixture函数了。而且fixture还可以配合“yield”完成后置条件的操作。

                而调用fixture函数也有三种方法

                1、用例前添加装饰器:@pytest.mark.usefixtures("fixture函数名") 

                2、fixture作为参数传入用例中

                3、fixture使用autouse参数

@pytest.fixture()
def work():
    print('fixture:开始')
    yield 4
    print('fixture:结束')


class Test_Case:
    def test_case1(self, work):
        print('fixture的返回值为:', work)
        print('这是---用例1')

    def test_case2(self):
        print('这是---用例2')


if __name__ == '__main__':
    pytest.main(['./test_demo1.py', '-s'])

输出:

        2、参数

                此外,还可以添加scope、autouse等参数,用来表示fixture的作用域等,scope参数代表fixture的作用域,有4个作用范围:function、class、module、session

                function:每个函数或方法都会调用(未填写默认为function级别)

                class:每个类只调用1次

                module:每个模块只调用1次

                session:多个模块调用1次,通常写在conftest中

                autouse参数表示在scope作用域中的用例无需填写fixture参数,默认为自动调用

        3、其他

                此外,fixture还支持相互调用,例如first作为scond的“前置条件”

@pytest.fixture()
def first():
    print('这是第一层fixture')


@pytest.fixture()
def second(first):
    print('这是第二层fixture')


class Test_Case:
    def test_case1(self, second):
        print('这是---用例1')


if __name__ == '__main__':
    pytest.main(['./test_demo1.py', '-s'])

 输出:

3、conftest.py

        说简单点,其实就是fixture函数的集中管理,如果所有用例的前置条件都一样,那在每个用例文件中都创建fixture就很不方便,所以就要用到conftest.py的全局作用,conftest.py有以下特点:

                1、与pytest.ini一样,文件名、文件类型固定。可以创建多个不同目录的conftest.py

                2、pytest会默认读取conftest.py中的fixture函数

                3、用例文件无需导入conftest.py,直接调用fixture即可

                4、conftest.py只对同一目录下的所有用例生效

                例如以下文件结构

        最外层的conftest会对test_case和test_case2文件夹下的所有用例生效,一般用来生成driver、关闭浏览器、生成测试报告等配置,而test_case和test_case2中的conftest就针对不同需求配置不同fixture函数了。


版权声明:本文为m0_54731428原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。