2

这是我的场景:

在我的许多测试中,我可能会抛出一个PassedException(我创建的异常表示测试通过,但要停止执行)。

最初,我所有的测试都有一个expectedExceptions = PassedException.class,并在最后抛出一个PassedException。我不喜欢这个解决方案。

我对其进行了更改,以便在我TestListener的方法onTestFailure(ITestResult result)中检查可抛出的类型是PassedException.class,如果是,则调用result.setStatus(ITestResult.SUCCESS)

这行得通...测试被标记为通过,但是,如果另一个测试依赖于抛出 a 的方法PassedException.class,那么它将跳过它。

你们有谁知道为什么会这样,以及如何解决它(或解决方法)?

编辑:这是一个可复制的案例:

public class PassedException extends RuntimeException{}

public class Tester {

 @Test
 public static void test1(){
    throw new PassedException(); 
 }
 @Test(dependsOnMethods = "test1")
 public static void test2(){

 }
}

public class TestListener extends TestListenerAdapter {

 @Override
 public void onTestFailure(ITestResult result){
    Throwable t = result.getThrowable();
    if (t.getClass().equals(PassedException.class)){
        result.setStatus(ITestResult.SUCCESS);
    }
 }
}
4

1 回答 1

1

我承认,我并不完全理解 PassingException 背后的原因,但我有两个建议:

  • 解决方法

    @Test(alwaysRun = true, dependsOnMethods = { "myFailingTest" })

这会创建一个软依赖关系,即即使它依赖的测试失败/抛出异常(文档),也应该执行带注释的测试。但是如果您在第一种情况下遇到这样的问题,则表明 TestNG 中存在错误或您的测试设计与 TestNG 的预期用途冲突。从长远来看,使用这种解决方法会伤害你。

  • 重构测试

使用该expectedExceptions选项是测试应用程序中的快速失败场景的合理方法。据我了解您的用例,关键是以这样一种方式缩小您的测试范围,即只有一个可能的结果,即在给定的示例中,您将有一个模拟“超级用户”的测试,其中很棒的电源按钮可用,并且可以做一些很棒的事情,你断言。然后还有另一个测试 - 模拟“简单用户” - 它不可用并且您总是希望PassingException抛出 a 。

于 2013-10-02T12:46:10.063 回答