Python单元测试和发现

Aar*_*ron 37 python unit-testing discovery

我有目录,其中包含名为的文件: test_foo.py

每个文件都是一个测试用例.

我想要

1)从命令行运行目录中的所有测试.我正在使用unittest2,因为我们正在运行Python 2.5.1.从其中一个目录我尝试在命令行输入:

python -m unittest2 discover -p 'test_*.py'
Run Code Online (Sandbox Code Playgroud)

和几个不同的变种.我没有错,但没有任何反应.我期待该目录中所有测试用例中的所有测试都能运行并获得结果.

2)我也尝试在我执行此操作的目录中有一个脚本:

loader = unittest2.TestLoader()
t = loader.discover('.')
Run Code Online (Sandbox Code Playgroud)

如果我打印t变量,我可以看到我的测试用例,但是从文档中我无法弄清楚一旦我拥有它就如何处理加载器对象.

cmc*_*nty 54

我在跑步时遇到了同样的问题python -m unittest discover.这是一个很好的检查清单,用于验证您的设置.Nose使用允许的配置更灵活,但不一定更好.

  1. 确保所有文件/目录都以test.千万不能使用test-something.py,因为这不是一个有效的Python模块名称.使用test_something.py.

  2. 如果要将测试放在子目录(例如test/)中,请确保创建test/__init__.py文件,以便python将目录视为包.

  3. 必须扩展所有类测试用例定义unittest.TestCase.例如

    class DataFormatTests(unittest.TestCase)
    
    Run Code Online (Sandbox Code Playgroud)

  • 还有方法名称,即`test_does_something(self):` (2认同)
  • 对我来说,创建`tests/__ init __.py`解决了这个问题. (2认同)

kor*_*ina 47

一旦发现测试,就可以使用测试运行器运行它们.

import unittest2
loader = unittest2.TestLoader()
tests = loader.discover('.')
testRunner = unittest2.runner.TextTestRunner()
testRunner.run(tests)
Run Code Online (Sandbox Code Playgroud)

运行上面的代码会将测试结果打印到标准输出.

  • 这是我正在寻找的,也是最原始问题的最直接答案.虽然在2.7中看起来略有不同; `test_loader = unittest.defaultTestLoader.discover('.')`; 然后`test_runner = unittest.TextTestRunner()`; 然后`test_runner.run(test_loader)`,你很好. (10认同)
  • 如果您需要以编程方式调用测试运行器(例如,从自定义脚本或"Command"实例),则建议使用此方法. (3认同)

Ale*_*lli 24

给出你unittest2在Python上的命令行尝试使用的方法< 2.7,我想你可能已经错过unittest2PyPI页面上的注释:

注意

命令行用法

在Python 2.7中,您可以调用unittest命令行功能(包括测试发现)python -m unittest <args>.由于unittest是一个包,并且调用包的能力 python -m ...是Python 2.7中的新功能,我们不能为unittest2执行此操作.

而unittest2附带一个脚本单元2.命令行用法:

unit2 discover unit2 -v test_module
Run Code Online (Sandbox Code Playgroud)

还有一个这个脚本的副本unit2.py,对Windows有用,它使用文件扩展而不是shebang行来确定执行文件的程序.这两个脚本都是由distutils安装的.

您是否尝试过unit2本说明推荐的脚本作为旧版Pythons的替代方案,以Python 2.7的"运行包作为主脚本"功能?也许它的来源也可能有助于找出如何从您自己的代码中发现并运行测试,如果这是您更愿意做的事情.