如何将doctests与unittest的测试发现集成?

时间:2017-02-20 09:28:23

标签: python unit-testing code-coverage doctest

我写了一个python脚本来自动为我做所有的测试,并生成一个HTML报告。前几天我发现discover用于单元测试,它允许我在给定目录中运行所有单元测试而不明确命名它们,我真的希望能够以相同的方式执行我的doctests,而不是必须导入每个模块都明确。

我在https://docs.python.org/2/library/doctest.html找到了一些关于如何执行此操作的信息,但没有真正得到它。你可以帮助我使用discover和我的doctests一起使用吗?

Python test discovery with doctests, coverage and parallelism是相关的,但仍然没有回答我的问题。

coverage_module

import coverage
import doctest
import unittest
import os

# import test_module 
import my_module

cov = coverage.Coverage()
cov.start()

# running doctest by explicity naming the module
doctest.testmod(my_module)

# running unittests by just specifying the folder to look into
testLoad = unittest.TestLoader()
testSuite = testLoad.discover(start_dir=os.getcwd())
runner = unittest.TextTestRunner()
runner.run(testSuite)

cov.stop()
cov.save()
cov.html_report()
print "tests completed"

test_module

import unittest
import doctest

from my_module import My_Class


class My_Class_Tests(unittest.TestCase):
    def setUp(self):
        # setup variables

    def test_1(self):
        # test code

# The bit that should load up the doctests? What's loader, tests, and ignore though? 
# Is this in the right place?
def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(module_with_doctests))
    return tests

if __name__ == '__main__':
    unittest.main()

1 个答案:

答案 0 :(得分:7)

让我们弄清楚那里发生了什么

1) unittest.discovery

它没有doctests的线索,因为doctests是一个不同的框架。 所以unittest不应该发现开箱即用的doctests。 这意味着您需要手动将它们粘合在一起

2) doctest

它本质上是一个单独的框架,虽然它有一些粘合类可以将doctests转换为类似单元测试的TestCases。 https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

3)发现

没有得到discover你的意思,我想是

python -m unittest discover

如果没有,而你正在谈论https://pypi.python.org/pypi/discover那么就忘了它 - 它是早期版本的python的后端

4)该怎么做

在您的代码中分散了很多load_tests个钩子,如https://docs.python.org/2.7/library/doctest.html#unittest-api所述,或者编写方法来收集您在一个地方拥有的所有模块并将它们转换为DocTestSuite [s] {{ 3}}

但老实说,现在这两种方法都没有任何意义,因为它归结为:

$ py.test --doctest-modules

$ nosetests --with-doctest

当然coverage和许多钟声和&口哨也是由这些框架提供的,你可能会继续坚持使用unittest.TestCase,你甚至不需要创建一个 coverage_module 所以我会深入研究其中一个而不是试图想出来你自己的解决方案