Действительно ли возможно запустить тесты JUnit из моего JAVA-приложения?
Есть ли среды тестирования, которые я могу использовать (такие как JUnit.jar?), или, я вызываю, чтобы найти тестовые файлы, вызвать методы и отследить исключения сам?
Причиной, почему я спрашиваю, является мое приложение, требует, чтобы большая работа запустила запуск (много зависимостей и конфигураций, и т.д.), и использование внешнего инструмента тестирования (как задача Ant JUnit) потребовало бы, чтобы большая работа настроила.
Легче запустить приложение и затем в выполнении приложения мои тесты.
Существует ли легкая среда тестирования, которая запускает тесты и выходные результаты из JAVA-приложения, или я вынужден записать свою собственную платформу?
Да, можно. Я делал это пару раз, чтобы запустить диагностические / дымовые тесты в производственных системах. Это фрагмент ключевой части кода, вызывающего JUnit:
JUnitCore junit = new JUnitCore();
Result result = junit.run(testClasses);
НЕ используйте JUnit.main
внутри вашего приложения, он вызывает System.exit
после завершения тестов и, таким образом, это может остановить процесс JVM.
Вы можете захотеть захватить «обычный» консольный вывод JUnit (точки и простой отчет). Это легко сделать, зарегистрировав TextListener
(этот класс предоставляет этот простой отчет).
Пожалуйста, обратите внимание на несколько сложностей, связанных с использованием этого метода:
Тестирование любой «тестовой среды», в том числе такой небольшой, хотя это довольно просто, может сбивать с толку. Например, если вы хотите проверить, возвращает ли ваша «тестовая среда» результат сбоя при сбое одного из тестов, вы можете (должны?) Создать образец теста JUnit, который всегда дает сбой, и выполнить этот тест с «тестовой структурой». В этом случае неудачный тестовый пример на самом деле является тестовыми данными и не должен выполняться как «обычный» JUnit. Пример таких тестов можно найти во внутренних тестовых примерах JUnit.
Если вы хотите подготовить / отобразить свой собственный отчет, вам лучше зарегистрировать свой собственный RunListener
, потому что результат, возвращаемый JUnit, не содержит (напрямую) информацию о пройденных тестах и методе тестирования (это только "жестко запрограммированы" как часть теста Описание
).
Согласно JUnit API, JUnitCore имеет несколько методов для выполнения тестов внутри Java.
Спасибо Томиславу Накич-Альфиревичу за указание на это.
http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html
Как указано в JUnit FAQ :
public static void main(String args[]) {
org.junit.runner.JUnitCore.main("junitfaq.SimpleTest");
}
Причина, по которой я спрашиваю, заключается в том, что мое приложение требует много работы для запуска (множество зависимостей и конфигураций и т.д.) и использование внешнего инструмента тестирования (например, JUnit Ant задача) потребует много работы для настроить.
Вам нужно удалить эти зависимости из кода, который вы тестируете. Зависимости и конфигурации - это именно то, чего вы пытаетесь избежать при написании тестового фреймворка. Для каждого теста вы должны ориентироваться на наименьшую тестируемую часть приложения.
Например, если вам требуется подключение к базе данных для выполнения какого-либо процесса в классе, который вы пытаетесь протестировать - отделите объект обработки базы данных от вашего класса, передайте его через конструктор или метод сеттера, а в своем тесте используйте такой инструмент, как JMock (или напишите класс-заглушку) для создания поддельного объекта обработки базы данных. Таким образом, вы убедитесь, что тесты не зависят от конкретной конфигурации базы данных, и вы тестируете только небольшую часть кода, которая вас интересует, а не весь слой обработки базы данных.
Поначалу это может показаться большой работой, но такой рефакторинг - это именно то, чем должна быть наполнена ваша тестовая структура. Возможно, вам будет полезно приобрести книгу по тестированию программного обеспечения в качестве справочника по отсоединению зависимостей. Это окупится гораздо больше, чем попытки загрузить JUnit изнутри вашего работающего приложения.