单元测试 – 在单元测试中有多个断言是不好的做法吗?

在单元测试中有不止一个断言是不好的做法吗?有关系吗?
最佳答案
有时我每个测试用例只有一个断言,但是我更经常地认为我有几个assert语句。

我已经看到@Arkain的情况,其中一大块代码只有一个单独的测试套件,只有几个测试用例,它们都被标记为testCase1,testCase2等,每个测试用例都有数百个断言更好的是,每个条件通常取决于以前执行的副作用。每当构建失败时,总是在这样的单元测试中,需要相当长的时间来确定问题的位置。

但另一个极端是你的问题提出:每个可能的条件单独的测试用例。根据您所测试的内容,这可能是有意义的,但是每次测试用例通常会有几个断言。

例如,如果你写了java.lang.Integer,你可能会有一些情况看起来像:

public void testValueOf() {
    assertEquals(1, Integer.valueOf("1").intValue());
    assertEquals(0, Integer.valueOf("0").intValue());
    assertEquals(-1, Integer.valueOf("-1").intValue());
    assertEquals(Integer.MAX_VALUE, Integer.valueOf("2147483647").intValue());
    assertEquals(Integer.MIN_VALUE, Integer.valueOf("-2147483648").intValue());
    ....
}

public void testValueOfRange() {
    assertNumberFormatException("2147483648");
    assertNumberFormatException("-2147483649");
    ...
}

public void testValueOfNotNumbers() {
    assertNumberFormatException("");
    assertNumberFormatException("notanumber");
    ...
}
private void assertNumberFormatException(String numstr) {
    try {
        int number = Integer.valueOf(numstr).intValue();
        fail("Expected NumberFormatException for string \"" + numstr +
             "\" but instead got the number " + number);
    } catch(NumberFormatException e) {
        // expected exception
    }
}

一些简单的规则,我可以想出多少个断言放在一个测试案例中:

>不要有多于一个依赖于先前执行的副作用的断言。
>组一起确定测试相同的功能/特征或方面 – 不需要多个单元测试用例的开销。
>上述任何规则都应该被实践和常识所覆盖。您可能不想在每个(甚至几个断言)中单个断言的单个测试用例,并且您不希望使用数百个断言语句的单个测试用例。

转载注明原文:单元测试 – 在单元测试中有多个断言是不好的做法吗? - 代码日志