Введение в платформу тестирования приложений Spring Boot

Spring Boot Spring
Введение в платформу тестирования приложений Spring Boot

1. Проблемы, существующие при тестировании приложений с весенней загрузкой

Официальный тестовый фреймворк spring-boot-test-starter предоставляет множество функций (junit, spring test, assertj, hamcrest, mockito, jsonassert, jsonpath), но все еще есть проблемы на уровне базы данных, которая сильно зависит от данных базы данных, и не имеет возможности инициализировать данные самостоятельно. Тестовые фреймворки spring-test-dbunit и spring-boot-unitils-starter поддерживают тестирование приложений spring-boot, а также предоставляют функцию подготовки данных перед модульным тестированием.

2. Введение и применение spring-test-dbunit

2.1 Введение

spring-test-dbunit — это проект с открытым исходным кодом, разработанный Филиппом Уэббом, одним из авторов Spring Boot, для предоставления функций dbunit для модульного тестирования проектов Spring. Введение в проект dbunit: переводит вашу базу данных в известное состояние между прогонами тестов. Официальный веб-сайт spring-test-dbunit представлен как: Spring DBUnit обеспечивает интеграцию между средой тестирования Spring и популярный проект DBUnit.

2.2. Применение

Основной код примера выглядит следующим образом:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DemoTestApplication.class)
@TestExecutionListeners({
        DependencyInjectionTestExecutionListener.class,
        TransactionDbUnitTestExecutionListener.class})
@DbUnitConfiguration(dataSetLoader = XlsDataSetLoader.class)
@Transactional
public class UserControllerTest {

    @Autowired
    private UserController userController;

    @Test
    @DatabaseSetup({"/data/test_getUsername.xls"})
    public void test_getUsername() {
        String username = userController.getUsername(1234);
        Assert.assertTrue(username.equals("zhangsan"));
    }
}

Содержимое файла test_getUsername.xls следующее:

2.3 Принцип реализации

Подготовка тестовой среды:

@RunWith(SpringJUnit4ClassRunner.class): используется для запуска тестов, регистрации TestExecutionListener и построения testContext.

@SpringBootTest(classes = DemoTestApplication.class): загрузить applicationContext с помощью SpringBootTestContextBootstrapper.

DependencyInjectionTestExecutionListener: используется для внедрения bean-компонентов в тестовые классы, такие как userController в экземпляре.

Принцип реализации сделки:

TransactionalTestExecutionListener здесь обозначается как T, а DbUnitTestExecutionListener — как D, как показано ниже:

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

3. Введение и применение spring-boot-unitils-starter

3.1 Введение

Введение в платформу Unitils: Unitils — это библиотека с открытым исходным кодом, предназначенная для упрощения и удобства обслуживания модульного и интеграционного тестирования. Его называют королем тестирования, и его состав таков:

В настоящее время Unitils поддерживает только проекты spring с конфигурацией xml. Он не поддерживает проекты spring-boot. Исходя из этого, я открываю исходный код проекта, чтобы построить мост между приложениями unitils и spring-boot.

Этот проект с открытым исходным кодом в основном выполнял следующие работы:

  • Перепишите SpringModule->SpringBootModule для поддержки настроек ApplicationContext.
  • ApplicationContext имеет значение SpringBootModule.
  • Источник данных заменить
  • набор данных, поддерживающий xls

На данный момент доступны следующие версии:

        <dependency>
            <groupId>com.github.yangjianzhou</groupId>
            <artifactId>spring-boot-unitils-starter</artifactId>
            <version>1.1.0.RELEASE</version>
        </dependency>

3.2. Применение

Пример кода выглядит следующим образом:

@RunWith(UnitilsBootBlockJUnit4ClassRunner.class)
@SpringBootTest(classes = DemoTestApplication.class)
@Transactional(value = TransactionMode.ROLLBACK)
public class UserControllerTest {

    @SpringBeanByType
    private UserController userController;

    @Test
    @DataSet({"/data/test_getUsername.xls"})
    public void test_getUsername() {
        String username = userController.getUsername(1234);
        Assert.assertTrue(username.equals("zhangsan"));

    }
}

3.3 Принцип реализации

DatabaseTestListener в DatabaseModule выполняет открытие и откат (фиксацию) транзакции.

DbUnitListener в DbUnitModule подготавливает набор данных и проверяет ожидаемый набор данных.
SpringTestListener в SpringBootModule внедряет и уничтожает свойства в тестовом классе.

 

4. Расширение

весенний тест-dbunit (Весенний тест DB Unit.Github.io/spring-test ...) и spring-boot-unitils-starter (GitHub.com/Цзяньчжоу Ян…) восполняет недостаток spring-boot-test-starter в тестировании баз данных, комбинируя фреймворк spring-test-dbunit (или spring-boot-unitils-starter) с фиктивным инструментом (mockito) и некоторыми методами тестирования, он может сделать хорошо модульный тест.

Тем не менее, у spring-test-dbunit и spring-boot-unitils-starter есть свои преимущества и недостатки, Spring-test-dbunit имеет хорошую документацию, но последняя обновленная версия — версия 2016 года, которая является только инструментом тестирования в базе данных. уровень. spring-boot-unitils-starter использует преимущества unitils и, можно сказать, является тестовой платформой.Хотя говорят, что версия (unitils) выпускается каждый год, ее документации меньше. Пользователи могут выбирать в соответствии со своими потребностями.

 

Приложение: Код тестового примера задействован в тексте:GitHub.com/Цзяньчжоу Ян…