Тестирование с помощью JGoTesting

Тестирование с JGoTesting

1. обзор

JGoTesting - этоJUnit-compatible testing framework inspired by Go’s testing package.

В этой статье мы рассмотрим ключевые особенности платформы JGoTesting и реализуем примеры, чтобы продемонстрировать ее возможности.

2. Maven Dependency

Во-первых, давайте добавим зависимостьjgotesting к нашемуpom.xml:


    org.jgotesting
    jgotesting
    0.12

Последнюю версию этого артефакта можно найтиhere.

3. Вступление

JGoTesting позволяет нам писать тесты, совместимые с JUnit. For every assertion method JGoTesting provides, there is one in JUnit with the same signature, поэтому реализовать эту библиотеку очень просто.

Однакоunlike JUnit, when an assertion fails, JGoTesting doesn’t stop the execution of the test. Вместо этого сбой записывается какevent и предоставляется нам только после того, как все утверждения были выполнены.

4. JGoTesting в действии

В этом разделе мы увидим примеры того, как настроить JGoTesting и исследуем его возможности.

4.1. Начиная

Чтобы написать наши тесты, давайте сначала импортируем методы утверждения JGoTesting:

import static org.jgotesting.Assert.*; // same methods as JUnit
import static org.jgotesting.Check.*; // aliases starting with "check"
import static org.jgotesting.Testing.*;

Библиотеке требуется обязательный экземплярJGoTestRule, помеченный аннотацией@Rule. Это указывает на то, что все тесты в классе будут управляться JGoTesting.

Давайте создадим класс, объявляющий такое правило:

public class JGoTestingUnitTest {

    @Rule
    public final JGoTestRule test = new JGoTestRule();

    //...
}

4.2. Написание тестов

JGoTesting предоставляет два набора методов утверждения для написания наших тестов. Имена методов в первом наборе начинаются сassert и совместимы с JUnit, а остальные начинаются сcheck.

Оба набора методов ведут себя одинаково, и библиотека обеспечивает однозначное соответствие между ними.

Вот пример, чтобы проверить, равно ли одно число другому, используя обе версии:

@Test
public void whenComparingIntegers_thenEqual() {
    int anInt = 10;

    assertEquals(anInt, 10);
    checkEquals(anInt, 10);
}

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

4.3. События и сообщения отказов

Когда проверка завершается неудачно, JGoTesting записывает ошибку, чтобы тестовый пример продолжил выполнение. After the test ends, the failures are reported.

Вот пример, чтобы показать, как это выглядит:

@Test
public void whenComparingStrings_thenMultipleFailingAssertions() {
    String aString = "The test string";
    String anotherString = "The test String";

    checkEquals("Strings are not equal!", aString, equalTo(anotherString));
    checkTrue("String is longer than one character", aString.length() == 1);
    checkTrue("A failing message", aString.length() == 2);
}

После выполнения теста мы получаем следующий вывод:

org.junit.ComparisonFailure: Strings are not equal!
  expected:<[the test s]tring> but was:<[The Test S]tring>
// ...
java.lang.AssertionError: String is longer than one character
// ...
java.lang.AssertionError: Strings are not the same
  expected the same: was not:

Помимо передачи сообщений об ошибках в каждом методе, мы также можем регистрировать их так, чтобы они появлялись только тогда, когда в тесте есть хотя бы один сбой.

Давайте напишем тестовый метод, который реализует это на практике:

@Test
public void whenComparingNumbers_thenLoggedMessage() {
    log("There was something wrong when comparing numbers");

    int anInt = 10;
    int anotherInt = 10;

    checkEquals(anInt, 10);
    checkTrue("First number should be bigger", 10 > anotherInt);
    checkSame(anInt, anotherInt);
}

После выполнения теста мы получаем следующий вывод:

org.jgotesting.events.LogMessage: There was something wrong
  when comparing numbers
// ...
java.lang.AssertionError: First number should be bigger

Обратите внимание, что в дополнение кlogf(), который может форматировать сообщения как методString.format(), методы_ we can also use the _logIf() иlogUnless() регистрируют сообщения на основе условного выражения.

4.4. Прерывание тестов

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

Вот примерtest that ends prematurely, потому что требуемый файл не существует:

@Test
public void givenFile_whenDoesnotExists_thenTerminated() throws Exception {
    File aFile = new File("a_dummy_file.txt");

    terminateIf(aFile.exists(), is(false));

    // this doesn't get executed
    checkEquals(aFile.getName(), "a_dummy_file.txt");
}

Обратите внимание, что мы также можем использовать методыterminate() иterminateUnless() для прерывания выполнения теста.

4.5. Цепной

КлассJGoTestRule также имеетfluent API that we can use to chain checks together.

Давайте посмотрим на пример, в котором наш экземплярJGoTestRule используется для объединения нескольких проверок объектовString:

@Test
public void whenComparingStrings_thenMultipleAssertions() {
    String aString = "This is a string";
    String anotherString = "This Is a String";

    test.check(aString, equalToIgnoringCase(anotherString))
      .check(aString.length() == 16)
      .check(aString.startsWith("This"));
}

4.6. Пользовательские проверки

Помимо выраженийboolean и экземпляровMatcher,JGoTestRule‘s methods can accept a custom Checker object to do the checking. Это интерфейс Single Abstract Method, который может быть реализован с использованием лямбда-выражения.

Вот пример, который проверяет, соответствует лиString определенному регулярному выражению, используя вышеупомянутый интерфейс:

@Test
public void givenChecker_whenComparingStrings_thenEqual() throws Exception {
    Checker aChecker = s -> s.matches("\\d+");

    String aString = "1235";

    test.check(aString, aChecker);
}

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

В этом кратком руководстве мы рассмотрели функции, которые JGoTesting предоставляет нам для написания тестов.

Мы продемонстрировали JUnit-совместимые методыassert, а также их аналогиcheck. Мы также увидели, как библиотека регистрирует и сообщает о сбоях, и написали пользовательскийChecker с использованием лямбда-выражения.

Как всегда, полный исходный код этой статьи можно найти наover on Github.