用鼻子测试进行测试时,每个测试用例的结果可能是“成功”,“失败”或“错误”.这将以“.”,“ F”和“ E”的形式写入STDOUT.
>.
> F
> E
有没有办法覆盖此功能并打印出其他调试信息?
附录
根据下面给出的信息,我创建了以下测试代码:
from nose.tools import assert_true
from nose.plugins import Plugin
class Tester(Plugin):
def addSuccess(self, test):
print("Test successful")
def addError(self, test, err):
print("Had error: %s" % err)
def addFailure(self, test, err):
print("Had failure: %s" % err)
class TestSuite(object):
def test1(self):
assert_true(True)
但是,当我运行此示例测试时,不会生成其他输出
nosetests --nologcapture -s test1.py
我需要以某种方式“注册”该插件吗?
附录2:
我创建了一个文件plugin1.py,其内容如下:
import os
from nose.plugins import Plugin
class Plugin1(Plugin):
def addSuccess(self, test):
print("Test successful")
def addError(self, test, err):
print("Had error: %s" % err)
def addFailure(self, test, err):
print("Had failure: %s" % err)
def options(self, parser, env=os.environ):
super(Plugin1, self).options(parser, env=env)
def configure(self, options, conf):
super(Plugin1, self).configure(options, conf)
和测试脚本如下(test1.py):
from nose.tools import assert_true
class TestSuite(object):
def test1(self):
assert_true(True)
import nose
from plugin1 import Plugin1
if __name__ == '__main__':
nose.main(addplugins=[Plugin1()])
但是我仍然得到相同的结果.我想我必须以其他方式“注册”插件.但是如何?在这一点上几乎不存在documentation …
运行整个测试
python test1.py
产生相同的输出,但不输出plugin1.py中给出的其他文本输出.
解决方法:
您可以使用鼻子plug-in framework来执行此操作.基本上,您的插件需要提供一个addError方法,当测试错误时会调用该方法.该方法可以传递测试用例,您应该能够自省问题所在并在其中记录额外的调试信息.看一下TestTextResult和ResultProxy类.
这些示例包含一个完整的插件,该插件将输出流(HTMLPlugin)修改为html格式.
更新
该文档确实非常糟糕.这是我拼凑而成的.
import sys
from nose.tools import assert_true
import nose
from nose.plugins import Plugin
class Plugin1(Plugin):
def __init__(self):
self.reports = []
# self.name = 'mega-plugin'
super(Plugin1, self).__init__()
def addSuccess(self, test):
print('Test successful')
self.reports.append("Test successful")
self.stream.writeln("Test successful")
def setOutputStream(self, stream):
self.stream = stream
return None
def finalize(self, result):
for t in self.reports:
self.stream.writeln('finalize - ' + t)
class TestSuite(object):
def test1(self):
assert_true(True)
if __name__ == '__main__':
nose.main(argv=sys.argv + ['--with-plugin1'], addplugins=[Plugin1()])
从的输出是
Test successful
.
----------------------------------------------------------------------
Ran 1 test in 0.003s
OK
finalize - Test successful
一些观察:
>使用addplugins仅注册未启用的插件
>您必须指定–with-PLUGIN-NAME才能实际使用它
> –with-PLUGIN-NAME不能在argv中排在首位,因为传统上是程序名
>插件从类名称中获得一个自动名称,并自动获得一个–with-PLUGIN-NAME标志,您可以覆盖该名称,从而也可以重写–with-SOMETHING标志.
>如果要在测试运行时打印到stderr,则还必须指定–nocapture,否则鼻子将阻止stdout(注意,输出中未显示addSuccess的打印内容)
>您应该实现setOutputStream方法并存储对输出流的本地引用,或者可能在__init__期间设置自己的输出流.
>如果您有setOutputStream方法并从中返回None,则其他插件可以使用相同的流.您可以返回虚拟流以禁止默认输出(https://nose.readthedocs.io/en/latest/plugins/writing.html#recipes)
>为了使所有内容保持整洁,还应该实现一个finalize方法,并仅在其中打印输出,而不是在测试运行时-在测试期间调用addSucces,addFailure等,在所有测试完成后调用finalize.
所有这些都应该在文档中.