我的项目中有以下文件夹结构:
my-project
src/
__init__.py
script.py
test/
__init__.py
test_script.py
理想情况下,我希望有一个单独的文件夹来存放所有的单元测试。我的test_script.py
看起来像这样:
from src.script.py import my_object
class TestClass(unittest.TestCase):
def test_script_object(self):
# unit test here
pass
if __name__ == 'main':
unittest.main()
当我尝试运行脚本(使用python test_script.py
)时,我收到以下错误:
Traceback (most recent call last):
File "test_script.py", line 4, in <module>
from src.script import my_object
ModuleNotFoundError: No module named 'src'
我遵循from this other thread的指令,甚至尝试将src
附加到sys路径(这迫使我改变在项目其余部分导入的方式),当我不尝试将src
附加到sys路径时,我的两个__init__.py
文件都是空的。
我用的是python 3.8。
有人有什么建议吗?我刚开始接触python的单元测试,所以也许有更好的结构或者其他我不知道的约定。提前感谢你们的帮助!
1条答案
按热度按时间gfttwv5a1#
一般来说,任何为了运行测试而修改
sys.path
的指令都是在向错误的方向发送,您的测试工具应该能够发现您的测试和应用程序代码,而不需要这种黑客行为。我通常使用pytest来运行我的测试。我将像这样构造您的示例:
假设
src/myproject/script.py
如下所示:tests/test_script.py
看起来像这样:我可以从
my-project
目录运行测试,只需运行pytest
:在这个设置中,文件
src/conftest.py
允许pytest自动发现你的应用程序代码的位置,或者,你可以在你的pyproject.toml
文件中这样指定:如果您编写的是如问题中所示的
unittest
样式的测试,pytest也可以工作;如果tests/test_script.py
如下所示,上述行为将是相同的:(But我更喜欢pytest更简单的语法。)
可能有用的阅读:
如果你真的想使用
unittest
,你可以使用相同的目录布局,但是你需要更新sys.path
以使它正确运行。这将自动发现所有测试并运行它们。您可以像这样运行单个测试:
如果使用更简单的目录布局,则可以避免修改
sys.path
:当从
my-project
目录运行时,pytest
和python -m unittest
都将正确地发现并运行您的测试,而不需要任何路径修改。