Запуск или игнорирование JUnit-тестов в зависимости от определенных условий

Java

Применение аннотации @Ignore позволяет проигнорировать выполнение помеченного ею теста. Так же этой аннотацией можно пометить весь класс, содержащий тестовые методы, что приведет к игнорированию сразу всех тестов, расположенных в этом классе. Применение аннотации @Ignore главным образом осуществляется в процессе разработки и отладки тестовых или тестируемых классов, для пометки тестов которые не должны выполняться. Параметром аннотации можно указать причину пропуска теста. Пример:

@Ignore(“Тест ещё не реализован!!!”)
@Test
public void testFunct() {
    // ???
}

Однако часто возникает ситуация когда необходимо принять решение выполнять или нет ряд тестов в зависимости от определенных условий, например, в зависимости от числа ядер процессора или операционной системы, под которой выполняются тесты. В таком случае необходимо использовать «предположения» (assumption), определенные в класс org.junit.Assume.

Неудачное предположение не означает ошибку в коде, а указывает на то, что тест не несет никакой смысловой нагрузки. Дефолтный раннер обрабатывает тесты с неудачным предположением как пропущенные. Для кастомного раннера поведение можно определить самому.

Пример применения «предположений» для запуска тестов только под «Виндой»:

import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestSomethingOnlyForWindows {
    @BeforeClass
    public static void checkOs() throws Exception {
        Assume.assumeTrue(System.getProperty("os.name").toLowerCase().contains("windows"));
    }
    @Test
    public void someTest1() {…}
    
    @Test
    public void someTest2() {…}
    
    …
    
}

Применение предположения в методе с аннотацией @BeforeClass (как в вышеописанном примере) позволяет пропустить все тесты, определенные в тестовом классе в случае, если это предположение не выполняется. Такой же результат можно получить, если использовать это же предположение в начале каждого теста.

Ниже представлен перечень доступных предположений (assume). Каждому предположению можно добавить первым параметром строку, которая будет использоваться в качестве параметра для AssumptionViolatedException при ошибочном предположении.

  • assumeTrue([String message], boolean b) — Проверка на истинность логического утверждения.
  • assumeFalse([String message], boolean b) — Проверка на истинность логического утверждения, обратно assumeTrue.
  • assumeNoException([String message], Throwable t) — Предположение, что тест завершится нормально. Если метод вызывается и в качестве t передается выброшенное исключение, то тест игнорируется (обычно применяется в блоке catch конструкции try-catch и передается выброшенное исключение).
  • assumeNotNull(Object... objects) — Если вызывается с одним (или более) не нулевым объектом, то тест прерывается и игнорируется.
  • assumeThat([String message], T actual, Matcher<T> matcher) — Проверка, что actual удовлетворяет условию заданному matcher.
Михаил Миронов

Живу в Нижнем Новгороде, работаю программистом с 2017 года, основная специализация Java, но также хорошо знаю PHP, Python, XML, HTML/CSS.

Добавить комментарий