2015-04-07 3 views
1

Цель: Игнорировать классы тестов во время выполнения, которые имеют пользовательский набор аннотаций.Как я могу игнорировать специально аннотированные классы в 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(); 
     } 
    } 
} 

ответ

0

Я бы рекомендовал создать org.testng.IMethodInterceptor в качестве слушателя. TestNG вызывает метод intercept непосредственно перед запуском набора тестов. Вы получаете список всех методов в качестве параметра и должны возвращать измененные/новые/и т. Д. список с методами, которые вы хотите запустить. Дополнительную информацию и примеры см. В документации http://testng.org/doc/documentation-main.html#methodinterceptors.

Смежные вопросы