Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在pytest中使用conftest设置/拆卸_Python_Unit Testing_Pytest_Xunit - Fatal编程技术网

Python 在pytest中使用conftest设置/拆卸

Python 在pytest中使用conftest设置/拆卸,python,unit-testing,pytest,xunit,Python,Unit Testing,Pytest,Xunit,我有不同的测试文件夹(包)。我想为特定的包(文件夹)设置和删除一些数据 问题是在运行该文件夹的测试用例之前执行了set\u up(),但在运行所有测试用例之后,tear\u down没有执行。它在运行其他包(文件夹)的所有测试用例之后执行(在整个pytest会话之后) 每个文件夹都包含明显的\uuuu init\uuuu.py文件 那么,我如何在运行该文件夹中所有测试用例之后执行set\u-up 据我所知:scope=“module”在这种情况下是无用的,因为我不想为每个测试设置和拆卸 任何帮助

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

问题是在运行该文件夹的测试用例之前执行了
set\u up()
,但在运行所有测试用例之后,
tear\u down
没有执行。它在运行其他包(文件夹)的所有测试用例之后执行(在整个pytest会话之后)

每个文件夹都包含明显的
\uuuu init\uuuu.py
文件

那么,我如何在运行该文件夹中所有测试用例之后执行
set\u-up

据我所知:
scope=“module”
在这种情况下是无用的,因为我不想为每个测试设置和拆卸

任何帮助都会很好。
谢谢

pytest不直接支持包级设备。 unittest也没有

至于主要的测试框架,我相信。 但是,nose2正在掉落包装夹具支架。看


pytest支持xunit样式的装置。

conftest.py
文件是目录级(读取“包”)配置。因此,如果在测试的根目录中放置一个,其会话范围的装置将在该范围的开始处运行,相应的
下拉
将在执行之前等待范围的结论(即整个测试会话)。如果需要创建仅跨子目录(子包)的装置,则需要在这些级别上放置额外的
conftest.py
文件(使用它们自己的
scope='session'
fixture)。一个常见的例子是向数据库添加数据。想象一下,想要在相应的测试包中为所有测试填充一些行,以填充
purchases
db表。您可以将执行此任务的夹具放置在
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中,您将拥有普通的fixture声明。例如,用于预填充和删除db表行的set_up/DELAR_down组合如下所示:

@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
参数。至于设置/删除的上下文管理器语法(使用
yield
),如果您对它不满意,您可以选择将
删除
部分作为其单独的功能。

您设置和删除的是什么样的数据?我理解你的问题,你想要一个像fixture这样的东西,范围是“package”,你可以在这里指定包。是吗?是的。数据基本上与在我开始测试之前在cassandra数据库中插入一些值有关,在该文件夹中的所有测试完成后,我想截断所有表。使用nose不是一个好主意。我知道这一点,但我提出了这个问题,以防我遗漏了什么。没有好的解决方案,但无论如何,谢谢。无论是否这个答案与OP的问题有关,它是在所有测试运行后拆除(在我的例子中是删除测试创建的文件)的一种极好的方法。我已经看过了很多其他的选择,大多数都非常笨拙。@GDB我忘记了这个答案。我认为它需要编辑,因为我相信pytest已经改变了它的方法。现在有一个更适合的(实验性的)“包”范围。“会话”范围现在完全属于整个测试会话。我应该相应地编辑(或删除)答案。
@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)