【发布时间】:2014-10-18 14:04:47
【问题描述】:
我使用鼻子进行测试收集,我也想使用它的 doctest 插件。我有一个需要固定装置才能导入的模块。因此,我不能使用鼻子的模块夹具,因为它们是从被测模块加载的。有没有办法在模块之外为 nose-doctest 指定模块夹具?
对于某些用例,一个选项是检测是否在 doctest 下运行并在模块的开头应用夹具。我也很想听听这个用例的答案。
但是,在某些情况下这不起作用:当导入由于SyntaxError 而失败时,不会运行任何模块代码。就我而言,我主要开发与 python 2 和 python 3 兼容的代码(没有2to3)。但是,在 python 2 下运行时,有一些特定于 python 3 的模块根本不应该被鼻子检查。我最好的选择是什么?
编辑:MWE(针对SyntaxError 情况)
我有一个包含许多小模块的包,其中一些使用 python 3 语法。 这是包结构:
~/pckg/
__init__.py
py3only.py
... (other modules)
tests/
test_py3only.py
有些测试写成unittest.TestCase,但我也想要测试文档字符串中的代码示例。 ~/pckg/__init__.py 为空。
~/pckg/py3only.py:
def fancy_py3_func(a:"A function argument annotation (python 3 only syntax)"):
""" A function using fancy syntax doubling it's input.
>>> fancy_py3_func(4)
8
"""
return a*2
~/pckg/tests/test_py3only.py:
import sys, unittest
def setup_module():
if sys.version_info[0] < 3:
raise unittest.SkipTest("py3only unavailable on python "+sys.version)
class TestFancyFunc(unittest.TestCase):
def test_bruteforce(self):
from pckg.py3only import fancy_py3_func
for k in range(10):
self.assertEqual(fancy_py3_func(k),2*k)
在 python 3 上测试,一切都经过测试并通过(从封闭文件夹运行,例如~):
~ nosetests3 -v --with-doctest pckg
Doctest: pckg.py3only.fancy_py3_func ... ok
test_bruteforce (test_py3only.TestFancyFunc) ... ok
在 python 2 上,~/pckg/tests/test_py2only.py 的模块夹具正确地检测到了这种情况并跳过了测试。然而,我们从~/pckg/py3only.py 得到一个SyntaxError:
~ nosetests -v --with-doctest pckg
Failure: SyntaxError (invalid syntax (py3only.py, line 1)) ... ERROR
SKIP: py3only unavailable on python 2.7.6 (default, Mar 22 2014, 22:59:56)
一个类似于~/pckg/tests/test_py3only.py:setup_module() 的函数可以解决这个问题,如果我能让nose 在它的doctest 插件甚至尝试导入该模块之前运行该代码。
看来我最好的选择是编写一个适当的顶级测试脚本来处理测试的集合......
【问题讨论】:
-
如果没有 X 或 Y 气味不好,就无法导入模块,这意味着,例如,
pydoc和pylint都不能用于您的代码。在导入时更改模块,因为它正在测试中,这会破坏整个测试点,不是吗? -
我基本上有两种情况:缺少 optional 外部依赖项,以及使用新 python 3 语法的模块,在 python 2 下测试。在这两种情况下,测试基本上是徒劳的,模块不可用。我想抑制测试失败,并可能用消息替换它们,因为缺少依赖项,库的某些部分不可用。
-
nosetests -v --with-doctest pckg你让 Python 2 看到 Python 3 代码,因为你从顶层目录运行--with-doctest。从tests文件夹运行单元测试和文档测试。为了使 doctest 成功将其提取为纯文本文件,就像我所做的那样,您可以有条件地导入。 -
> 类似于 ~/pckg/tests/test_py3only.py:setup_module() 的函数可以解决这个问题。
setup_函数用于单元测试。 -
我不想将文档测试提取到文本文件中:它们构成文档字符串的一部分。我想测试它们以确保它们是正确的。
setup_函数是所谓的fixtures的一部分,我希望有一种方法可以为文档字符串嵌入的文档测试指定它们。我想那是徒劳的。
标签: python testing nose doctest