在文件夹中运行所有Python模块的doctest,避免因导入错误而看到失败

8 投票
2 回答
4290 浏览
提问于 2025-04-16 03:46

我开始在我的模块中加入文档测试(doctests)了。(太棒了!)这些文件最开始是脚本,现在变成了几个函数,并且在 __name__=='__main__' 中有命令行应用,所以我不想在这里运行测试。我试过用 nosetests --with-doctest,但结果出现了很多我不想看到的失败,因为在测试发现阶段,它会导入一些没有文档测试的模块,而这些模块又需要一些我在这个系统上没有安装的东西,或者需要在特定的 Python 安装环境中运行。我能不能只运行我所有的文档测试呢?

我考虑在 vim 中设置一个快捷键,运行 "import doctest; doctest.testfile(currentFilename)" 来测试当前模块中的文档测试,还有一个脚本来运行所有的测试——其他使用文档测试的人都是怎么做的?或者我应该用其他的测试工具而不是文档测试?

2 个回答

6

你还可以创建单元测试,来包装你想要的文档测试模块,这其实是文档测试的一个原生功能。你可以在这个链接找到更多信息:http://docs.python.org/2/library/doctest.html#unittest-api

import unittest
import doctest 
import my_module_with_doctests

def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(my_module_with_doctests))
    return tests
3

我觉得nose是个不错的选择。你可以用-e来明确排除那些有问题的模块,或者在你的代码中用一些结构来捕捉缺失的导入,比如这样:

try:
    import simplejson as json
except ImportError:
    import json

更新:

另外一个方法是为缺失的模块提供一些模拟的替代品。假设你的代码里有这样的内容:

import myfunkymodule

而你在一个缺少myfunkymodule的系统中运行测试。你可以创建一个mock_modules/myfunkymodule.py文件,里面写上你需要的模拟实现(也许可以使用MiniMock,如果你在用doctest的话,我强烈推荐这个)。然后你可以这样运行nose

$ PYTHONPATH=path_to/mock_modules nosetests --with-doctest

撰写回答