pytest:通过scope控制fixture的作用范围

一、fixture里面有个参数scope,通过scope可以控制fixture的作用范围,根据作用范围大小划分:session>module>class>function,具体作用范围如下:

1.function 函数或者方法级别都会被调用

2.class 类级别调用一次

3.module 模块级别调用一次

4.session 是个多文件调用一次(可以跨 .py 文件调用,每个.py文件就是 module)

例如整个模块有多条测试用例,需要在全部用例执行之前打开浏览器,全部执行完之后去关闭浏览器,打开和关闭操作只执行一次,如果每次都要重新执行打开操作,会非常占用系统资源,这种场景除了 setup——module,teardown_module 可以实现,还可以通过设置模块级别的 fixture装饰器【@pytst.fixture(scope=”module”)】来实现

scope=’module’

fixture 参数 scope=‘module’ ,module作用是整个模块都会生效

#!/usr/bin/env python
# _*_coding: utf-8 _*_
import pytest


@pytest.fixture(scope='module')
def open():
    print("打开浏览器")
    yield

    print("执行teardown !")
    print("最后关闭浏览器")


@pytest.mark.usefixtures("open")
def test_search1():
    print("test_search1")
    raise NameError
    pass


def test_search2():
    print("test_search2")
    pass


def test_search3():
    print("test_search3")
    pass

代码解析:@pytest.fixture()如果不写参数,参数默认scope=‘function’。当scope=’module’时,在当前 .py脚本里面所有的用例开始前只执行一次。scope巧妙与yield组合使用,相当于setup和teardown方法。还可以使用@pytest.mark.usefixtures装饰器,传入前置函数名作为参数

运行结果如下:

Testing started at 12:03 ...
C:\Python\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1\helpers\pycharm\_jb_pytest_runner.py" --path C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_fixture_scope.py
Launching pytest with arguments C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_fixture_scope.py in C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123
============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123
plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 3 items

test_fixture_scope.py 打开浏览器
Ftest_search1

test_fixture_scope.py:14 (test_search1)
@pytest.mark.usefixtures("open")
    def test_search1():
        print("test_search1")
>       raise NameError
E       NameError

test_fixture_scope.py:18: NameError
.test_search2
.test_search3
执行teardown !
最后关闭浏览器
                                                [100%]

================================== FAILURES ===================================
________________________________ test_search1 _________________________________

    @pytest.mark.usefixtures("open")
    def test_search1():
        print("test_search1")
>       raise NameError
E       NameError

test_fixture_scope.py:18: NameError
---------------------------- Captured stdout setup ----------------------------
打开浏览器
---------------------------- Captured stdout call -----------------------------
test_search1
=========================== short test summary info ===========================
FAILED test_fixture_scope.py::test_search1 - NameError
========================= 1 failed, 2 passed in 0.19s =========================

Process finished with exit code 0

Assertion failed

Assertion failed

从上面运行结果可以看出scope=‘module’ 和yield结合,相当于setup_module 和teardown_module方法,整个模块运行之前调用open()方法中的yield前面打印输出 的打开浏览器 ,整个运行之后调用了yield后面的打印语句执行teardown与关闭浏览器,yield来唤醒teardown的执行,如果用例出现异常,不影响yield后面teardown执行

可以使用 @pytest.mark.usefixtures装饰器来进行方法的传入