我有不同的测试文件夹(包)。我想设置和拆除特定包(文件夹)的一些数据。
问题是在运行该文件夹的测试用例之前执行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"
在这种情况下没用,因为我不想为每次测试设置和拆解。
任何帮助都会很棒。 感谢
答案 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
部分作为其自己的单独函数放置。