如何在Python Behave(Cucumber)中为Feature创建临时目录?
问题描述
我正在将一段使用Cucumber进行测试的Ruby代码移植到Python,尝试复用原有的Feature文件。其中一个带@with_tmpdir标签的场景示例如下:
Feature: <whatever> @with_tmpdir Scenario: generating a file Given <some setup stuff> And file 'test.out' does not exist When I call <something> with argument 'test.out' Then a file called 'test.out' is created And the file called 'test.out' contains: """ <some contents> """
为支持该场景,原Ruby代码在features/support/hooks.rb中通过Around钩子实现:
Around('@with_tmpdir') do |scenario, block| old_pwd = Dir.getwd Dir.mktmpdir do |dir| Dir.chdir(dir) block.call end Dir.chdir(old_pwd) end
现在希望在Python Behave中用tempfile.TemporaryDirectory替代Ruby的Dir.mktmpdir,但发现Behave无Around钩子支持,想了解是否可用Fixtures实现该功能,具体操作方法是什么?
解决方案:用Behave的Fixtures实现临时目录切换
完全可以用Behave的Fixtures来实现等价功能,具体步骤如下:
1. 编写Fixture函数
在features/environment.py文件中定义一个Fixture,实现临时目录的创建、工作目录切换及后续清理:
import os import tempfile from behave import fixture, use_fixture @fixture def temporary_directory_fixture(context): # 保存当前工作目录 original_dir = os.getcwd() # 创建临时目录并切换到该目录 with tempfile.TemporaryDirectory() as tmp_dir: os.chdir(tmp_dir) yield context # 执行当前场景的所有步骤 # 场景执行完成后切回原工作目录 os.chdir(original_dir)
2. 绑定Fixture到目标标签
同样在environment.py中,通过before_tag钩子将Fixture与@with_tmpdir标签关联:
def before_tag(context, tag): if tag == "with_tmpdir": use_fixture(temporary_directory_fixture, context)
功能说明
- Behave的Fixture通过
yield关键字实现了类似Around钩子的逻辑:yield之前的代码负责前置准备(创建临时目录、切换路径),yield之后的代码负责后置清理(恢复原目录)。 tempfile.TemporaryDirectory会自动在上下文结束后删除临时目录,和Ruby的Dir.mktmpdir的自动清理行为完全一致,无需手动处理目录删除。
注意事项
- 确保
environment.py放置在Behave默认加载的features目录下,Behave会自动读取该文件中的钩子和Fixture定义。 - 场景中所有相对路径的文件操作都会在临时目录内进行,和原Ruby代码的行为完全匹配,能直接复用原有Feature文件。
内容的提问来源于stack exchange,提问作者lindes
相关产品推荐
相关产品推荐

