2013-04-26 286 views
1

我一直在使用py.test(这是我推荐的方式)为python编写单元测试一段时间。JUnit测试失败案例

现在我正在使用JUnit4在java上进行操作。关于单元测试的有趣之处在于,检查代码在不是所有事情如预期时如何运作(web服务返回的意外数据,无效输入数据...),在python上我过去每个函数都有两个测试。

  1. 的第一个测试将检查代码的行为时,一切正常
  2. 第二次测试将模拟各种可能出现的问题,网络问题,脏/意外/响应无效数据等。

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

问题是,我应该集中所有情况下的一段代码在单个测试中,我应该将它们分成两个,因为我一直在使用python,或者应该对每个单个可能的情况进行测试?

回答

2

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

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

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

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

+0

+1给我一个理由来打破camelCase惯例,这实际上是有道理的:) – 2013-04-29 06:40:35

0

我没有任何'官方'的建议来支持我,但我一直认为最好的方法是每一种可能的选择 - 这样做的好处是,如果您的姓名如果“testCallMethodWithAParticularEdgeCaseCalledFooShouldResultInBarOutput”失败,那么您知道这是Foo边缘情况,这是问题所在。

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

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

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