在相同的测试用例或单独的测试用例中测试默认值和setter

时间:2011-06-06 12:43:33

标签: java testing junit4

您是否建议在@Test方法中进行任何测试用例分组,或者每个测试方案都有一个@Test方法?例如,假设有不同的方法在应用程序中设置上下文。

以下想法是否可以接受?

@Test
public void testContextSetting() {
    // Test default setting
    assert(...)

    // Test setting a context variable
    assert(...)

    ...
}

或者,您是否愿意建议这样做,让每种方法尽可能原子化:

@Test
public void textDefaultSetting() {
    // Test default setting
    assert(...)
}

@Test
public void testSettingContextVar() {
    // Test setting a context variable
    assert(...)

    ...
}

任何反馈都将不胜感激。

5 个答案:

答案 0 :(得分:34)

我更喜欢每种方法都有一个测试用例。

首先,如果将案例拆分为方法而不是查找代码中嵌入的注释,则更容易看到正在测试的案例。大多数IDE都会给你一个方法摘要,所以不要说“我测试过edgecase XYZ吗?”然后搜索注释,或者查找设置该边框的代码,只需查找名为setupContextEdgeCaseXYZ()的方法。

第二个原因是,如果你有多个案件,一个可能会失败,然后其他案件永远不会执行。

 testDefaultCase()
 testInvalidInput()
 testEdgeCase1()
 testEdgeCase2()

使用这种结构可以更容易地确定输入检查是错误的并且边缘情况2被不正确地处理,但是其他情况都是正常的(并且您可能发现两个失败的情况是相关的并且问题被诊断得更快)

第三个原因是您可能会意外地保留先前测试集中的值,这些值会以不显眼的方式使后一测试无效。一个简单的例子:

@Test
public void testMyMethod() {
  //test default
  String test = Foo.bar(null);
  assertEquals("foo", test);

  //test case 1
  Foo.bar(aValue);
  //Oops forgot to set value above, this passes regardless of 
  //what the above call does
  assertEquals("foo", test);
}

通过将案件分开,您可以避免上述错误,因为这会导致编译错误或警告。

答案 1 :(得分:11)

最佳实践是每种方法有一个测试用例。方法名称描述了您正在执行的测试。当测试失败时,只需一个断言就可以更容易地进行调试。

答案 2 :(得分:11)

Divide et impera :)所以分成多个小案例......如果出现错误,更容易修复。

答案 3 :(得分:2)

您将测试断言混淆。您的多个assert测试方法会测试多个内容:默认设置设置上下文变量。但是测试一件事的测试方法也可以有多个assert s。

一个好的模式是每个测试用例有四个阶段:

  1. 设置:您在哪里创建执行测试所需的对象,并在必要时更改这些对象以使其处于所需的初始状态。
  2. 练习:执行您正在测试的操作的位置。这将是一个方法调用,或构造函数调用。
  3. 验证:在哪里检查被测对象是否处于正确状态,并检查您在练习阶段调用的方法返回的值,如果它返回一个值。这是您放置assert的位置。如果您使用此模式,则在验证阶段放置多个assert没有任何问题。
  4. 拆解:销毁或关闭用于执行测试的对象。
  5. 这是Gerard Meszaros在 xUnit测试模式:重构测试代码一书中推荐的方法。

    将该模式与您在第一个示例中的模式进行对比,您可以在其中执行此操作:

    1. 初始设置
    2. 练习构造函数
    3. 验证默认
    4. 练习设置上下文变量
    5. 验证上下文变量的设置
    6. 拆卸

答案 4 :(得分:0)

Eclipse为每个方法生成单元测试,这似乎是一种合理的方法。 如果测试的方法太复杂而无法使用一种测试方法进行测试,那么您可以考虑重新分解它。

但更好的方法是使用TDD并预先编写测试,这将推动设计和实现的其余部分。

就个人而言,我更喜欢每个方法都有一个测试以及Eclipse的Java代码覆盖率http://www.eclemma.org

该工具会告诉您实际测试的内容。