如何在TestNG下忽略具体注释的类?

时间:2015-04-07 19:54:06

标签: java annotations testng

目标:忽略运行时具有自定义注释集的测试类。

我尝试了什么:

 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();
         }
    }
}

1 个答案:

答案 0 :(得分:0)

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