Python doctest:有条件地跳过测试

2024-04-03

我知道如何使用跳过文档测试# doctest: +SKIP,但我不知道如何跳过测试有时,基于运行时条件。例如:

>>> if os.path.isfile("foo"):
...    open("foo").readlines()
... else:
...    pass # doctest: +SKIP
['hello', 'world']

这就是我想做的事情。我还接受一个运行测试的解决方案,但如果不满足条件,则将预期结果更改为带有回溯的异常(即无条件运行测试但修改预期结果)。


如果您不想测试输出,可以返回一个特殊值。我们打电话吧_skip这个特殊值:

  • 如果设置了适当的标志并且您获得的值是_skip,那么无论预期如何,测试都是成功的
  • 否则(即没有标志或正常返回值),请照常执行测试。

你需要定制OutputChecker:

_skip = object()
COND_SKIP = doctest.register_optionflag('COND_SKIP')

class CondSkipChecker(doctest.OutputChecker):
    def check_output(self, want, got, optionflags):
        if optionflags & COND_SKIP and got.strip() == str(_skip):
            return True
        else:
            return super(CondSkipChecker, self).check_output(want, got, optionflags)

这是一个概念证明(doctest API 有点麻烦:有人喜欢使用testmod̀ with a checker争论):

"""
>>> 1 if True else _skip
2
>>> 1 if False else _skip
2
>>> 1 if True else _skip # doctest: +COND_SKIP
2
>>> 1 if False else _skip # doctest: +COND_SKIP
2
"""

import doctest, sys
_skip = object()
COND_SKIP = doctest.register_optionflag('COND_SKIP')

class CondSkipChecker(doctest.OutputChecker):
    def check_output(self, want, got, optionflags):
        if optionflags & COND_SKIP and got.strip() == str(_skip):
            return True
        else:
            return super(CondSkipChecker, self).check_output(want, got, optionflags)

finder = doctest.DocTestFinder()
runner = doctest.DocTestRunner(CondSkipChecker())
m = sys.modules.get('__main__')
for test in finder.find(m, m.__name__):
    runner.run(test)
print(runner.summarize())

Output:

**********************************************************************
File "temp.py", line 2, in __main__
Failed example:
    1 if True else _skip
Expected:
    2
Got:
    1
**********************************************************************
File "temp.py", line 4, in __main__
Failed example:
    1 if False else _skip
Expected:
    2
Got:
    <object object at 0x0033B8A8>
**********************************************************************
File "temp.py", line 6, in __main__
Failed example:
    1 if True else _skip # doctest: +COND_SKIP
Expected:
    2
Got:
    1
**********************************************************************
1 items had failures:
   3 of   4 in __main__
***Test Failed*** 3 failures.
TestResults(failed=3, attempted=4)

没有 doctest 注释的两个测试按预期失败。注意:您可以轻松添加警告,如果_skip不使用COND_SKIP flag.

第三次测试失败(得到1与预期相比2),但是第四个就成功了(得了̀_skip + COND_SKIPvs 任何事都可以)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python doctest:有条件地跳过测试 的相关文章

随机推荐