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

6

我有一堆分散在不同目录下的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个回答

0
我通常的做法是按照以下结构组织我的项目:
myproject/
    setup.py
    myproject/
        __init__.py
        mymodule.py
        tests/
            __init__.py
            test_dir1/
                test_mymodule.py
            helper_scripts/
                __init__.py
                helper_script.py

为了运行测试,我使用一个virtualenv,并在其中以开发模式安装myproject。在myproject根目录下,可以使用以下命令之一:

pip install -e .
python setup.py develop

现在在test_mymodule.py中,我可以直接这样说:

from myproject.tests.helper_scripts import helper_script

我只需要运行pytest,而无需在测试中更改工作目录。

有关不同项目目录结构的优缺点的概述,请参阅Pytest的良好集成实践


0

我建议您配置环境,以便import helper_scripts可以在任何当前目录下工作。这是推荐的方法。

如果您非常需要,您也可以使用相对导入:

from .. import helper_script

1
你具体是怎么做的?你必须在脚本内改变当前目录吗? - Yep_It's_Me

-2
os.chdir("newdir")

会改变您当前的工作目录


FYI:在低质量审核队列中发现了这个答案。看起来不错 - Paul
3
是的,但我宁愿不修改每个Python文件。我正在寻找一些py.test(或另一个测试运行程序)的参数或设置,告诉它在执行之前先切换到Python文件所在的目录。 - Yep_It's_Me
@Yep_It's_Me,我认为你不应该在测试中改变工作目录,至少不仅仅是为了导入helpers。请参见我上面的答案,其中提供了一种可能的使helpers可导入的方法。 - akaihola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接