gpt4 book ai didi

java - 如何忽略 TestNG 下专门注释的类?

转载 作者:太空宇宙 更新时间:2023-11-04 13:59:01 25 4
gpt4 key购买 nike

目标:忽略运行时设置了自定义注释的测试类。

我尝试过:

 public void onStart(ITestContext context) {
if (context instanceof TestRunner) {
Map<Class<?>, ITestClass> notSkippedCl = new HashMap<Class<?>, ITestClass>();
TestRunner tRunner = (TestRunner) context;
Collection<ITestClass> testClasses = tRunner.getTestClasses();
for (Iterator<ITestClass> iterator = testClasses.iterator(); iterator.hasNext();) {

ITestClass rr = iterator.next();
Class<?> realClass = rr.getRealClass();

if (chechAnnotation(realClass))
{
notSkippedCl.put(realClass,rr);
}
}

try {

Field field = TestRunner.class.getDeclaredField("m_classMap");
field.setAccessible(true);
Map<Class<?>, ITestClass> mapClass = (Map<Class<?>, ITestClass>) field.get(tRunner);
mapClass.clear();
mapClass.putAll(notSkippedCl);

} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

onStart 方法在包中的所有测试类之前被调用,所以我在这里得到 TestRunner,其中包含所有测试类的映射。我迭代抛出每一个,检查它的注释,如果找到一个,我将添加到新 map 中。然后我覆盖 TestRunner 的 map 。我想这将帮助我忽略没有注释的类,但我错了。

也许有人知道正确的解决方案,根据自定义注释忽略测试类?(该方法的参数不能更改)

附注设置 @Test(enabled=false) 注释在我的情况下不是解决方案

--EDIT_FAUND_SOLUTION--

我设法创建解决方案,不确定是否有更简单的方法,但这有效:

@Override
public void onStart(ITestContext context) {
if (context instanceof TestRunner) {
Set<ITestNGMethod> methodstodo = new HashSet<ITestNGMethod>();
TestRunner tRunner = (TestRunner) context;
ITestNGMethod[] allTestMethods = tRunner.getAllTestMethods();
SupportedBrowser currentBrowser = HelperMethod.getCurrentBrowser();
for(ITestNGMethod testMethod : allTestMethods)
{
Class<?> realClass = testMethod.getTestClass().getRealClass();
Set<SupportedBrowser> classBrowsers = getBrowsers(realClass);

if (classBrowsers.contains(currentBrowser)) {
methodstodo.add(testMethod);
}
}

try {
Field field = TestRunner.class.getDeclaredField("m_allTestMethods");
field.setAccessible(true);
field.set(tRunner, methodstodo.toArray(new ITestNGMethod[methodstodo.size()]));
} catch (Exception e) {
e.printStackTrace();
}
}
}

最佳答案

我建议创建org.testng.IMethodInterceptor作为监听器。 TestNG 在测试套件启动之前调用 intercept 方法。您获取所有方法的列表作为参数,并且必须返回修改的/新的/等。列出您要运行的方法。请参阅文档 http://testng.org/doc/documentation-main.html#methodinterceptors了解更多详细信息和示例。

关于java - 如何忽略 TestNG 下专门注释的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500138/

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