我知道如何使用跳过文档测试# doctest: +SKIP,但我无法弄清楚如何跳过测试有时,根据运行状态.例如:
>>> if os.path.isfile("foo"):
... open("foo").readlines()
... else:
... pass # doctest: +SKIP
['hello', 'world']
Run Code Online (Sandbox Code Playgroud)
这就是我想要做的事情.我也接受运行测试的解决方案,但是如果不满足条件,则将预期结果更改为带有回溯的异常(即无条件地运行测试但修改预期结果).
如果您不想测试输出,您可以返回一个特殊值。让我们称之为_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)
Run Code Online (Sandbox Code Playgroud)
这里有一个概念证明(该文档测试API是有点麻烦:一个woukld喜欢用testmod?一个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())
Run Code Online (Sandbox Code Playgroud)
输出:
**********************************************************************
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)
Run Code Online (Sandbox Code Playgroud)
没有 doctest 注释的两个测试按预期失败。注意:如果_skip在没有COND_SKIP标志的情况下使用,您可以轻松添加警告。
第三个测试失败(得到1vs 预期2),但第四个测试成功(得到 ? _skip+COND_SKIP与任何事情都可以)。
| 归档时间: |
|
| 查看次数: |
622 次 |
| 最近记录: |