在运行测试前更改当前工作目录

6 投票
3 回答
4323 浏览
提问于 2025-04-30 19:26

我有一堆 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的良好集成实践,里面总结了不同项目目录结构的优缺点。

撰写回答