Пользовательские JUnit 4 Test Runners

Пользовательские JUnit 4 Test Runners

1. обзор

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

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

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

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


  junit
  junit
  4.12

3. Реализация настраиваемого бегуна

В следующем примере мы покажем, как написать собственныйRunner - и запустить его с помощью @RunWith.

A JUnit Runner is a class that extends JUnit’s abstract Runner class and it is responsible for running JUnit tests, обычно с использованием отражения.

Здесь мы реализуем абстрактные методы класса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 и возвращаетDescription, который содержит информацию, которая впоследствии экспортируется и может использоваться различными инструментами.

В реализацииrun мы вызываем целевые методы тестирования с помощью отражения.

Мы определили конструктор, который принимает аргумент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.example.junit.CalculatorTest
running the tests from MyRunner: class com.example.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, как мы это делали в последнем примере,we can extend one of the specialized subclasses of Runner: ParentRunner or 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 отлично адаптируются и позволяют разработчику изменять процедуру выполнения теста и весь процесс тестирования.

Если мы хотим внести лишь незначительные изменения, рекомендуется взглянуть на защищенные методы бегунаBlockJUnit4Class.

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

Реализация всех этих примеров и фрагментов кода можно найти вGitHub project - это проект Maven, поэтому его должно быть легко импортировать и запускать как есть.