Python 模块单元测试

标签 python python-unittest

我想运行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命令运行时,foobar.py中找不到了。这是因为 my_module 在 python 测试中被视为正确的模块,所以我需要这样做

from my_module.foo import baz

但是当单独使用该模块时,这将不起作用。那么该怎么办?我看到 2 个选项,但它们不是那么整洁,所以我想要更多输入:

  1. 让 my_module 中的 init.py 将 my_module 添加到 PYTHONPATH
  2. 让 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。因此, foobar 可能确实是模块,而 my_module 可能是一个包(或者如果它有一个 __init__.py 文件)。

关于Python 模块单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62007744/

相关文章:

python - XML 输出包括 setup_module 和 teardown_module

Python单元测试,测试用例之前的声明

python - 如何在使用 pytest 和命令行选项时跳过 unittest 案例中的设置和拆卸?

python - 在 Appengine 上使用 Pygeoip - 没有名为 mmap 的模块

python - 如何在 OSX 上卸载 pip?

python - 用python重采样和合并数据框

python - 如何在 Python 中模拟 cx_Oracle 游标

python - 如何使用 pytest 测试交互式 python 应用程序

python - 在 python 中使用 OpenCV 创建 Mat

python - 用于从指定日期范围获取记录的域返回该范围之外的记录