Статьи

Практическое модульное тестирование с TestNG и Mockito — Обзор

« Практическое модульное тестирование с использованием TestNG и Mockito » ( веб-сайт ) охватывает широкий спектр знаний о тестировании в среде Java с использованием вышеупомянутых библиотек. Но если вы предпочитаете JUnit, а не TestNG, или PowerMock, а не Mockito, это все еще является действительным и очень хорошим источником информации о правильном и безболезненном тестировании. Но, конечно, пользователи TestNG и Mockito смогут получить большую часть этого названия. Ниже вы можете прочитать некоторые мои мысли после прочтения этой книги.

Быстрый просмотр контента

Томек Качановский , автор этой книги, начинает с описания некоторых основных понятий, необходимых для понимания тестирования и классификации тестов. Он вводит определения тестируемой системы SUT и DOC — в зависимости от компонента. Затем, после этой действительно короткой теоретической главы, мы начинаем погружаться глубже в постепенно все более сложные тестовые случаи.

Мы начнем с простого класса без каких-либо зависимостей, простого для понимания и простого для тестирования. Тогда мы могли почувствовать ритм управляемой тестами разработки с TestNG, узнать, как использовать макеты, заглушки и шпионы из Mockito, использовать сопоставителей и проверять утверждения с помощью FEST. Пример за примером, мы знакомимся с более сложными функциями этих библиотек. но, к счастью для тех, кто не использует TestNG с Mockito, каждая глава полна общих советов и предложений по методологии тестирования, как правильно подходить к тестированию и, наконец, как и что тестировать.

Затем мы могли бы узнать о настройке TestNG с использованием слушателей и репортеров, организации тестовых классов в пакеты и модули, организации кода в тестовых методах (знаменитое BDD-задано-когда-то трио).

Последние главы полностью посвящены самым общим вещам: ведению тестов, определению, какие части вашей кодовой базы заслуживают тестирования, проверке качества ваших тестов с помощью инструментов статического анализа (PMD, Coberturda и т. Д.).

Мое мнение

Я использую TestNG более года (после перехода с JUnit), Mockito более трех лет, поэтому я довольно знаком с этими инструментами. И для людей с подобным или большим опытом эта книга не будет удивлять на каждой отдельной странице. Это произойдет или, по крайней мере, на мой взгляд, произойдет с теми, кто менее знаком с тестированием и использованием TestNG и Mockito. Для них эту книгу абсолютно необходимо прочитать, поскольку она мягко знакомит читателя с миром правильного модульного тестирования с использованием лучших инструментальных средств, доступных в мире Java.

Я далек от того, чтобы сказать, что для более опытных разработчиков эта книга — не лучший способ провести время. Это все еще хорошо, я узнал много интересных особенностей описанных библиотек, но что самое важное, мои знания о тестировании теперь более полные и более упорядоченные. Чтение всего этого помогло мне положить много вещей на «правильные полки» в моей голове. И это очень хорошо.

Подводя итог: чем меньше у вас опыта в тестировании, тем больше вы получите от этой книги. И для людей, которые тестируют и используют TestNG и Mockito уже более восьми лет: эта книга, вероятно, не для вас.

Если вы окажетесь в центре, Практическое модульное тестирование с TestNG и Mockito по-прежнему будет очень хорошим выбором, поскольку оно поможет вам систематизировать все то, что вы уже знаете, и в то же время вы обязательно узнаете что-то новое об инструментах и, что стоит отметить, об общем эффективном и безболезненном подходе к тестированию вашего кода.

Мои вынос

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

Обогащение отчетов испытаний HTML

TestNG имеет хороший класс org.testng.Reporter, который позволяет разработчику добавлять некоторую информацию в HTML-отчеты

@Test
public void testSomething() {
    Reporter.log("This is so soo important, please read it!");

    //test something
}

И после запуска таких тестов в html отчете мы увидим что-то вроде присутствующего на скриншоте ниже:

и дополнительно все такие сообщения собраны в одном отдельном отчете.

 

Четкое разделение между важными и фиктивными данными испытаний

Давайте предположим, что мы тестируем следующий метод

@Test
public void loadByAgeRange() {
    service.loadClientBy(1, 20, 40, null);
}

и сравните это с перечислением ниже:

@Test
public void loadByAgeRange() {
    int ageFrom = 20;
    int ageTo = 40;

    service.loadClientBy(ANY_TYPE, ageFrom, ageTo, ANY_REGION);
}

Разве это не намного понятнее? Мы заменяем фиктивные данные константами, указывающими, какая часть важна, а какие параметры не являются критическими в этом методе.

Издевается авто впрыск

Mockito позволяет нам автоматически вводить все макеты в объект, который мы собираемся протестировать:

@InjectMocks private ObjectUnderTest object = new ObjectUnderTest();

Конечно, у него есть некоторые ограничения (см. JavaDocs ), но хорошо знать, что такая функция уже есть в Mockito.

Make-it-easy — крошечная структура, облегчающая написание тестовых сборщиков данных на Java

Этот небольшой проект поможет вам легко создавать конструкторы для ваших тестовых случаев. Больше можно найти в его вики , но ниже простой пример использования, показывающий, как это выглядит:

Person nat = make(a(Person, with(name, "Tomek"), with(age, 28)));

Частичное издевательство

Если есть метод, который мы хотим протестировать, но в то же время есть другой метод в тестируемом объекте, который хочет смоделировать, это можно сделать с помощью usinf Mockito spy ():

@Test
public void testCaluculationSummary() {
    TestedObject object = spy(new TestedObject());
    when(object.executeHeavyCalculations()).thenReturn("resultString");

    int result = object.getCalculationsSummary();

    assertThat(result).isEqualTo(10);
}

Тестирование и сбор аргументов метода

Mockito дает нам еще одну очень полезную функцию — возможность проверять, какие аргументы были переданы методам с помощью ArgumentCaptor :

@Test
public void testArgument() {
    // ...
    CustomerService customerService = mock(CustomerService.class);
    ArgumentCaptor argument = ArgumentCaptor.forClass(Customer.class);
    verify(customerService).saveCustomer(argument.capture());

    testedObject.executeSomeMethodCallingSaveCustomer()

    assertThat(argument.getValue()).isEqualTo(expectedCustomer);
}