5

我正在用鼻子写一个测试服,并且希望失败的案例显示一个输出,比如

“失败: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

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

鼻子有没有办法做到这一点?

4

3 回答 3

3

如果您想改变鼻子的行为,您应该编写一个插件(请参阅此处的 API 文档)。在您的情况下,听起来您想更改报告错误的方式,因此您需要提供formatError()formatFailure(). 可能您想要编辑异常消息(包括行号),并限制回溯的大小。

于 2012-12-18T07:51:05.510 回答
1

以下输出与您想要的类似但不完全相同(它还会更改成功的测试输出,这可能不是您想要的)。它使用 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

使用测试任何协议(我说的是协议,而不是这个特定的实现),您可以在错误的破折号之后输出诊断信息 - 但我不知道如何使用这个实现来做到这一点。

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

于 2015-07-08T13:58:10.553 回答
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)

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

于 2012-07-11T07:34:22.857 回答