我有一个对象作为API调用的结果,我想断言成员变量的值.
此值可以是两个预期值中的一个,具体取决于API调用首先"看到"并首先设置.因此,如果对一个值的断言失败,我想在将测试声明为失败之前声明另一个值.
这样做的最佳方式是什么?我现在拥有的是:
try {
assertEquals("message", someObject.getValue1(), expectedValue1);
} catch(AssertionError ae) {
assertEquals("message", someObject.getValue1(), expectedValue2);
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是可接受的做法.请评论.
使用异常作为一种美化的goto语句通常不是一种好的做法.或者至少你会遇到你职业生涯中那些对程序流程控制使用异常采取模糊观点的人.
怎么样:
Assert.assertTrue((someObject.getValue1().equals(expectedValue1) || (someObject.getValue2().equals(expectedValue2));
Run Code Online (Sandbox Code Playgroud)
取决于目的,自动功能测试或单元测试.我有时会为前者做这件事:
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
}
Run Code Online (Sandbox Code Playgroud)
当然那是使用logback Logger和JUnit的Assert.fail(),它使测试方法失败.这样我知道这种方法的所有失败,而不是在第一次失败之后.就我而言,我正在测试一个内容丰富的Web应用程序(需要大量用户输入的对话框和页面).
"失败快"(没有捕获)的缺点是找到一个问题,修复它,再次运行并找到一个新的("冲洗和重复"),但如果用于单元测试,这是一项资产,因为模块化测试(理想情况下,您只测试每个测试项目的一个方面).