Python 如何覆盖nosetest拆卸功能?

Python 如何覆盖nosetest拆卸功能?,python,unit-testing,nose,Python,Unit Testing,Nose,使用nosetest进行测试时,每个测试用例的结果可以是“成功”、“失败”或“错误”。这将作为“.”、“F”和“E”写入标准输出 F E 是否有方法覆盖此函数并打印其他调试信息 附录 根据下面给出的信息,我创建了以下测试代码: from nose.tools import assert_true from nose.plugins import Plugin class Tester(Plugin): def addSuccess(self, test): pr

使用
nosetest
进行测试时,每个测试用例的结果可以是“成功”、“失败”或“错误”。这将作为“.”、“F”和“E”写入标准输出

  • 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
):

但我还是得到了同样的结果。我想我必须以其他方式“注册”插件。但是怎么做呢?关于这一点的讨论几乎不存在

通过运行整个测试

python test1.py

产生相同的输出,但不是
plugin1.py

中给出的额外文本输出。您可以使用
nose
进行此操作。基本上,插件需要提供一个
addError
方法,当测试出错时调用该方法。该方法获取传入的测试用例,您应该能够反思出了什么问题,并在那里记录额外的调试信息。看一看课程和课程

这些示例包含一个完整的插件,该插件将输出流()修改为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
    只注册插件,不启用插件
  • 您必须使用插件名指定
    ——才能实际使用它
  • argv
    中,带有插件名的
    --不能是第一个,因为传统上它是程序名
  • 插件从类名中获得一个自动名称和一个自动的
    ——使用插件名
    标志,您可以用某种东西
    标志覆盖名称,从而覆盖
  • 如果要在测试运行时打印到
    stderr
    ,则还必须指定
    --nocapture
    ,否则
    nose
    将阻止stdout(请注意,
    addSuccess
    中的
    print
    未显示在输出中)
  • 您应该实现一个
    setOutputStream
    方法并存储对输出流的本地引用,或者在
    \uuuuu init\uuuuu
    期间设置您自己的输出流
  • 如果您有一个
    setOutputStream
    方法并且没有从中返回任何内容,那么其他插件可以使用相同的流。您可以返回一个伪流以抑制默认输出()
  • 为了保持一切整洁,您还应该实现一个
    finalize
    方法,并且只在那里打印输出,而不是在测试运行时-
    addSucces
    addFailure
    等。在测试期间调用,
    finalize
    在所有测试完成后调用

  • 所有这些都应该在文档中。

    您还需要什么额外的信息?对于失败的测试,nose也会显示堆栈跟踪,谢谢您的提示,但是如何让它工作呢?我在测试脚本中创建了一个插件类,但是输出没有改变。如何使用这样的插件?您可以使用
    argv=sys.argv+['--with-plugin1']
    ,这样仍然可以在命令上传递命令行参数line@MattiLyra:谢谢你明确的例子,但它对我不起作用。我尝试使用
    nosetest-s test1.py
    nosetests test1.py
    以及
    python test1.py
    运行脚本。我仍然得到原始的未更改的输出。它看起来根本没有执行“main”部分(当使用
    nosetests
    时),我以
    python test1.py
    的形式运行它,它确实工作了。我使用的是
    nose-1.3.7
    python-3.5.2
    -调用
    nosetest
    将无法工作,因为这将跳过您已经发现的
    .main
    运行程序。您能否打开
    --nocapture
    并插入一些
    print
    语句以查看是否调用了任何内容?
    Test successful
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.003s
    
    OK
    finalize - Test successful