为什么 TestNG 允许几个预期的异常?
Why does TestNG allow several expected exceptions?
为什么 TestNG 有可能检查 几个 异常中的一个是否被抛出?据我所知,JUnit 只支持一个 预期异常。考虑以下两个测试都将通过的 TestNG 虚拟示例:
@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class })
public void throwsNullPointer() {
throw new NullPointerException();
}
@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class })
public void throwsIllegalArgument() {
throw new IllegalArgumentException();
}
我最初的感觉是,应该可以从被测代码中准确得出预期的异常。但是,TestNG 背后的人必须做出一些设计决定。
是否支持测试具有无法被模拟掉的随机特性的代码?有没有人有想法,最好是现实生活中的场景?
Why does TestNG allow several expected exceptions?
我认为最有可能的原因是人们要求提供该功能......并且提供它是合理的。
我能想到几个用例。
在为非确定性代码编写测试时可能需要它,并且非确定性影响抛出的异常。
在测试 API 的多个实现时可能需要它,这可能对抛出的异常有不同的表现。实现可能是不同的 classes 或相同 class.
的不同版本
在测试依赖于 3rd 方软件的代码时可能需要它,并且必须处理该软件的多个版本以及测试可见的不同行为。
在对接口规范不明确的 API 进行 "black box" 测试时可能需要它。
My initial feeling is that it should be possible to derive from the code under test exactly which exception that is expected.
假设您可以访问源代码。此外,使测试适应代码遗漏了您应该根据规范而不是代码进行测试的要点。
如果您可以选择允许多个例外,则可以避免这种情况。 (而且你没有这个选项,那么你(测试编写者)必须捕获并测试测试用例中的异常......如果可能存在多个异常。)
代码能够抛出多种异常的情况并不少见,这也是为什么可以在一个 catch
语句中折叠此类异常的原因之一:
catch(IOException | InterruptedException ex) {
因此,允许 expectedExceptions
允许多个例外对我来说很自然。
老实说,我不经常使用它,它使我稍后添加的功能变得复杂,该功能使您可以测试异常消息是否与常规异常匹配。如果可以重做,我可能会以不同的方式实现这些功能之一。
为什么 TestNG 有可能检查 几个 异常中的一个是否被抛出?据我所知,JUnit 只支持一个 预期异常。考虑以下两个测试都将通过的 TestNG 虚拟示例:
@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class })
public void throwsNullPointer() {
throw new NullPointerException();
}
@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class })
public void throwsIllegalArgument() {
throw new IllegalArgumentException();
}
我最初的感觉是,应该可以从被测代码中准确得出预期的异常。但是,TestNG 背后的人必须做出一些设计决定。
是否支持测试具有无法被模拟掉的随机特性的代码?有没有人有想法,最好是现实生活中的场景?
Why does TestNG allow several expected exceptions?
我认为最有可能的原因是人们要求提供该功能......并且提供它是合理的。
我能想到几个用例。
在为非确定性代码编写测试时可能需要它,并且非确定性影响抛出的异常。
在测试 API 的多个实现时可能需要它,这可能对抛出的异常有不同的表现。实现可能是不同的 classes 或相同 class.
的不同版本
在测试依赖于 3rd 方软件的代码时可能需要它,并且必须处理该软件的多个版本以及测试可见的不同行为。
在对接口规范不明确的 API 进行 "black box" 测试时可能需要它。
My initial feeling is that it should be possible to derive from the code under test exactly which exception that is expected.
假设您可以访问源代码。此外,使测试适应代码遗漏了您应该根据规范而不是代码进行测试的要点。
如果您可以选择允许多个例外,则可以避免这种情况。 (而且你没有这个选项,那么你(测试编写者)必须捕获并测试测试用例中的异常......如果可能存在多个异常。)
代码能够抛出多种异常的情况并不少见,这也是为什么可以在一个 catch
语句中折叠此类异常的原因之一:
catch(IOException | InterruptedException ex) {
因此,允许 expectedExceptions
允许多个例外对我来说很自然。
老实说,我不经常使用它,它使我稍后添加的功能变得复杂,该功能使您可以测试异常消息是否与常规异常匹配。如果可以重做,我可能会以不同的方式实现这些功能之一。