在运行测试前更改当前工作目录
我有一堆 unittest
测试用例,分散在不同的文件夹里。还有一个文件夹专门放一些辅助脚本,用来帮助测试。所以我的文件结构看起来是这样的:
test_dir1
test_dir2
test_dir3
helper_scripts
每个 test_dir*
里的 Python 文件都会有这些代码:
import sys
sys.path.append('../helper_scripts')
import helper_script
这一切都运行得很好,只要我在它们各自的文件夹里执行测试。不过,我希望能在项目的根目录下直接运行:
py.test
这样就能遍历所有的文件夹,运行找到的每个测试。问题是,测试是从错误的目录运行的,所以 sys.path.append
没法把 helper_scripts
文件夹加进去,而是把项目根目录的上级目录加进去了。这导致所有的导入都失败,出现了 Import Error
。
有没有办法让 py.test
从各自的目录运行测试脚本?也就是说,在执行它们之前先改变当前工作目录?如果不行,有没有其他的测试工具可以做到这一点?
3 个回答
-2
os.chdir("newdir")
这条命令会改变你现在的工作目录。
0
我建议你配置你的环境,这样无论你当前在哪个文件夹,import helper_scripts
都能正常工作。这是比较推荐的做法。
不过,如果你真的必须这样做的话,可以使用相对导入的方法:
from .. import helper_script
0
我通常会把我的项目结构安排成这样:
myproject/
setup.py
myproject/
__init__.py
mymodule.py
tests/
__init__.py
test_dir1/
test_mymodule.py
helper_scripts/
__init__.py
helper_script.py
在运行测试时,我会使用一个虚拟环境,并在这个环境中以开发模式安装myproject
,可以用以下命令之一在myproject
的根目录下执行:
pip install -e .
python setup.py develop
现在在test_mymodule.py
文件中,我只需要这样写:
from myproject.tests.helper_scripts import helper_script
然后我只需运行pytest
,完全不需要在测试中更改工作目录。
可以查看Pytest的良好集成实践,里面总结了不同项目目录结构的优缺点。