ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

覆盖鼻子测试拆卸功能?

2019-10-25 12:58:02  阅读:186  来源: 互联网

标签:unit-testing nose python


用鼻子测试进行测试时,每个测试用例的结果可能是“成功”,“失败”或“错误”.这将以“.”,“ 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.

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

标签:unit-testing,nose,python
来源: https://codeday.me/bug/20191025/1928782.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有