因此,我正在尝试为使用nagiosplugin编写单元测试。但是,我无法捕获此插件生成的stdout输出。
这是我非常基本的小测试:
def test_check(mocker, capsys):
mocker.patch('sys.exit')
lc = nagios.LogCheck(EXPORTIT_LOG)
lc.main()
captured = capsys.readouterr()
print captured
这是输出:
test_nagios.py::test_check LOGRESOURCE CRITICAL - Failed. | last_entry_runtime=19.871235s;300;600 since_last_entry=7296.123125s;600;1200
CaptureResult(out=u'', err=u'')
PASSED
您可以说,尽管生成了输出,但没有捕获到任何输出。
我相信这是由于nagiosplugin中的这段代码造成的:
(来源:https://bitbucket.org/flyingcircus/nagiosplugin/src/default/src/nagiosplugin/runtime.py)
class Runtime(object):
stdout = sys.stdout
def execute(self, check, verbose=None, timeout=None):
print('{0}'.format(self.output), end='', file=self.stdout)
self.sysexit()
我删除了其中的大部分内容,但问题似乎在于该对象将 sys.stdout 存储为 self.stdout ,然后使用它产生输出。这似乎完全绕过了pytest完成的捕获。简短的调试会话似乎证实了这种怀疑:在打印语句之后, self.stdout 是常规的 sys.stdout ,而实际的 sys.stdout < / strong>是pytest的捕获替代物。
以前有人遇到过此问题(或类似问题)吗?您是如何解决的?