6. 重点来啦,pytest的各种装饰圈fixtures

Posted pingguo-softwaretesting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6. 重点来啦,pytest的各种装饰圈fixtures相关的知识,希望对你有一定的参考价值。

一、fixture可以作为一个函数的参数被使用

import pytest

@pytest.fixture
def smtp_connection():
    import smtplib
    return smtplib.SMTP("smtp.gmai.com", 587, timeout=5)

def test_ehlo(smtp_connection):
    response, msg = smtp_connection.ehlo()
    assert response == 250
    assert 0    #强制断言失败

这里的 test_ehlo函数,需要参数值smtp_connection,pytest就是找到并且调用这个用@pytest.fixture装饰的smtp_connection函数,
换句话讲,被装饰器装饰的函数或者方法,仍然可以被调用。步骤是这样:

  • pytest 找到test_ 开头的函数,于是找到了test_ehlo
  • test_ehlo这个测试函数,需要一个参数smtp_connection,于是函数smtp_connection被找到
  • smtp_connection被调用来创建一个实例

二、fixture可以在一个类、或者一个模块、或者整个session中被共享,加上范围即可

比如

import pytest

@pytest.fixture(scope="module")
def smtp_connection():
    import smtplib
    return smtplib.SMTP("smtp.gmai.com", 587,说timeout=5)

def test_ehlo(smtp_connection):
    response, msg = smtp_connection.ehlo()
    assert response == 250
    assert 0    #强制断言失败

def test_noop(smtp_connection):
    response, msg = smtp_connection.noop()
    assert response == 250
    assert 0

这里的smtp_connection,就可以在这个文件中,共享使用,同样的
如果想在一个类中使用,那么@pytest.fixture(scope="class")
如果想在全部会话中使用,那么@pytest.fixture(scope="session")

三、 当出现多个范围装饰的时候,优先实例化范围优先级高的,依次是,session-->module-->session

比如

@pytest.fixture(scope="session")
def s1():
    pass
@pytest.fixture(scope="module")
def m1():
    pass
@pytest.fixture
def f1(tmpdir):
    pass
@pytest.fixture
def f2():
    pass
def test_foo(f1, m1, f2, s1):
...
  • s1 优先级是最高的,最先实例化它,
  • m1 优先级次之



以上是关于6. 重点来啦,pytest的各种装饰圈fixtures的主要内容,如果未能解决你的问题,请参考以下文章

测试气流:具有 DAG 的任务和任务上下文未在 pytest 中运行

pytest文档68-pytest-lazy-fixture 插件解决 pytest.mark.parametrize 中使用 fixture 问题

10pytest -- skip和xfail标记

如何绕过 pytest 夹具装饰器?

pytest 8 参数化parametrize

无法在装饰器中捕获 pytest 的结果