JUnitCore Остановка - PullRequest
       20

JUnitCore Остановка

2 голосов
/ 16 февраля 2012

Я хочу остановить / уничтожить работающий JUnitCore, который запускается с

JUnitCore.run(Request.aClass(ClassToRun));

Как pleaseStop() в RunNotifier.

Есть идеи?

http://junit.sourceforge.net/javadoc/org/junit/runner/package-summary.html

Ответы [ 4 ]

7 голосов
/ 03 марта 2012

Вариант 1: лучший вариант - написать собственную реализацию Runner, унаследованную от org.junit.runners.BlockJUnit4ClassRunner, и объявить ее в контексте выполнения, например, как главный класс необработанной командной строки Java.

Получите вдохновение от исходного кода JUnit (он действительно небольшой), в основном org.junit.runners.ParentRunner и самостоятельно переопределите метод runChildren, чтобы получить возможность выйти из цикла выполнения при сработала команда останова.

Завод для Runner является Request. Для начала вы вызываете

   (new JUnitCore()).run(Request.runner(new MyStoppableRunner().aClass(ClassToRun))

Вариант 2: Если в вашем контексте использование собственного бегуна невозможно (например, запущено в Eclipse), благодаря реализации RunListener, зарегистрированной в используемом бегуне, вы можете получить ссылку на поток, выполняющий ваш тестовый пример.

Если была запущена команда останова, ваш слушатель может выбросить RuntimeException или даже Error в надежде, что исходный тестовый бегун потерпит крах.

Бонус

Эти два параметра являются базовыми, так как цель состоит в том, чтобы проверить состояние остановки и не повторять циклы на методах или тестовых классах.

Вы можете попытаться прервать тестовый поток, если застряли в состоянии ожидания или ожидания. Для этого должна быть создана нить сторожевого устройства, которая будет вызывать interrupt в тестовой нити после истечения времени бездействия.

2 голосов
/ 02 марта 2012

Насколько я знаю, такого метода нет.Итак, первый ответ должен быть: невозможно ... Но с Java-средами улучшения байт-кода нет ничего действительно невозможного ... Поэтому я мог бы посоветовать вам написать Java-интерфейс Closeable или что-то вроде этого ... использовать Java-среду улучшения байт-кода вашеговыберите (asm, bcel, javaassist или любой другой) и улучшите класс JunitCore для реализации этого интерфейса. Как только вы это сделаете, вы сможете остановить этот фасад для своих тестов ...

public interface Closeable{
   public void stopMe();
}

Привет, улучшение байт-кодаконечно, не серебряная пуля ... Но разветвление и исправление проекта с открытым исходным кодом требует огромных изменений в управлении вашим проектом ... Кто запомнит этот маленький патч 5 лет и 3 релиза спустя?Добавление небольшого класса для улучшения байт-кода для удовлетворения ваших потребностей - прагматичный, но, как всегда, не идеальный ответ ... Я согласен с Ивом, что попытка добавить функцию в JUnit была бы лучшим решением, но для этого требуется гораздо больше, чемтехнические знания ... Конечно, вы можете столкнуться со странными проблемами с загрузкой классов при использовании такой техники .... Для интеграционного тестирования я бы предложил использовать TestNG вместо JUnit, он предоставляет множество улучшений, обеспечивая уровень совместимости ....

HTH Джером

0 голосов
/ 28 февраля 2019

Мне нужно было остановить все запущенные процессы / потоки, когда я выполнял выполнение моего набора тестов из основного метода, используя java -jar test.jar в образе Docker.После завершения тестов я не смог извлечь правильный код завершения.Я пошел с этим:

final JUnitCore engine = new JUnitCore();
engine.addListener(new TextListener(System.out));
final Result testsResult = engine.run(AllTestSuite.class);
 if (testsResult.wasSuccessful()) {
   System.out.println("Tests complete with success!!!");
   System.exit(0);
 }
   System.out.println("Tests complete with "+ result.getFailureCount() + " failures!!!");
   System.exit(1);
0 голосов
/ 10 апреля 2012

Я хочу предоставить другое простое решение для остановки JUnitCore:

JUnitCore jUnitCore = new JUnitCore();
Field field = JUnitCore.class.getDeclaredField("fNotifier");
field.setAccessible(true);
RunNotifier runNotifier = (RunNotifier) field.get(jUnitCore);
runNotifier.pleaseStop();

Кредиты Мэтью Фарвеллу, который перевел мою идею в код.

...