覆盖鼻子测试拆卸功能?

用鼻子测试进行测试时,每个测试用例的结果可能是“成功”,“失败”或“错误”.这将以“.”,“ 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方法,当测试错误时会调用该方法.该方法可以传递测试用例,您应该能够自省问题所在并在其中记录额外的调试信息.看一下TestTextResultResultProxy类.

这些示例包含一个完整的插件,该插件将输出流(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.

所有这些都应该在文档中.

上一篇:使用装饰器进行重构以减少代码量


下一篇:使用鼻子运行单元测试时抑制Cherrypy的输出