« Практическое модульное тестирование с использованием 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); }