pytest fixture-按fixture實(shí)例自動(dòng)分組測(cè)試

2022-03-18 14:22 更新

Pytest將測(cè)試運(yùn)行期間活動(dòng)??fixture??的數(shù)量最小化。如果您有一個(gè)參數(shù)化的??fixture??,那么使用它的所有測(cè)試將首先與一個(gè)實(shí)例一起執(zhí)行,然后在創(chuàng)建下一個(gè)??fixture??實(shí)例之前調(diào)用終結(jié)器。除此之外,這簡化了對(duì)創(chuàng)建和使用全局狀態(tài)的應(yīng)用程序的測(cè)試。

下面的例子使用了兩個(gè)參數(shù)化的??fixture??,其中一個(gè)的作用域是基于每個(gè)模塊的,所有的函數(shù)都執(zhí)行print調(diào)用來顯示設(shè)置/拆卸流程:

# content of test_module.py
import pytest


@pytest.fixture(scope="module", params=["mod1", "mod2"])
def modarg(request):
    param = request.param
    print("  SETUP modarg", param)
    yield param
    print("  TEARDOWN modarg", param)


@pytest.fixture(scope="function", params=[1, 2])
def otherarg(request):
    param = request.param
    print("  SETUP otherarg", param)
    yield param
    print("  TEARDOWN otherarg", param)


def test_0(otherarg):
    print("  RUN test0 with otherarg", otherarg)


def test_1(modarg):
    print("  RUN test1 with modarg", modarg)


def test_2(otherarg, modarg):
    print("  RUN test2 with otherarg {} and modarg {}".format(otherarg, modarg))

讓我們以詳細(xì)模式運(yùn)行測(cè)試,并查看打印輸出:

$ pytest -v -s test_module.py
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-7.x.y, pluggy-1.x.y -- $PYTHON_PREFIX/bin/python
cachedir: .pytest_cache
rootdir: /home/sweet/project
collecting ... collected 8 items

test_module.py::test_0[1]   SETUP otherarg 1
  RUN test0 with otherarg 1
PASSED  TEARDOWN otherarg 1

test_module.py::test_0[2]   SETUP otherarg 2
  RUN test0 with otherarg 2
PASSED  TEARDOWN otherarg 2

test_module.py::test_1[mod1]   SETUP modarg mod1
  RUN test1 with modarg mod1
PASSED
test_module.py::test_2[mod1-1]   SETUP otherarg 1
  RUN test2 with otherarg 1 and modarg mod1
PASSED  TEARDOWN otherarg 1

test_module.py::test_2[mod1-2]   SETUP otherarg 2
  RUN test2 with otherarg 2 and modarg mod1
PASSED  TEARDOWN otherarg 2

test_module.py::test_1[mod2]   TEARDOWN modarg mod1
  SETUP modarg mod2
  RUN test1 with modarg mod2
PASSED
test_module.py::test_2[mod2-1]   SETUP otherarg 1
  RUN test2 with otherarg 1 and modarg mod2
PASSED  TEARDOWN otherarg 1

test_module.py::test_2[mod2-2]   SETUP otherarg 2
  RUN test2 with otherarg 2 and modarg mod2
PASSED  TEARDOWN otherarg 2
  TEARDOWN modarg mod2


============================ 8 passed in 0.12s =============================

您可以看到,參數(shù)化的模塊范圍的??modarg??資源導(dǎo)致了測(cè)試執(zhí)行的順序,從而導(dǎo)致了盡可能少的活動(dòng)資源。mod1參數(shù)化資源的終結(jié)器在mod2資源設(shè)置之前執(zhí)行。

特別要注意??test_0??是完全獨(dú)立的,并且是第一個(gè)完成的。然后用mod1執(zhí)行??test_1??,用mod1執(zhí)行??test_2??,用mod2執(zhí)行??test_1??,最后用mod2執(zhí)行??test_2??。

其他參數(shù)化的資源(具有函數(shù)作用域)在每次使用它的測(cè)試之前設(shè)置,然后在測(cè)試之后刪除。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)