gpt4 book ai didi

java - 如何禁止测试在 TestNG 的子类中运行?

转载 作者:行者123 更新时间:2023-11-30 10:18:54 24 4
gpt4 key购买 nike

(更新:在我报告此事后,TestNG 团队 confirmed the bug 。)

通常,可以使用@Ignoreenabled=false 来忽略一个类

这不适用于在其父类(super class)中定义测试方法的子类(以及子类在钩子(Hook)方法中定义其特定功能的地方)。请参阅下面的 ChildClassTest

请注意,@Ignore 特定于 JUnit,而 TestNG 使用 enabled

基类

import org.testng.annotations.Test;

public class ParentClassTest {
@Test
public void test1() {
hook();
}

protected void hook() {};
}

子类

import org.testng.Reporter;
import org.testng.annotations.Ignore;

@Ignore
public class ChildClassTest extends ParentClassTest {
@Override
protected void hook() {
Reporter.log("ChildClassTest#hook()");
}
}

最佳答案

出于好奇进行了一些头脑 Storm ,并提出了以下使用 v6.14.2 测试的解决方法。我个人更喜欢第一种,更干净、更优雅、更灵活并且更易于维护和扩展。

上下文

import org.testng.annotations.Test;

import static org.testng.Assert.assertTrue;

public class MyTest {
@Test
public void shouldRun() {
assertTrue(true);
}

@Test
public void shouldNotRun() {
assertTrue(true);
}

@Test
public void shouldNotRunEither() {
assertTrue(true);
}
}

1) 使用监听器 - 创建一个 TestListenerAdapter 和注释以跳过具有特定名称的方法:灵活、清晰、易于重用和识别以便删除。唯一的缺点是您必须注意拼写错误的方法名称。

注释

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface SkipMethods {
String[] value() default {};
}

测试监听适配器

import org.testng.ITestResult;
import org.testng.SkipException;
import org.testng.TestListenerAdapter;

public class TestSkippingListener extends TestListenerAdapter {
@Override
public void onTestStart(ITestResult result) {
// get the skip annotation
SkipMethods skipAnnotation = result.getMethod().getInstance().getClass().getAnnotation(SkipMethods.class);

// if the annotation exists
if (skipAnnotation != null) {
for (String skippableMethod : skipAnnotation.value()) {

// and defines the current method as skippable
if (skippableMethod.equals(result.getMethod().getMethodName())) {

// skip it
throw new SkipException("Method [" + skippableMethod + "] marked for skipping");
}
}
}
}
}

测试子类

import org.testng.annotations.Listeners;

// use listener
@Listeners(TestSkippingListener.class)

// define what methods to skip
@SkipMethods({"shouldNotRun", "shouldNotRunEither"})
public class MyTestSkippingInheritedMethods extends MyTest {

}

结果

skip by listener


2) 重写父类(super class)的方法并抛出 SkipException:很清楚,不可能出现拼写错误,但不可重用,不易维护并引入无用代码:

import org.testng.SkipException;

public class MyTestSkippingInheritedMethods extends MyTest {

@Override
public void shouldNotRun() {
throw new SkipException("Skipped");
}

@Override
public void shouldNotRunEither() {
throw new SkipException("Skipped");
}
}

结果

skip by override

关于java - 如何禁止测试在 TestNG 的子类中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49004270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com