如果您不想测试输出,可以返回一个特殊值。我们打电话吧_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_SKIP
vs 任何事都可以)。