2011-11-08 82 views
1

以下代码是我的方法逻辑。什么是适合这种方法编写JunitTestCases的方法

pulic String getData() 
{ 
if (leg.length == 4) 
     return "ATE"; 
    else if (leg.length == 2) { 
     return "FTE"; 
     } 
    if (leg.length == 3) { 
     if (xr1.KotilaType.equals("CST")) { 
     return "HTE"; 
     } 
     return "DTE"; 
    } 
    return "BTE"; 
    } 

按照我的命令,我需要开始为此方法编写Junit测试用例。

正如你所看到的,这个方法中只有一个方法和一些条件。

现在我的问题是, 我们是否需要为每个条件写一个单独的Junit TestCase(一个分开的方法)?

或者只写一个Junit TestCase并覆盖所有上述条件就足够了吗?

我是junit的新手而不是专家,请指导我为上述方法编写JunitTestCases的方法是什么?

回答

2

这是风格的问题。这是两个备选方案:对于所有在一个方法:

public void testAll() { 
    assertEquals("ATE", getData(leg4)); 
    assertEquals("FTE", getData(leg2)); 
    // etc. 
} 

有了一个测试方法/组合:

public void testLength4() { 
    assertEquals("ATE", getData(leg4)); 
} 

public void testLength2() { 
    assertEquals("FTE", getData(leg2)); 
} 

前者的优点,这是很容易看到所有组合,因为他们都在一个地方。这是非常有用的,如果有很多组合或组合很复杂。

后者的优点是每个组合都有一个测试,所以很容易定位问题,因为(理论上)只有一个测试会失败。缺点:您很快就会用尽测试方法的名称。 testLength4,testLength2,testLength3WithCST,testLength3WithoutCST。当你有很多组合时(比如像一年中每个月的一次测试),这个缺点就变得特别糟糕。大多数情况下,我使用一种测试方法/测试用例,但是如果组合的数量开始变高,我将只有一种方法。这包含了所有的组合,因为我喜欢能够一次看到我所有的组合,看看我是否错过了。

+1

实际上,我会说单个测试用例是* bad *风格。没有进攻=)原因是,如果你的第一个断言失败,那么你不知道其他断言是否会通过或失败。所以,你可能会看到失败,去修正一些代码,重新运行测试,然后找到......测试仍然失败!只是在不同的断言。这也使得使用度量标准来决定构建的不稳定性等变得更加困难。基本上,我们获得的信息使得您可以轻松地编写测试(通常只写一次,这样我们就可以花时间做正确的事)从那些测试。 – Kane

+0

@Kane我同意,但如果我有20个左右的组合,并且我正在更改代码,并且所有组合都在单独的测试中,那么如果我已经涵盖了所有的情况。所以在正常情况下,我有一个测试/案例,但我不介意使用相同方法的多个组合。 –

+0

够公平的,我可以理解为什么会发挥作用。但是如果你担心你没有覆盖所有的情况,你的代码覆盖工具不应该告诉你吗?我会失去我的。 – Kane

0

对于每个可能的返回值,我将开始五个单元测试,将测试对象的状态(腿长& xr1.KotilaType)设置为每个测试中的适当值。

然后,我会转向包含边界值的测试,例如leg.length == 5,1等

+0

非常感谢Matthew Farwell和Bedwyr Humphreys – Pawan