1

我一直在为 python 编写单元测试,使用 py.test (顺便说一句,我推荐)。

现在我在java上做,使用JUnit4。单元测试的有趣之处在于检查代码在并非一切都按预期进行时的行为方式(网络服务返回的意外数据,无效的输入数据......),在 python 上,我曾经对每个函数进行两次测试。

  1. 第一个测试将检查代码在一切按预期工作时的行为
  2. 第二个测试将模拟各种潜在问题、网络问题、脏/意外/无效响应数据等。

我通常称它们为 test_foo() 和 test_foo_ko(),当然 java 会使用 camelCase。

问题是,我是否应该将一段代码的所有案例集中在一个测试中,我应该像我在 python 上所做的那样将它们分成两部分,还是应该对每一个可能的案例进行测试?

4

2 回答 2

2

我采用了命名模式“methodName_stateUnderTest_ExpectedBehavior”。我在测试名称中使用下划线以获得更好的可读性(IMO)。

@Test(expected=IllegalArgumentException.class)
public void sum_negativeNumberAs1stParam_ExceptionThrown(){
     //...
}

此命名策略还意味着我为每个边缘情况编写一个测试。

我也不用“test”前缀我的方法名称。这是 JUnit 过去不支持注释时的要求,但现在已无关紧要(考虑到您使用的是 JUnit 4)。

于 2013-04-26T02:08:38.300 回答
0

我没有任何“官方”建议来支持我,但我一直认为最好的方法是每一个可能的情况选项——这有一个好处,如果你恰当地命名它们,一个自动运行器可以立即准确地告诉您出了什么问题 - 如果“testCallMethodWithAParticularEdgeCaseCalledFooShouldResultInBarOutput”失败,您就知道问题出在 Foo 边缘情况。

当然,你可以自己做很多日志记录,但是当你可以把它放在方法名中时,为什么还要麻烦呢。

它还可以防止测试之间的意外出血 - 您可以更加确定您的测试是独立的。

编辑:您可能需要单独测试的另一个原因:如果抛出特定异常,您可以使用 JUnit 使测试成功 - 对于失败情况很有用,因此您不必弄乱 try/catch 块。

于 2013-04-26T01:40:22.057 回答