Персонализирани JUnit 4 Test Runners

1. Общ преглед

В тази бърза статия ще се съсредоточим върху това как да стартираме JUnit тестове с помощта на персонализирани тестови бегачи.

Просто казано, за да посочим персонализирания бегач, ще трябва да използваме анотацията @RunWith .

2. Подготовка

Нека започнем с добавяне на стандартната зависимост JUnit в нашия pom.xml :

 junit junit 4.12 

3. Внедряване на персонализиран бегач

В следващия пример ще покажем как да напишем свой собствен Runner - и да го стартираме с @ RunWith .

JUnit Runner е клас, който разширява абстрактния клас Runner на JUnit и е отговорен за провеждането на тестове на JUnit , обикновено използвайки отражение.

Тук ние прилагаме абстрактни методи на клас Runner :

public class TestRunner extends Runner { private Class testClass; public TestRunner(Class testClass) { super(); this.testClass = testClass; } @Override public Description getDescription() { return Description .createTestDescription(testClass, "My runner description"); } @Override public void run(RunNotifier notifier) { System.out.println("running the tests from MyRunner: " + testClass); try { Object testObject = testClass.newInstance(); for (Method method : testClass.getMethods()) { if (method.isAnnotationPresent(Test.class)) { notifier.fireTestStarted(Description .createTestDescription(testClass, method.getName())); method.invoke(testObject); notifier.fireTestFinished(Description .createTestDescription(testClass, method.getName())); } } } catch (Exception e) { throw new RuntimeException(e); } } }

Методът getDescription се наследява от Describable и връща Описание, което съдържа информацията, която по-късно се експортира и може да се използва от различни инструменти.

В изпълнението на изпълнението извикваме целевите методи за тестване, използвайки отражение.

Дефинирали сме конструктор, който приема аргумент Class ; това е изискване на JUnit. По време на изпълнение JUnit ще предаде целевия тестов клас на този конструктор.

RunNotifier се използва за задействане на събития, които имат информация за напредъка на теста.

Нека използваме бегача в нашия тестов клас:

public class Calculator { public int add(int a, int b) { return a + b; } } @RunWith(TestRunner.class) public class CalculatorTest { Calculator calculator = new Calculator(); @Test public void testAddition() { Syste.out.println("in testAddition"); assertEquals("addition", 8, calculator.add(5, 3)); } }

Резултатът, който получаваме:

------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.baeldung.junit.CalculatorTest running the tests from MyRunner: class com.baeldung.junit.CalculatorTest in testAddition Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

4. Специализирани бегачи

Вместо да разширяваме класа Runner на ниско ниво , както направихме в последния пример, можем да разширим един от специализираните подкласове на Runner : ParentRunner или BlockJUnit4Runner .

Абстрактният клас ParentRunner изпълнява тестовете по йерархичен начин.

BlockJUnit4Runner е конкретен клас и ако предпочитаме да персонализираме определени методи, вероятно ще разширим този клас.

Нека да видим това с пример:

public class BlockingTestRunner extends BlockJUnit4ClassRunner { public BlockingTestRunner(Class klass) throws InitializationError { super(klass); } @Override protected Statement methodInvoker(FrameworkMethod method, Object test) { System.out.println("invoking: " + method.getName()); return super.methodInvoker(method, test); } }

Анотирането на клас с @RunWith (JUnit4.class) винаги ще извиква бегача по подразбиране JUnit 4 в текущата версия на JUnit; този клас псевдоним на текущия бегач на клас JUnit 4 по подразбиране:

@RunWith(JUnit4.class) public class CalculatorTest { Calculator calculator = new Calculator(); @Test public void testAddition() { assertEquals("addition", 8, calculator.add(5, 3)); } }

5. Заключение

JUnit Runners са изключително адаптивни и позволяват на разработчика да промени процедурата за изпълнение на теста и целия процес на теста.

Ако искаме да направим само незначителни промени, добре е да разгледаме защитените методи на Runner BlockJUnit4Class .

Някои популярни внедрения на бегачи на трети страни за използване включват SpringJUnit4ClassRunner, MockitoJUnitRunner, HierarchicalContextRunner, Cucumber Runner и много други.

Изпълнението на всички тези примери и кодови фрагменти може да се намери в проекта GitHub - това е проект на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.