2009-02-11 4 views
3

Есть ли способ узнать количество методов тестирования в тестовом примере?Чтобы найти количество методов тестирования в JUnit TestCase

Что я хочу сделать, это иметь тестовый пример, который проверяет несколько сценариев, и для всех этих я делаю набор данныхUp() только один раз. Аналогично, я хотел бы сделать очистку (tearDown()) один раз в конце всех методов тестирования.

Текущий подход, который я использую, заключается в том, чтобы поддерживать счетчик количества методов тестирования, присутствующих в файле, и уменьшать их в методе tearDown и выполнять очистку, когда счетчик достигает 0. Но этот счетчик должен быть позаботиться о том, когда будут добавлены новые методы испытаний.

+1

Что касается определения числа методов испытаний в примере JUnit - вы можете сделать это с помощью отражения. – Marco

ответ

5

Вместо использования настроек/отрыва вы должны, вероятно, использовать методы, аннотированные с помощью @BeforeClass и @AfterClass.

+1

Поскольку он не предоставил ни свою Java, ни его версию JUnit, я бы хотел, чтобы вы добавили информацию, что она не будет работать с java <5 или junit <4.x. – guerda

+0

Да, вы правы – krosenvold

+0

@krosenvold: URL-адрес больше не действителен :(. Я ищу, чтобы получить информацию о тестовом классе с Junit 4 –

0

Если вы используете Junit4 и предложение, данное другим является правильным. Но если вы используете более раннюю версию, используйте эту технику для достижения того, что вы хотите.

Вы можете определить набор для всех тех тестов, для которых вы хотите настроить и отменить только один раз. Взгляните на класс junit.extensions.TestSetup. Вместо того, чтобы выполнять ваши тестовые классы, вам необходимо выполнить эти пакеты.

0

Решение для junit 3 - это вызов специального метода настройки в каждом тесте, который проверяет статический флаг. если флаг не установлен, запустите глобальную настройку. Если это так, пропустите настройку.

Убедитесь, что глобальная настройка правильно синхронизирована, если вы хотите параллельно выполнять тесты.

1

Короткое описание для счетных тестов с @BeforeClass, @AfterClass и @Before.

public class CountTest { 
    static int count; 

    @BeforeClass 
    public static void beforeClass() { 
    count = 0; 
    } 

    @Before 
    public void countUp() { 
    count++; 
    } 

    @AfterClass 
    public static void printCount() { 
    System.out.println(count + " tests."); 
    } 

    @Test 
    public void test1() { 
    assertTrue(true); 
    } 
    // some more tests 

выход будет, например .:

5 тестов.

2

Вот фрагмент кода, который я написал, чтобы найти все тестовые примеры в моем проекте JUnit. Что он делает - читает файлы (в пакете, упомянутом в коде) и используя API отражения, находит тестовые примеры с аннотациями «@Test», а также те, которые начинаются с «теста», но не имеют аннотации @Test

public class TestCaseCount { 

     private static List<Class> getClasses(String packageName) 
      throws ClassNotFoundException, IOException { 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     assert classLoader != null; 
     String path = packageName.replace('.', '/'); 
     Enumeration<URL> resources = classLoader.getResources(path); 
     List<File> dirs = new ArrayList<File>(); 
     while (resources.hasMoreElements()) { 
      URL resource = resources.nextElement(); 
      dirs.add(new File(resource.getFile())); 
     } 

     ArrayList<Class> classes = new ArrayList<Class>(); 
     for (File directory : dirs) { 
      classes.addAll(findClasses(directory, packageName)); 
     } 
     return classes /* .toArray(new Class[classes.size()]) */; 
     } 

     private static List<Class> findClasses(File directory, String packageName) 
      throws ClassNotFoundException { 
     List<Class> classes = new ArrayList<Class>(); 
     if (!directory.exists()) { 
      return classes; 
     } 

     File[] files = directory.listFiles(); 
     for (File file : files) { 
      if (file.isDirectory()) { 
      assert !file.getName().contains("."); 
      classes.addAll(findClasses(file, packageName + "." + file.getName())); 
      } else if (file.getName().endsWith(".class")) { 
      classes.add(Class.forName(packageName + '.' 
       + file.getName().substring(0, file.getName().length() - 6))); 
      } 
     } 
     return classes; 
     } 

     public static void main(String args[]) { 

     ArrayList<Class> classes = new ArrayList<Class>(); 

     try { 
      // Feature1 Test Cases 
      classes.addAll(TestCaseCount.getClasses("mypackage.feature1.tests")); 

      // Feature2 Test Cases 
      classes.addAll(TestCaseCount.getClasses("mypackage.feature2.tests1")); 
      classes.addAll(TestCaseCount.getClasses("mypackage.feature2.tests2")); 

      // Feature3 Test Cases 
      classes.addAll(TestCaseCount.getClasses("mypackage.feature3.tests")); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     int testcaseCount = 0; 
     for (Class cl : classes) { 
      System.out.println("Test Class Name : " + cl.getName()); 

      Method[] methods = cl.getDeclaredMethods(); 

      for (Method method : methods) { 
      Annotation[] annotations = method.getDeclaredAnnotations(); 
      if (annotations.length == 0 && method.getName().startsWith("test")) { 
       testcaseCount++; 
      } else { 
       for (Annotation annotation : annotations) { 
       if (annotation.annotationType().toString() 
        .equals("interface org.junit.Test")) { 
        testcaseCount++; 
       } 
       } 
      } 
      } 
     } 
     System.out.println("Total Test Cases " + testcaseCount); 
     } 
    } 
0

Использование @Rules на TestWatcher вы можете принять к сведению счета и многих других, как имя методы и т.д. вы можете переопределить эти методы и использовать.

@Override 
public Statement apply(Statement base, Description description){ 
    return super.apply(base, description); 
} 

@Override 
protected void failed(Throwable e, Description description) { 
    failed.add(description); 
    LogUtil.error("[FAILED] "+description.getMethodName()+" [Test Failed]"+e.getMessage()); 
    super.failed(e, description); 
} 

@Override 
protected void finished(Description description) {  
    LogUtil.info("[FINISHED] "+description.getMethodName()); 
    super.finished(description); 
} 

@Override  
protected void skipped(AssumptionViolatedException e,Description description) { 
    LogUtil.error("[FAILED] Test Failed due to Assumption Voilation "+e.getMessage()); 
    super.skipped(e,description); 
} 

@Override 
protected void starting(Description description) { 
    LogUtil.info("-----------------------------------------------------------"); 
    LogUtil.info("[STARTED] "+description.getMethodName()); 
    super.starting(description); 
} 

@Override 
protected void succeeded(Description description) { 
    passed.add(description); 
    LogUtil.info("[PASSED] "+description.getMethodName()); 
    super.succeeded(description); 
} 

В вашем примере JUnit Использования

@Rule 
public TestRule watcher = new TestWatcherChild();