Новости

29.06.2020

Книга «Spring Boot 2: лучшие практики для профессионалов»

Увеличьте скорость и простоту разработки микросервисов и сложных приложений, избавившись от забот по конфигурации Spring.

Используйте Spring Boot 2 и такие инструменты фреймворка Spring 5, как WebFlux, Security, Actuator, а также фреймворк Micrometer, предоставляющий новый способ сбора метрик.

Фреймворк тестирования Spring


Одна из основных идей фреймворка Spring — поощрение создания разработчиками простых и слабо связанных классов, программирование интерфейсов, благодаря чему программное обеспечение становится более надежным и лучше расширяемым. Фреймворк Spring предоставляет инструменты, упрощающие модульное и интеграционное тестирование (на самом деле, если вы действительно программируете интерфейсы, для тестирования функциональности приложений Spring вам не нужен). Другими словами, необходимо, чтобы приложение можно было протестировать с помощью систем тестирования JUnit или TestNG на основе объектов (создаваемых просто с помощью оператора new — без Spring или какого-либо другого контейнера).

В фреймворк Spring включено несколько пакетов, предназначенных для модульного или интеграционного тестирования приложений. Для модульного тестирования предназначено несколько имитационных объектов (Environment, PropertySource, JNDI, Servlet; реактивные утилиты тестирования ServerHttpRequest и ServerHttpResponse), с помощью которых можно производить изоляционное тестирование кода.

Одна из чаще всего используемых возможностей тестирования в фреймворке Spring — интеграционное тестирование. Основные его задачи:


  • управление кэшированием контейнера Spring IoC в промежутке между выполнениями тестов;
  • управление транзакциями;
  • внедрение зависимостей экземпляров тестовых объектов;
  • создание предназначенных специально для Spring базовых классов.


Фреймворк Spring обеспечивает легкий способ тестирования посредством интеграции в тесты контекста приложения (ApplicationContext). Модуль тестирования Spring предлагает несколько способов использования ApplicationContext, программным образом и с помощью аннотаций.

  • Аннотация BootstrapWith. Аннотация уровня класса, предназначенная для конфигурации начальной загрузки фреймворка TestContext Spring.
  • Аннотация @ContextConfiguration. Определяет метаданные уровня класса, задающие способ загрузки и настройки ApplicationContext для интеграционных тестов. Это совершенно необходимая для ваших классов аннотация, поскольку именно здесь ApplicationContext загружает все определения компонентов.
  • Аннотация @WebAppConfiguration. Аннотация уровня класса, указывающая, что загружаемым для интеграционного теста контекстом приложения должно быть WebApplicationContext.
  • Аннотация @ActiveProfile. Аннотация уровня класса, указывающая, какой из профилей определения компонентов должен быть активным при загрузке ApplicationContext для интеграционного теста.
  • Аннотация @TestPropertySource. Аннотация уровня класса, предназначенная для задания местоположений файлов свойств и встраиваемых свойств, добавляемых в набор объектов PropertySource в Environment для загружаемого для интеграционного теста ApplicationContext.
  • Аннотация @DirtiesContext. Указывает, что используемый ApplicationContext был «загрязнен» во время выполнения теста (например, модифицирован или поврежден путем изменения состояния компонента-одиночки) и должен быть закрыт.


Это далеко не все аннотации, существует множество других (@TestExecutionListeners, CommitRollback, @BeforeTransaction, @AfterTransaction, SqlSqlGroup, SqlConfig, TimedRepeat, @IfProfileValue и т. д.).

Как вы видите, существует множество вариантов тестирования с помощью фреймворка Spring. Обычно всегда используется аннотация @RunWith, связывающая воедино все элементы фреймворка тестирования. Например:

@RunWith(SpringRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public class ToDoRepositoryTests {

        @Test
        public void ToDoPersistenceTest(){
                //...
        }
}


Теперь взглянем, как следует использовать фреймворк тестирования Spring и какие возможности предоставляет Spring Boot.

Фреймворк тестирования Spring Boot


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

Чтобы начать применять все возможности тестирования Spring Boot, необходимо лишь добавить в приложение зависимость spring-boot-starter-test с указанием области видимости test (scope test). В сервисе Spring Initializr эта зависимость уже добавлена.

Зависимость spring-boot-starter-test обеспечивает возможность использования нескольких фреймворков тестирования, очень хорошо согласующихся с возможностями тестирования Spring Boot: JUnit, AssertJ, Hamcrest, Mockito, JSONassert и JsonPath. Конечно, существуют и другие фреймворки тестирования, отлично работающие с модулем Spring Boot Test; просто соответствующие зависимости нужно указывать вручную.

Spring Boot предоставляет аннотацию @SpringBootTest, упрощающую тестирование приложений Spring. Обычно при тестировании приложения Spring необходимо добавить несколько аннотаций для тестирования конкретной возможности или функциональности приложения, но не в Spring Boot — хотя для тестирования все равно нужно указать аннотацию @RunWith(SpringRunner.class); если этого не сделать, любые новые аннотации тестирования Spring Boot будут проигнорированы. У аннотации @SpringBootTest есть полезные для тестирования веб-приложений параметры, например RANDOM_PORT и DEFINED_PORT.

Следующий фрагмент кода представляет собой каркас теста Spring Boot.

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {

        @Test
        public void exampleTest() {
                 ...
        }
}

 

Тестирование конечных точек веб-приложения


Spring Boot предоставляет удобный способ тестирования конечных точек: имитационную среду под названием класс MockMvc:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MockMvcToDoTests {

        @Autowired
        private MockMvc mvc;

        @Test
        public void toDoTest() throws Exception {
              this.mvc
              .perform(get("/todo"))
              .andExpect(status().isOk())
              .andExpect(content()
                   .contentType(MediaType.APPLICATION_JSON_UTF8));
        }
}


Можно также воспользоваться классом TestRestTemplate.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ToDoSimpleRestTemplateTests {

      @Autowired
      private TestRestTemplate restTemplate;

      @Test
      public void toDoTest() {
            String body = this.restTemplate.getForObject("/todo", String.class);
            assertThat(body).contains("Read a Book");
      }
}


В этом коде показан тест, запускающий полноценный сервер и использующий экземпляр класса TestRestTemplate для обращения к конечной точке /todo. Здесь мы предполагаем, что возвращается объект String (это не лучший способ тестирования возврата JSON; не волнуйтесь, далее мы покажем, как использовать класс TestRestTemplate правильно).

С полным содержанием статьи можно ознакомиться на сайте "Хабрахабр": https://habr.com/ru/company/piter/blog/506872/ 


Комментарии: 0

Пока нет комментариев


Оставить комментарий






Все поля обязательны к заполнению.

Перед публикацией комментарии проходят модерацию.