目标:忽略运行时具有自定义注释集的测试类。
我尝试了什么:
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,其中包含所有测试类的映射。我迭代抛出每一个,检查它注释,如果我找到一个我添加到新地图。然后我重写TestRunner的地图。我在想这会帮助我忽略没有注释的类,但我错了。
也许有人知道正确的解决方案,根据自定义注释忽略测试类? (方法的参数不能改变)
P.S。在我的情况下设置@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();
}
}
}
答案 0 :(得分:0)
我建议创建org.testng.IMethodInterceptor
作为监听器。 TestNG在测试套件启动之前调用intercept
方法。您将所有方法的列表作为参数,并且必须返回modified / new / etc。列出您要运行的方法。有关详细信息和示例,请参阅文档http://testng.org/doc/documentation-main.html#methodinterceptors。