......还有一匹小马!不,真的。我正在寻找一种方法来组织“正常工作”的测试。大多数事情都有效,但并非所有部分都适合。所以这就是我想要的:
python setup.py test
正常工作。我目前的方法涉及tests
目录和load_tests protocol。包含的所有文件都命名为test_*.py
。如果我使用以下内容创建文件python -m unittest discover
,这会使test_doctests.py
正常工作。
import doctest
import mymodule1, mymodule2
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite(mymodule1))
tests.addTests(doctest.DocTestSuite(mymodule2))
return tests
这种方法还有一个好处,就是可以使用setuptools并提供setup(test_suite="unittest2.collector")
。
然而,这种方法存在一些问题。
--doctest-modules
选项是废话。load_tests
函数,但不提供任何参数。这看起来完全打破了鼻子。如何让事情比这更好或解决上面的一些问题?
答案 0 :(得分:1)
我使用鼻子,当我遇到同样的问题时找到了你的问题。
我最终得到的并不漂亮,但确实运行了测试。
import doctest
import mymodule1, mymodule2
def test_mymodule1():
assert doctest.testmod(mymodule1, raise_on_error=True)
def test_mymodule2():
assert doctest.testmod(mymodule2, raise_on_error=True)
不幸的是,它将模块中的所有doctests作为单个测试运行。但如果出现问题,至少我知道从哪里开始寻找。失败会导致DocTestFailure,并提供有用的消息:
DocTestFailure: <DocTest mymodule1.myfunc from /path/to/mymodule1.py:63 (4 examples)>
答案 1 :(得分:1)
这是一个老问题,但问题仍然存在于我们中的一些人身上!我刚刚完成它并找到了类似于kaapstorm的解决方案,但输出效果更好。我使用py.test
来运行它,但我认为它应该与测试运行者兼容:
import doctest
from mypackage import mymodule
def test_doctest():
results = doctest.testmod(mymodule)
if results.failed:
raise Exception(results)
我在失败案例中最终得到的是您手动运行doctest时可以获得的打印标准输出,另外一个例外情况如下:
Exception: TestResults(failed=1, attempted=21)
正如kaapstrom所提到的那样,它并没有正确计算测试(除非有失败),但我发现如果覆盖率数字很高,那么它并不值得一试:)