Java 当相关测试标记为通过时,TestNG跳过@Test

Java 当相关测试标记为通过时,TestNG跳过@Test,java,testng,Java,Testng,以下是我的设想: 在我的许多测试中,我可能会抛出一个PassedException(我创建的一个异常表示测试通过,但用于停止执行) 最初,我的所有测试都有一个expectedException=PassedException.class,并在最后抛出一个PassedException。我不喜欢这个解决方案 我更改了它,以便在我的TestListener中,在方法onTestFailure(ITestResult.SUCCESS)中,检查可丢弃类型是否为PassedException.class,

以下是我的设想:

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

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

我更改了它,以便在我的
TestListener
中,在方法
onTestFailure(ITestResult.SUCCESS)
中,检查可丢弃类型是否为
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);
    }
 }
}

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

  • 解决办法

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

这会创建一个软依赖项,即即使它所依赖的测试失败/抛出异常(),也应该执行带注释的测试。但在第一种情况下遇到这样的问题,表明TestNG中存在缺陷,或者测试设计与TestNG的预期用途冲突。从长远来看,使用这种变通方法会对你造成伤害

  • 重构测试

使用
expectedExceptions
选项是在应用程序中测试快速失败场景的一种可靠方法。据我所知,您的用例的关键是以这样一种方式缩小您的测试范围,即只有一种可能的结果,即在给定的示例中,您将有一个模拟“超级用户”的测试,其中有一个非常棒的电源按钮可用,并执行您断言的非常棒的操作。然后还有另一个测试——模拟“简单用户”——它不可用,您总是希望抛出一个
PassingException

没有回答这个问题,但以这种方式滥用异常很可能在将来再次困扰您。首先,为什么要跳过部分测试?如果必须取消正在运行的测试,为什么不能在测试方法中使用一个简单的
返回
。所以,如果我以基本用户身份登录,这个很棒的电源按钮应该不可用,因此断言应该会正确失败…但是由于我无法继续,“正确失败”意味着抛出PassedException。你找到解决方案了吗?不,我从来没有找到过。我给开发人员发了好几次电子邮件,他一直没有给我回复。我最终重构了测试。好的!但即使是软依赖也不是一个好主意。即使失败是合法的,它也会运行。选项2不可行。我们有8个不同的用户,还有很多测试。然而,软依赖不是一个坏主意……通过查看侦听器所依赖的测试,您知道是否可以在侦听器中自动添加alwaysRun=true吗?抱歉,但我对TestNG的了解相当有限。请注意,
dependsOn
现在是
dependsOnMethods