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”})
- 重构测试
使用
expectedExceptions
选项是在应用程序中测试快速失败场景的一种可靠方法。据我所知,您的用例的关键是以这样一种方式缩小您的测试范围,即只有一种可能的结果,即在给定的示例中,您将有一个模拟“超级用户”的测试,其中有一个非常棒的电源按钮可用,并执行您断言的非常棒的操作。然后还有另一个测试——模拟“简单用户”——它不可用,您总是希望抛出一个PassingException
。没有回答这个问题,但以这种方式滥用异常很可能在将来再次困扰您。首先,为什么要跳过部分测试?如果必须取消正在运行的测试,为什么不能在测试方法中使用一个简单的返回
。所以,如果我以基本用户身份登录,这个很棒的电源按钮应该不可用,因此断言应该会正确失败…但是由于我无法继续,“正确失败”意味着抛出PassedException。你找到解决方案了吗?不,我从来没有找到过。我给开发人员发了好几次电子邮件,他一直没有给我回复。我最终重构了测试。好的!但即使是软依赖也不是一个好主意。即使失败是合法的,它也会运行。选项2不可行。我们有8个不同的用户,还有很多测试。然而,软依赖不是一个坏主意……通过查看侦听器所依赖的测试,您知道是否可以在侦听器中自动添加alwaysRun=true吗?抱歉,但我对TestNG的了解相当有限。请注意,dependsOn
现在是dependsOnMethods