7

作为 API 调用的结果,我有一个对象,我想断言成员变量的值。

该值可以是两个预期值之一,具体取决于 API 调用首先“看到”并首先设置的内容。因此,如果对一个值的断言失败,我想在将测试声明为失败之前断言另一个值。

这样做的最佳方法是什么?我现在拥有的是:

try {
    assertEquals("message", someObject.getValue1(), expectedValue1); 
} catch(AssertionError ae) {
    assertEquals("message", someObject.getValue1(), expectedValue2); 
}

我只是不确定这是否是可接受的做法。请给出意见。

4

3 回答 3

7

使用异常作为一种美化的 goto 语句通常不是一个好习惯。或者至少你会遇到在你的职业生涯中对使用异常进行程序流控制持悲观态度的人。

怎么样:

Assert.assertTrue((someObject.getValue1().equals(expectedValue1) || (someObject.getValue2().equals(expectedValue2));
于 2013-08-14T01:23:35.453 回答
6

取决于目的,自动化功能测试或单元测试。我有时会为前者这样做:

try {
    assertTrue(boolean condition from earlier in test method to check);
}
catch(AssertionError uhOh) {
     Logger.err("condition X failed: detailed info msg"); // broken item #1

}

try {
    assertTrue(another condition in same method to check);
}
catch(AssertionError yuck) {
     Logger.err("condition X failed: detailed info msg"); // another broken item
     fail(); // now blow up as we've checked everything
}

当然,这是使用 logback Logger 和 JUnit 的 Assert.fail() 失败的测试方法。这样我就知道了这种方法的所有失败,而不是在第一次失败之后就崩溃了。就我而言,我正在测试一个内容丰富的 Web 应用程序(需要大量用户输入的对话框和页面)。

“快速失败”(不使用捕获)的缺点是发现一个问题,修复它,再次运行并找到一个新问题(“冲洗并重复”),但如果用于单元测试,由于模块化,这是一项资产测试(理想情况下,您每次测试只测试项目的一个方面)。

于 2014-05-05T23:08:58.257 回答
1

我同意 Aquilon 的观点,认为这不是好的做法。

但是,您可以使用模拟或其他一些机制来“强制”API 在另一个之前“看到”一个项目吗?这样,您的测试可以反映导致一个断言在一个测试中为真,而另一个断言在另一个测试中为真的条件。

于 2013-08-14T01:28:13.327 回答