在pytest中使用conftest进行设置/拆卸

时间:2014-04-02 10:16:03

标签: python unit-testing pytest xunit

我有不同的测试文件夹(包)。我想设置和拆除特定包(文件夹)的一些数据。

问题是在运行该文件夹的测试用例之前执行set_up()但在运行所有测试用例后,tear_down未执行。在运行其他软件包(文件夹)的所有测试用例之后(在整个pytest会话之后)执行它。

     [conftest.py]

     @pytest.fixture(scope="session", autouse=True)
         def set_up(request):
            '''Test package setup'''

         def tear_down():
            '''Test package teardown'''

每个文件夹都包含__init__.py文件,这很明显。

那么如何在运行tear_down()的文件夹中运行所有测试用例之后如何执行set_up

据我所知:scope="module"在这种情况下没用,因为我不想为每次测试设置和拆解。

任何帮助都会很棒。 感谢

2 个答案:

答案 0 :(得分:8)

pytest不直接支持包级别的装置。 单元测试也没有。

至于主要的测试框架,我相信nose is the only one to support package fixtures。 但是,nose2正在降低包装夹具支撑。请参阅nose2 docs

pytest支持xunit样式灯具的module, function, class, and method level fixtures

答案 1 :(得分:1)

conftest.py文件是目录级(读取为“程序包”)配置。因此,如果将一个放在测试的根目录中,则它的会话作用域的夹具将在该作用域的开头运行,并且相应的tear_down将在执行之前等待作用域的结论(即整个测试会话)。如果您需要创建仅跨越子目录(子包)的灯具,则需要在这些级别上放置其他conftest.py文件(以及它们自己的scope='session'灯具)。一个常见的示例是将数据添加到数据库。想象一下,想在您的purchases数据库表中为相应测试包内的所有测试填充一些行。您可以将完成工作的灯具放在tests.purchases.conftest.py中。

shopping_app/
tests/
    __init__.py
    conftest.py # applies to all tests
    buyers/
    products/
    purchases/
        conftest.py # only applies to this scope and sub-scopes
        __init__.py
        test1.py
        test2.py
        payments/
        refunds/
    sellers/
    stores/

tests.purchases.conftest.py内,您将具有普通的灯具声明。例如,一个set_up / tear_down组合用于预填充和删除db表的行将类似于以下内容:

@pytest.fixture(scope='session', autouse=True)
def prep_purchases(db, data):
    # set_up: fill table at beginning of scope
    populate_purchase_table_with_data(db, data)

    # yield, to let all tests within the scope run
    yield 

    # tear_down: then clear table at the end of the scope
    empty_purchase_table(db)

某些灯具不需要显式注入到测试中(我们只对它们的副作用感兴趣,而对它们的返回值不感兴趣),因此可以使用autouse参数。至于set_up / tear_down(使用yield)的上下文管理器语法,如果您不满意它,可以选择将tear_down部分作为其自己的单独函数放置。