【问题标题】:How can I integrate doctests with unittest's test discovery?如何将 doctests 与 unittest 的测试发现集成?
【发布时间】:2017-07-09 12:12:25
【问题描述】:

我编写了一个 python 脚本来自动为我完成所有测试,并生成一个 HTML 报告。前几天我发现 discover 用于单元测试,这让我可以在给定目录中运行所有单元测试而无需明确命名它们,我真的希望能够以相同的方式进行文档测试,而不必导入每个模块明确的。

我在https://docs.python.org/2/library/doctest.html 找到了一些有关如何执行此操作的信息,但并没有真正明白。你能帮我在我的文档测试中使用discover吗?

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()

【问题讨论】:

标签: python unit-testing code-coverage doctest


【解决方案1】:

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

1) unittest.discovery

它没有关于 doctests 的线索,因为 doctests 是一个不同的框架。 所以unittest 不应该开箱即用地发现文档测试。 这意味着你需要用手将它们粘在一起

2) doctest

它本质上是一个独立的框架,尽管它有一些粘合类来将 doctest 转换为类似 unittest 的 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) 做什么

按照此处所述https://docs.python.org/2.7/library/doctest.html#unittest-api 在您的代码中散布大量load_tests 挂钩,或者编写一种方法来将您拥有的所有模块收集在一个地方并将它们转换为DocTestSuite [s] https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

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

$ py.test --doctest-modules

或

$ nosetests --with-doctest

当然coverage 和这些框架也提供了很多花里胡哨,你可以继续坚持使用 unittest.TestCase,你甚至不需要创建 coverage_module 所以我会深入研究其中之一,而不是尝试提出自己的解决方案

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多