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/Цзяньчжоу Ян…