gpt4 book ai didi

python - 如何覆盖 nosetest 拆解功能?

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:49 25 4
gpt4 key购买 nike

当使用 nosetest 进行测试时,每个测试用例的结果可以是“成功”、“失败”或“错误”。这将作为“.”、“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 中给出的额外文本输出。

最佳答案

您可以使用 Nose 执行此操作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

一些观察:

  1. 使用 addplugins注册它不启用的插件
  2. 您必须指定 --with-PLUGIN-NAME 才能实际使用它
  3. --with-PLUGIN-NAME 不能是 argv 中的第一个,因为传统上那是程序名称
  4. 插件从类名和自动 --with-PLUGIN-NAME 标志获得一个自动名称,你可以覆盖名称,因此也可以覆盖 --with-SOMETHING 标志。
  5. 如果你想在测试运行时打印到stderr,你还必须指定--nocapture,否则nose会阻塞标准输出(请注意 addSuccess 中的 print 未显示在输出中)
  6. 您应该实现 setOutputStream 方法并存储对输出流的本地引用,或者可能在 __init__ 期间设置您自己的输出流。
  7. 如果您有一个 setOutputStream 方法并且从中返回 None,其他插件可以使用相同的流。您可以返回一个虚拟流来抑制默认输出 ( https://nose.readthedocs.io/en/latest/plugins/writing.html#recipes )
  8. 为了保持一切整洁,您还应该实现一个 finalize 方法,并且只在那里打印输出,而不是在测试运行时 - addSucces, addFailure 等在测试期间被调用,finalize 在所有测试完成后被调用。

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

关于python - 如何覆盖 nosetest 拆解功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48074049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com