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)