Как запустить тесты JUnit из моего java-приложения? - PullRequest
50 голосов
/ 30 марта 2010

Можно ли запускать тесты JUnit из моего java-приложения?

Могу ли я использовать тестовые среды (например, JUnit.jar?), Или я вынужден искать тестовые файлы, вызывать методы и самостоятельно отслеживать исключения?

Причина, по которой я спрашиваю, заключается в том, что моему приложению требуется много работы для запуска (много зависимостей, конфигураций и т. Д.), А использование внешнего инструмента тестирования (например, задачи JUnit Ant) потребует много работы для настройки .

Проще запустить приложение, а затем внутри приложения запустить мои тесты.

Существует ли простая тестовая среда, которая запускает тесты и выводит результаты из Java-приложения, или я вынужден написать свою собственную структуру?

Ответы [ 6 ]

83 голосов
/ 01 апреля 2010

Да, вы можете. Я делал это пару раз, чтобы проводить диагностические / дымовые тесты в производственных системах. Это фрагмент ключевой части кода, вызывающего JUnit:

JUnitCore junit = new JUnitCore();
Result result = junit.run(testClasses);

НЕ используйте JUnit.main внутри вашего приложения, оно вызывает System.exit после завершения тестов и, таким образом, может остановить процесс JVM.

Возможно, вы захотите получить «обычный» вывод консоли JUnit (точки и простой отчет). Это можно легко сделать, зарегистрировав TextListener (этот класс предоставляет этот простой отчет).

Пожалуйста, имейте в виду несколько осложнений, связанных с использованием этого вида метода:

  1. Тестирование любого "тестового фреймворка", в том числе такого маленького, хотя и довольно простого, может сбивать с толку. Например, если вы хотите проверить, возвращает ли ваш «тестовый фреймворк» результат сбоя в случае сбоя одного из тестов, вы можете (должны?) Создать тестовый тест JUnit, который всегда не проходит, и выполнить этот тест с «тестовым фреймворком». В этом случае неудачный тестовый пример фактически является тестовыми данными и не должен выполняться как «обычный» JUnit. В качестве примера таких тестов вы можете обратиться к внутренним тестам JUnit.

  2. Если вы хотите подготовить / отобразить свой собственный отчет, вам лучше зарегистрировать свой собственный RunListener, потому что результат, возвращаемый JUnit, не содержит (напрямую) информацию о пройденных тестах и ​​методе тестирования (это только " жестко "как часть теста Description).

14 голосов
/ 30 марта 2010

Как указано в JUnit FAQ :

public static void main(String args[]) {
  org.junit.runner.JUnitCore.main("junitfaq.SimpleTest");
}
10 голосов
/ 30 марта 2010

Причина, по которой я спрашиваю, - моя Приложение требует много работы для начать запуск (много зависимостей и конфигурации и т. д.) и используя инструмент внешнего тестирования (например, JUnit Ant задача) потребует много работы для настроить.

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

Например, если вам требуется соединение с базой данных для выполнения какого-либо процесса в классе, который вы пытаетесь протестировать - отсоедините объект обработки базы данных от вашего класса, передайте его через метод конструктора или метода установки, и в своем тесте используйте инструмент, такой как JMock (или написать заглушку класса), чтобы создать поддельный объект обработки базы данных. Таким образом вы убедитесь, что тесты не зависят от конкретной конфигурации базы данных, и вы тестируете только небольшую часть кода, которая вас интересует, а не весь уровень обработки базы данных.

Поначалу может показаться, что у вас много работы, но такой рефакторинг - это именно то, что нужно реализовать в вашей тестовой среде. Возможно, вам будет полезно получить книгу по тестированию программного обеспечения в качестве справочного пособия для разделения ваших зависимостей. Это окупится намного больше, чем попытка загрузить JUnit изнутри вашего работающего приложения.

5 голосов
/ 11 апреля 2018

В JUnit 5 вы можете использовать Launcher API для этих целей.

    final LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
            .selectors(
                    selectPackage("path_to_folder_with_tests")
            )
            .build();

    final Launcher launcher = LauncherFactory.create();

    final boolean pathContainsTests = launcher.discover(request).containsTests()
    if (!pathContainsTests) {
        System.out.println("This path is invalid or folder doesn't consist tests");
    }

    final SummaryGeneratingListener listener = new SummaryGeneratingListener();

    launcher.execute(request, listener);

    final TestExecutionSummary summary = listener.getSummary();

    final long containersFoundCount = summary.getContainersFoundCount();
    System.out.println("containers Found Count  " + containersFoundCount);

    final long containersSkippedCount = summary.getContainersSkippedCount();
    System.out.println("containers Skipped Count  " + containersSkippedCount);

    final long testsFoundCount = summary.getTestsFoundCount();
    System.out.println("tests Found Count  " + testsFoundCount);

    final long testsSkippedCount = summary.getTestsSkippedCount();
    System.out.println("tests Skipped Count  " + testsSkippedCount);
2 голосов
/ 30 марта 2010

Согласно API JUnit, JUnitCore имеет несколько методов для выполнения тестов внутри Java.

Благодарю Томислава Накича-Альфиревича за указание на это.

http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html

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