JUnit测试失败案例

时间:2013-04-26 01:34:09

标签: java unit-testing junit

我已经使用py.test(我推荐的方式)为python写了一段时间的单元测试。

现在我在java上使用JUnit4进行此操作。关于单元测试的有趣之处在于检查代码在不是所有内容都按预期运行时的行为(Web服务返回的意外数据,无效的输入数据......),在python上我曾经为每个函数进行了两次测试。

  1. 第一个测试将检查代码在一切按预期工作时的行为
  2. 第二个测试将模拟各种潜在问题,网络问题,脏/意外/无效响应数据等。
  3. 我通常称它们为test_foo()和test_foo_ko()当然java会使用camelCase。

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

2 个答案:

答案 0 :(得分:2)

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

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

这个命名策略也意味着我为每个边缘情况写了一个测试。

我也不会在方法名称前加上“test”。当JUnit过去不支持注释时,这是一个要求,但现在它是无关紧要的(考虑到你正在使用JUnit 4)。

答案 1 :(得分:0)

我没有任何'官方'的建议来支持我,但我总是最好的做法是每一个可能的案例选项 - 这有一个优点,如果你说出他们的名字适当地,一个自动运行器可以立即告诉你到底出了什么问题 - 如果“testCallMethodWithAParticularEdgeCaseCalledFooShouldResultInBarOutput”失败,你知道这就是问题的Foo边缘情况。

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

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

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