Python unittest
模块似乎假定一个项目的目录结构,其中有一个项目根级目录,其中包含源代码和测试。
不过,我想在我的 ~/bin
目录中编写 Python 脚本,并在另一个目录(例如,~/dev/tests
)中对其进行测试。有没有一种方法可以让我使用命令行界面运行单元测试,而无需设置我的 PYTHONPATH
环境变量并创建 __init__.py
文件等等?
这里有一个简单的例子来展示我想要什么:
~/bin/candy
:
#!/usr/bin/env python
def candy():
return "candy"
if __name__ == '__main__':
print candy()
~/dev/tests/test_candy.py
:
#!/usr/bin/env python
import unittest
import candy
class CandyTestCase(unittest.TestCase):
def testCandy(self):
candyOutput = candy.candy()
assert candyOutput == "candy"
我注意到如果满足以下条件,一切都可以很方便地完成:
- 这两个文件以 py 扩展名命名(
candy.py
和test_candy.py
) - 两个文件在同一个目录下
- 测试在测试目录中使用以下内容运行: $ python -m unittest test_candy
我可以使用 unittest
模块运行 python 来执行以下操作而无需在我的环境中明确设置任何内容吗:
- 我的测试文件没有 py 扩展名(只是
~/candy
)。 - 我不关心
test_candy
是否有 py 作为扩展名。 - 我希望
candy
和test_candy.py
不共享一个公共(public)根目录(我的主目录除外)。
如果通过 python -m unittest
的简单调用无法做到这一点,那么最简单的方法是什么?
最佳答案
这是 candy 可执行文件(没有变化):
➜ cat ~/bin/candy
#!/usr/bin/env python
def candy():
return "candy"
if __name__ == '__main__':
print candy()
这是 ~/dev/tests/test_candy.py
(已更改):
➜ cat ~/dev/tests/test_candy.py
#!/usr/bin/env python
import imp
import unittest
from os.path import expanduser, join
# use expanduser to locate its home dir and join bin and candy module paths
candy_module_path = join(expanduser("~"), "bin", "candy")
# load the module without .py extension
candy = imp.load_source("candy", candy_module_path)
class CandyTestCase(unittest.TestCase):
def testCandy(self):
candyOutput = candy.candy()
assert candyOutput == "candy"
发生了什么变化?
我们添加了
imp.load_source
导入~/bin/candy
(没有*.py
扩展名的模块)我们添加了使用
expanduser
定位主目录的规定,即 我们正在使用
的路径os.path.join
加入~/bin/candy
~
现在您可以使用 unittest
模块的 discover
选项运行测试。
查看 python -m unittest --help
了解更多详情。
摘录如下
-s directory 开始发现的目录('.'默认)
-p pattern 匹配测试文件的模式('test*.py'默认)
➜ python -m unittest discover -s ~/bin/ -p 'test*' -v ~/dev/tests
testCandy (test_candy.CandyTestCase) ... ok
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
关于python - 如何为 bin 目录中的脚本编写 Python 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33469246/