我想运行Python unittest通过调用
python -m unittest discover
命令。两个包位于一个模块中,如下
test
|_ mytest.py
my_module
|__foo.py
|__bar.py
在bar.py中的位置
#bar.py
from foo import baz
# Do things using baz
问题是,当unittest discovery命令运行时,foo在bar.py中找不到了。这是因为 my_module 在 python 测试中被视为正确的模块,所以我需要这样做
from my_module.foo import baz
但是当单独使用该模块时,这将不起作用。那么该怎么办?我看到 2 个选项,但它们不是那么整洁,所以我想要更多输入:
- 让 my_module 中的 init.py 将 my_module 添加到 PYTHONPATH
- 让 mytest.py 将 my_module 添加到 PYTHONPATH
但是,我发现this page指出
Never add a package directory, or any directory inside a package, directly to the Python path.
提出的论点似乎是有道理的,随着我们的存储库不断增长,我们应该努力解决这个问题。
你会做什么?
最佳答案
如果您不想对 my_module
进行任何更改以将其转换为可以由单元测试导入的包,一种解决方案是将单元测试移至 my_module
。例如,您可以:
# my_module/bar.py
from foo import baz
# my_module/test_bar.py
import bar
# Tests...
然后从 my_module
内部运行 python -m unittest discovery
或从项目根目录运行 python -m unittest discovery --start-directory my_module
.
顺便说一句,我认为这里的术语可能有些困惑。在 Python 中,模块通常是单个 .py
文件,包通常是包含一组 .py
文件的文件夹,其中一个是 __init__.py
。因此, foo
和 bar
可能确实是模块,而 my_module
可能是一个包(或者如果它有一个 __init__.py
文件)。
关于Python 模块单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62007744/