模块的Python单元测试

时间:2020-05-25 17:38:24

标签: 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 discover命令时,再也无法在 bar.py 中找到 foo 。这是因为 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指出

从不添加包目录或包内的任何目录, 直接转到Python路径。

提出的论点似乎是有道理的,并且随着我们知识库的不断增长,我们应该设法做到这一点。

你会怎么做?

2 个答案:

答案 0 :(得分:1)

如果您还希望这些模块为STANDALONE,则它们不应位于另一个模块内。 因此,您已经违反了“从不在模块内部添加页面目录...” 然后,您也可以将该路径添加到pythonpath中。

答案 1 :(得分:1)

如果您不想对my_module进行任何更改以将其转换为可以由单元测试导入的包,则一种解决方案是将单元测试移至my_module。例如,您可能有:

# my_module/bar.py

from foo import baz
# my_module/test_bar.py

import bar

# Tests...

然后从python -m unittest discover内部运行my_module或从项目根目录运行python -m unittest discover --start-directory my_module

顺便说一句,我认为这里的术语可能有些混乱。在Python中,模块通常是单个.py文件,而包通常是包含一组.py文件的文件夹,其中一个文件是__init__.py。因此,foobar可能实际上是模块,而my_module可能是一个包(或者如果它有一个__init__.py文件,则可能是一个包)。