4

我在 TDD 环境中工作,我经常使用 assertTrue,而还有许多其他方法,例如 assert equals 等。我有一个类,我有 40 多个测试用例,它们都是 assertTrue。这是可以接受的吗?

我想问作为一种风格,这样合适吗?

有什么建议么?

如果你认为这个问题不合适,请告诉我我会删除它。

编辑:

    assertTrue(targetSpecifiers.size() == 2);
    assertTrue(targetSpecifiers.get(0).getPlacementId().compareTo(new BigInteger("1")) ==0);
    assertTrue(targetSpecifiers.get(1).getPlacementId().compareTo(new BigInteger("2")) ==0);
4

4 回答 4

6

使用其他断言的主要好处是它们可以更好地传达意图,并且在失败时可能会提供更有意义的默认消息。

例如

如果你写assertEquals(2, x)ifx实际上是 1 那么失败消息将是:

java.lang.AssertionError: expected:<2> but was:<1>

这比你写assertTrue(x == 2)的地方只有AssertionError堆栈跟踪更有帮助。

当您使用 TDD 时,这一点更为重要,因为当您首先编写失败的测试时,您希望确信测试失败的原因是您所期望的,并且不会发生任何意外行为。

于 2012-11-12T18:00:57.900 回答
5

在适当的情况下,您应该使用正确的 assertXXX 方法,因为它们可以改进故障报告。例如,如果您正在测试让我们说 2 个字符串“abc”(预期)和“abxy”(实际)的相等性,那么使用assertEquals

assertEquals("abc", "abxy") 

将提供比使用assertTrue更容易推理的更好的输出,如下所示

assertTrue("abc".equals("abxy"))

注意:还要注意指定实际参数和预期参数的位置。我看到很多开发人员没有遵循约定(junit 的约定),即预期应该是 assertXXX 方法的第一个参数。使用不当也会导致很多混乱

于 2012-11-12T18:02:09.223 回答
4

我的猜测是你有这样的东西:

assertTrue(expectedValue.equals(actualValue));

那仍然会测试正确的事情——但是当失败时,它只能告诉你断言失败了。如果你改用这个:

assertEquals(expectedValue, actualValue);

......然后失败会说“预期:5;曾经:10”或类似的东西,这使得弄清楚发生了什么变得相当容易。

除非您断言方法返回的结果boolean或类似的东西,否则我发现assertTrue它很少有用。

如果你能举出你的断言的例子,我们也许可以把它们翻译成更惯用的断言。

于 2012-11-12T18:01:12.003 回答
2

这些断言完全有效,但其他断言更容易阅读并提供更好的失败消息。

我建议查看 Hamcrest——它提供了最易读的断言和失败消息形式。你的例子

assertTrue(targetSpecifiers.size() == 2);
assertTrue(targetSpecifiers.get(0).getPlacementId().compareTo(new BigInteger("1")) ==0);
assertTrue(targetSpecifiers.get(1).getPlacementId().compareTo(new BigInteger("2")) ==0);

可以改写为

assertThat(targetSpecifiers, hasSize(2));
assertThat(targetSpecifiers.get(0).getPlacementId(), equalTo(BigInteger.valueOf(1));
assertThat(targetSpecifiers.get(1).getPlacementId(), equalTo(BigInteger.valueOf(1));

或者更简洁地说

assertThat(targetSpecifiers, contains(
    hasProperty("placementId", equalTo(BigInteger.valueOf(1)),
    hasProperty("placementId", equalTo(BigInteger.valueOf(2))
);

contains验证完整性和顺序,因此这涵盖了所有三个断言。

于 2012-11-13T10:11:22.757 回答