Чтобы найти количество методов тестирования в JUnit TestCase - PullRequest
5 голосов
/ 11 февраля 2009

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

То, что я хочу сделать, - это создать тестовый сценарий, который тестирует несколько сценариев, и для всего этого я бы выполнял data setUp () только один раз. Точно так же я хотел бы выполнить очистку (tearDown ()) один раз в конце всех методов тестирования.

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

Ответы [ 7 ]

6 голосов
/ 11 февраля 2009

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

4 голосов
/ 11 февраля 2009

Вы можете сделать это через @BeforeClass и @AfterClass в JUnit4: http://junit.org/apidocs/org/junit/BeforeClass.html

Volker

2 голосов
/ 05 ноября 2014

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

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);
      }
    }
1 голос
/ 12 февраля 2009

Краткий пример подсчета тестов с @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 тестов.

0 голосов
/ 29 апреля 2015

Используя @ Rules on 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();
0 голосов
/ 11 февраля 2009

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

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

0 голосов
/ 11 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...