Как я могу рекурсивно найти и запустить все тесты Junit 4 в Eclipse? - PullRequest
6 голосов
/ 10 сентября 2010

Я хотел бы запустить все тесты junit 4 в рамках моего проекта Eclipse.Проект настроен с / source и / test.Под / test находятся различные пакеты, такие как:

com.yaddayadda.test.core.entity
com.yaddayadda.test.core.framework

Если я щелкну правой кнопкой мыши на уровне /test в Package Explorer и выберу Run As;Junit Test Я получаю сообщение об ошибке:

No tests found with test runner 'JUnit 4'.

Если я щелкну правой кнопкой мыши на com.yaddayadda.test.core.entity, он найдет и выполнит все тесты в этом пакете.Таким образом, аннотации @Test верны (они также правильно подобраны Ant на сервере сборки).Однако, если я попытаюсь запустить все тесты в com.yaddayadda.test.core, то он не найдет ни одного.

По сути, он, кажется, только смотрит в пакет, а не на всех детей.Есть ли способ это исправить?

Ответы [ 4 ]

8 голосов
/ 15 сентября 2010

Первый: выберите ваш проект в Project Explorer и нажмите Alt + Shift + X T. Он запустит все тесты JUint в рамках проекта.То же самое можно сделать, щелкнув правой кнопкой мыши по проекту и выбрав «Выполнить как» -> Тест JUnit.

Если это не работает (что вполне вероятно), перейдите к «Запуск / запуск конфигураций», создайте новую конфигурацию JUnit и скажите, чтобы она запускала все тесты в вашем проекте.Если это не сработает, мне нужно взглянуть на ваш проект, прежде чем я смогу помочь.

5 голосов
/ 21 марта 2011

Если кто-то еще ищет решение этой проблемы, я нашел ответ здесь на веб-сайте Берта Беквита:

http://burtbeckwith.com/blog/?p=52

Чтобы использовать это, просто щелкните его правой кнопкой мыши в дереве классов в Eclipse и выберите «Run As JUnit Test».

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Modifier;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.log4j.Logger;
import org.junit.internal.runners.InitializationError;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.Suite;

/**
 * Discovers all JUnit tests and runs them in a suite.
 */
@RunWith(AllTests.AllTestsRunner.class)
public final class AllTests {

  private static final File CLASSES_DIR = findClassesDir();

  private AllTests() {
    // static only
  }

  /**
   * Finds and runs tests.
   */
  public static class AllTestsRunner extends Suite {

    private final Logger _log = Logger.getLogger(getClass());

    /**
     * Constructor.
     *
     * @param clazz  the suite class - <code>AllTests</code>
     * @throws InitializationError  if there's a problem
     */
    public AllTestsRunner(final Class<?> clazz) throws InitializationError {
      super(clazz, findClasses());
    }

    /**
     * {@inheritDoc}
     * @see org.junit.runners.Suite#run(org.junit.runner.notification.RunNotifier)
     */
    @Override
    public void run(final RunNotifier notifier) {
      initializeBeforeTests();

      notifier.addListener(new RunListener() {
        @Override
        public void testStarted(final Description description) {
          if (_log.isTraceEnabled()) {
            _log.trace("Before test " + description.getDisplayName());
          }
        }

        @Override
        public void testFinished(final Description description) {
          if (_log.isTraceEnabled()) {
            _log.trace("After test " + description.getDisplayName());
          }
        }
      });

      super.run(notifier);
    }

    private static Class<?>[] findClasses() {
      List<File> classFiles = new ArrayList<File>();
      findClasses(classFiles, CLASSES_DIR);
      List<Class<?>> classes = convertToClasses(classFiles, CLASSES_DIR);
      return classes.toArray(new Class[classes.size()]);
    }

    private static void initializeBeforeTests() {
      // do one-time initialization here
    }

    private static List<Class<?>> convertToClasses(
        final List<File> classFiles, final File classesDir) {

      List<Class<?>> classes = new ArrayList<Class<?>>();
      for (File file : classFiles) {
        if (!file.getName().endsWith("Test.class")) {
          continue;
        }
        String name = file.getPath().substring(classesDir.getPath().length() + 1)
          .replace('/', '.')
          .replace('\\', '.');
        name = name.substring(0, name.length() - 6);
        Class<?> c;
        try {
          c = Class.forName(name);
        }
        catch (ClassNotFoundException e) {
          throw new AssertionError(e);
        }
        if (!Modifier.isAbstract(c.getModifiers())) {
          classes.add(c);
        }
      }

      // sort so we have the same order as Ant
      Collections.sort(classes, new Comparator<Class<?>>() {
        public int compare(final Class<?> c1, final Class<?> c2) {
          return c1.getName().compareTo(c2.getName());
        }
      });

      return classes;
    }

    private static void findClasses(final List<File> classFiles, final File dir) {
      for (File file : dir.listFiles()) {
        if (file.isDirectory()) {
          findClasses(classFiles, file);
        }
        else if (file.getName().toLowerCase().endsWith(".class")) {
          classFiles.add(file);
        }
      }
    }
  }

  private static File findClassesDir() {
    try {
      String path = AllTests.class.getProtectionDomain()
        .getCodeSource().getLocation().getFile();
      return new File(URLDecoder.decode(path, "UTF-8"));
    }
    catch (UnsupportedEncodingException impossible) {
      // using default encoding, has to exist
      throw new AssertionError(impossible);
    }
  }
}
1 голос
/ 07 июля 2017

Я обнаружил, что код Берта Беквита великолепен, но он будет запускать каждый тест в проекте независимо от того, где вы размещаете AllTests.Эта модификация одной функции позволит вам разместить AllTests в любом подкаталоге вашего проекта, и он будет выполнять тесты только в этом месте.

private static Class<?>[] findClasses() {List<File> classFiles = new ArrayList<File>();
  String packagepath = AllTests.class.getPackage().getName().replace(".", "/");
  File RELATIVE_DIR = new File( CLASSES_DIR.getAbsolutePath() + "\\" + packagepath );
  findClasses(classFiles, RELATIVE_DIR);
  List<Class<?>> classes = convertToClasses(classFiles, CLASSES_DIR);
  return classes.toArray(new Class[classes.size()]);
}
0 голосов
/ 17 сентября 2010

Вы добавили /test в Путь сборки -> Исходные папки?

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