当依赖测试标记为Pass时,TestNG跳过@Test

时间:2013-10-01 18:15:37

标签: java testng

这是我的情景:

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

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

我更改了它,以便在我的TestListener中,在方法onTestFailure(ITestResult result)中,我检查可投掷类型是否为PassedException.class,如果是,请致电result.setStatus(ITestResult.SUCCESS)

这有效......测试被标记为通过,但是,如果另一个测试依赖于抛出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);
    }
 }
}

1 个答案:

答案 0 :(得分:1)

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

  • 解决方法

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

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

  • 重构测试

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

相关问题