如何使用Nose抑制失败的测试用例的痕迹?

时间:2012-07-11 05:16:34

标签: python testing nose nosetests

我正在写一个带鼻子的测试套装,并希望失败的情况下显示像

这样的输出

“失败:is_even(5):甚至没有”

而不是默认输出:

======================================================================
FAIL: seed_db.test_generator(5,)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/home/apurcell/tests/prism/seed_db.py", line 59, in is_even
    nose.tools.eq_(x % 2, 0, msg="Not even")
  File "/usr/local/lib/python2.7/dist-packages/nose/tools.py", line 31, in eq_
    assert a == b, msg or "%r != %r" % (a, b)
    AssertionError: Not even

----------------------------------------------------------------------

是否可以选择鼻子?

3 个答案:

答案 0 :(得分:3)

如果你想改变鼻子行为,你应该写一个插件(see API documentation here)。在您的情况下,您似乎想要更改报告错误的方式,因此您需要提供formatError()formatFailure()。可能你想编辑异常消息(包括行号),并限制回溯的大小。

答案 1 :(得分:0)

一种可能的解决方案是将错误流重定向到类似对象的流中,并在那里处理不同的输出。这可能类似于以下代码段:

import sys

class MyErrorStream():
    def write(self, txt):
        # Do something if
        # output contains
        # special exception
        altered_txt = 'My special exception is:\n' + txt

        sys.__stderr__.write(altered_txt)

if(__name__ == '__main__'):
    error_stream = MyErrorStream()
    sys.stderr = error_stream

    assert(1 == 0)

但这个解决方案不是最好的解决方案。改变堆栈跟踪的另一种方法是修改处理输出的内部类的鼻子。您可以对其进行子类化并覆盖/扩展创建输出文本的方法。因为我没有使用鼻子,所以我不能给出最小的代码片段。 不过我希望我能帮到你。

答案 2 :(得分:0)

以下输出与您想要的输出类似但不完全相同(并且它也会更改成功的测试输出,这可能不是您想要的)。它使用tap.py输出TAP(测试任何协议)而不是通常的unittest输出。

nosetests --with-tap --tap-stream testcases-rsysflow.py

输出如下:

bjb@rhino$ nosetests testcases-rrrr.py --with-tap --tap-stream
# TAP results for TestThing
ok 1 - test_create_and_get (testcases-rrrr.TestThing)
ok 2 - test_del_one (testcases-rrrr.TestThing)
ok 3 - test_get_all (testcases-rrrr.TestThing)
not ok 4 - test_get_not_exist (testcases-rrrr.TestThing)
ok 5 - test_get_wrong_indir (testcases-rrrr.TestThing)
ok 6 - test_replace_and_get (testcases-rrrr.TestThing)
ok 7 - test_set_should_fail (testcases-rrrr.TestThing)
1..7

使用Test Anything Protocol(我说的是协议,而不是这个特定的实现),您可以在错误的短划线后输出诊断信息 - 但我不知道如何使用此实现。

这个实现非常方便,因为我只需要安装tap.py(pip install tap.py)并将这两个命令行参数放在我的unittest测试的nosetest调用上,以及poof - TAP格式的输出。现在可以把它插入Jenkins。