Java 针对失败案例的JUnit测试

Java 针对失败案例的JUnit测试,java,unit-testing,junit,Java,Unit Testing,Junit,我已经为python编写了一段时间的单元测试,使用py.test(我推荐使用py.test) 现在我使用JUnit4在java上完成了这项工作。单元测试的有趣之处在于,在python上,我曾经对每个函数进行过两次测试,检查代码在并非一切都按预期进行时的行为(Web服务返回的意外数据、无效的输入数据…) 第一个测试将检查当一切按预期工作时代码的行为 第二个测试将模拟各种潜在问题、网络问题、脏/意外/无效响应数据等 我通常称之为test_foo()和test_foo_ko(),当然java将使用ca

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

现在我使用JUnit4在java上完成了这项工作。单元测试的有趣之处在于,在python上,我曾经对每个函数进行过两次测试,检查代码在并非一切都按预期进行时的行为(Web服务返回的意外数据、无效的输入数据…)

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


    问题是,我应该将一段代码的所有情况集中在一个测试中,还是像我在python上所做的那样将它们一分为二,还是应该对每个可能的情况进行测试?

    我没有任何“官方”建议来支持我,但我一直认为最好的方法是每一个可能的案例选项-这有一个优点,如果你恰当地命名它们,自动运行程序可以立即准确地告诉你出了什么问题-如果“TestCallMethodWithParticularedgeCaseAlldFooshouldResultinBarOutput”失败,你知道问题出在Foo edge案上

    当然,您可以通过大量的日志记录自己完成这项工作,但是如果您只需将它放在方法名称中,为什么还要麻烦呢

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

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

    我采用了命名模式“methodName\u stateUnderTest\u ExpectedBehavior”。我在测试名称中使用下划线以提高可读性(IMO)

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


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

    +1为我提供了一个打破camelCase约定的理由,这个约定实际上是有意义的:)
    @Test(expected=IllegalArgumentException.class)
    public void sum_negativeNumberAs1stParam_ExceptionThrown(){
         //...
    }