Python:可以通过unittest显示预期值和实际值吗?

add*_*ing 18 python unit-testing

如果我在unittest.TestCase中有一个断言,如下所示:

self.assertTrue( person.age == 42, "age incorrect")
Run Code Online (Sandbox Code Playgroud)

当它失败时,它会给出"年龄不正确"的消息.我还希望看到的是预期值和实际值.这样做的最佳方法是什么?是单位测试可以做的吗?

编辑 我想看到类似的东西:

"年龄不正确:预期值42实际值39"

Noe*_*ing 23

您可以将longMessage属性设置为True

expected_age = 42
actual_age = person.age # 39
self.longMessage = True
self.assertEqual(expected_age, actual_age, 'age incorrect')
Run Code Online (Sandbox Code Playgroud)

你会得到类似的东西:

AssertionError: 42 != 39 : age incorrect
Run Code Online (Sandbox Code Playgroud)

参考:https://docs.python.org/2/library/unittest.html#unittest.TestCase.longMessage


Bak*_*riu 11

您应该使用解决此问题的方法,如下所示:

self.assertEqual(person.age, 42, 'age incorrect: expected value {0} actual value {1}'.format(42, person.age))
Run Code Online (Sandbox Code Playgroud)

但我认为不提供"msg"参数是最好的选择,因为它生成文本:

first != equal
Run Code Online (Sandbox Code Playgroud)

用于运行测试的大多数(*)工具也直接显示哪个行失败,因此您应该能够了解哪个测试失败以及为什么不使用额外的消息.

(*)读"全部".

  • 这违反了[DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)原则. (2认同)
  • @Bakuriu问题是询问如何同时显示错误消息*和*断言值.(请参阅问题的最后一句.)此外,我认为显示错误消息是一种直观的方式,让用户了解正在发生的事情.它与断言值一样重要.此外,正如我所提到的,有一种非常简单的方法可以实现这一点. (2认同)

Gre*_*ind 5

见:assertEqual

self.assertEqual(person.age, 42, 'age incorrect')
Run Code Online (Sandbox Code Playgroud)

或者使用默认消息(回答评论):

self.assertEqual(person.age, 42)
Run Code Online (Sandbox Code Playgroud)

  • 这不适合我.它仍然打印出"年龄不正确",但不是实际值,即person.age的值. (2认同)