pytest 之 fixture 的前置后置功能

  在测试过程中需要前置、后置条件。比如 unittest 中使用 setup(前置)、teardown(后置)来表示整个测试用例类的前置和后置,那么pytest 框架是呢,pytest 是在 固定文件内一个函数内来表示 前置 + 后置,使用 yield 分开前置后置;fixture 就是,一个函数:前置 + 后置

步骤:

 

 

 

一、fixture (译:菲克斯这儿)之 conftest.py (译:康菲泰斯特)文件

  • 在定义 fixture 时,需要引入 import pytest
  • 定义公共的 fixture:前置+后置,多个测试类中都可以调用
  • pytest 提供了 conftest.py 文件,可以将 fixture :前置+后置,定义在此文件中
  • 运行测试用例时,不需要导入这个文件,会自动去查找 conftest.py (译:康菲泰斯特)这个文件,然后去找到对应的
  • 共享文件:conftest.py 文件名不可更改;因为,不需要引入就可以使用其中的fixture

 

二、创建 conftest.py 文件,定义前置 + 后置

  fixture 函数根据关键字 yield 作为前置和后置的分割线,并且 yield 也可以接收返回值,返回元祖,作用相当于return

  yield(译:优特):分割线,返回前置结果

import pytest

# @pytest.fixture(scope="function")  # 默认
@pytest.fixture()
def init_demo():
    print("这是测试用例的前置")
    a = 1
    yield a  # 分割线(yield + 返回值)
    print("这是测试用例的后置")

 

三、调用fixture

1.在测试用例中直接调用

  将fixtures的函数名称作为测试用例的入参

  如果fixture有返回值,那么测试用例中的fixture函数名称就接收返回值,并且可以将fixture函数名称作为返回值使用

def test_add_01(init_demo):
    b = init_demo + 2
    assert 3 == b

  运行结果:

 

2.用 fixture 装饰器调用fixture

  在测试用例/测试类前面加上@pytest.mark.usefixtures('fixture函数名称')

  ps:定义conftest.py文件,在此文件中可以定义多个fixture,pytest会自动搜索此文件

import pytest


@pytest.mark.usefixtures('init_demo')
def test_add_02():
    b = 1 + 2
    assert 3 == b

  运行结果:

 

3.用 autouse 调用 fixture

  • 在定义 fixture 时,有一个参数 autouse,默认设置的为 False
  • 默认为 False,就可以选择用上面两种方式来使用 fixture
  • 当设置为 Ture 时,在一个session内的所有的 test 都会自动调用这个fixture,建议该开关谨慎使用

  conftest代码如下:

import pytest

@pytest.fixture(autouse=Ture)
def init_demo():
    print("这是测试用例的前置")
    yield
    print("这是测试用例的后置")

  测试代码如下:

import pytest


def test_add_02():
    b = 1 + 2
    assert 3 == b

  运行结果:

 

四、fixture的继承(前置的前置,后置的后置)

  • 作用域(scope关键字):function/函数级(测试用例)、class/类级(测试类)、module/模块级(测试模块—py文件)、session/会话级(整个测试执行会话)
  • 形象比喻:夹心饼干
  • 继承条件:作用域由里向外继承作用域,也可以继承同级的作用域
  • 执行顺序:前置由外层到内层执行,后置由内层到外层执行,先执行最里层的作用域,在执行它的上一层作用域,直到再向外找不到作用域为止
  • 继承方法:直接将继承的 fixture 的函数名称作为入参传入即可
  • 返回值:继承父类的同时,也继承了父类的返回值

  conftest.py代码如下:

import pytest


@pytest.fixture(scope='session')
def init_session():
    print("这是测试会话的前置")
    yield
    print("这是测试会话的后置")


@pytest.fixture(scope='module')
def init_module(init_session):
    print("这是测试模块的前置")
    yield
    print("这是测试模块的后置")


@pytest.fixture(scope='class')
def init_class(init_module):
    print("这是测试类的前置")
    yield
    print("这是测试类的后置")


@pytest.fixture  # 相当于@pytest.fixture(scope='function')
def init_function(init_class):
    print("这是测试用例的前置")
    yield
    print("这是测试用例的后置")

  测试代码如下:

import pytest


@pytest.mark.usefixtures('init_function')
def test_demo():
    print('测试用例')
    assert 3 == 3

  运行结果:

 

五、层级作用域

使用 fixture 的顺序-- 子目录当中,也可以拥有自己的 conftest

  • 先用自己的,再去找同级目录下的 conftest.py 再去找上一级目录 下的 conftest.py

 

*******尊重作者,本文内容借鉴于:https://www.cnblogs.com/xiaogongjin/    ******* 

posted @ 2020-02-20 19:06  守护往昔  阅读(1581)  评论(0编辑  收藏  举报