Перейти к основному содержимому

Тестирование запросов NoSQL с помощью Spring Boot и @DataCassandraTest

· 5 мин. чтения

1. Обзор

Как правило, мы используем систему автоматической настройки Spring, такую как @SpringBootTest , для тестирования приложений Spring Boot. Но это приводит к большому количеству импорта автоматически настроенных компонентов.

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

В этом руководстве мы сосредоточимся на тестировании фрагмента базы данных Cassandra приложения Spring Boot, чтобы узнать об аннотации @DataCassandraTest , предоставляемой Spring.

Кроме того, мы рассмотрим небольшое приложение Spring Boot на основе Cassandra в действии.

И, если вы используете Cassandra в производственной среде, вы определенно можете упростить запуск и обслуживание собственного сервера и вместо этого использовать базу данных Astra , которая представляет собой облачную базу данных, построенную на Apache Cassandra.

2. Зависимости Maven

Чтобы использовать аннотацию @DataCassandraTest в нашем приложении Cassandra Spring Boot, мы должны добавить зависимость spring-boot-starter-test :

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.5.3</version>
    <scope>test</scope>
</dependency>

Spring -boot-test-autoconfigure Spring является частью библиотеки spring-boot-starter-test и содержит множество компонентов автоматической настройки для тестирования различных частей приложения. `` ``

Как правило, эта тестовая аннотация имеет шаблон @XXXTest .

Аннотация @DataCassandraTest импортирует следующие компоненты автоконфигурации данных Spring:

  • КэшАвтоконфигурация
  • CassandraAutoConfiguration
  • CassandraDataAutoConfiguration
  • CassandraReactiveDataAutoConfiguration
  • CassandraReactiveRepositoriesAutoConfiguration
  • CassandraRepositoriesAutoConfiguration

3. Пример приложения Cassandra Spring Boot

Чтобы проиллюстрировать эти концепции, у нас есть простое веб-приложение Spring Boot, основным доменом которого является инвентаризация транспортных средств.

Для простоты это приложение обеспечивает базовые операции CRUD с данными инвентаризации.

3.1. Кассандра Мейвен Зависимость

Spring предоставляет модуль spring-boot-starter-data-cassandra для данных Cassandra: ``

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-cassandra</artifactId>
    <version>2.5.3</version>
</dependency>

Нам также нужна зависимость от ядра java-драйвера Datastax Cassandra, чтобы обеспечить подключение к кластеру и выполнение запросов: ``

<dependency> 
    <groupId>com.datastax.oss</groupId> 
    <artifactId>java-driver-core</artifactId> 
    <version>4.13.0</version> 
</dependency>

3.2. Конфигурация Кассандры

Здесь наш класс CassandraConfig расширяет Spring AbstractCassandraConfiguration , который является базовым классом для конфигурации Spring Data Cassandra.

Этот класс Spring используется для настройки клиентского приложения Cassandra с CqlSession для подключения к кластеру Cassandra.

Кроме того, мы можем настроить имя пространства ключей и хост кластера:

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Override
    protected String getKeyspaceName() {
        return "inventory";
    }

    @Override
    public String getContactPoints() {
        return "localhost";
    }

    @Override
    protected String getLocalDataCenter() {
         return "datacenter1";
    }
}

4. Модель данных

Следующий язык запросов Cassandra ( CQL ) создает пространство ключей Cassandra по инвентаризации имен : `` ``

CREATE KEYSPACE inventory
WITH replication = {
    'class' : 'NetworkTopologyStrategy',
    'datacenter1' : 3
};

И этот CQL создает таблицу Cassandra по названию транспортных средств в ключевом пространстве инвентаря : ``

use inventory;

CREATE TABLE vehicles (
   vin text PRIMARY KEY,
   year int,
   make varchar,
   model varchar
);

5. Использование @DataCassandraTest ****

Давайте посмотрим, как мы можем использовать @DataCassandraTest в модульных тестах для тестирования уровня данных приложения.

** Аннотация @DataCassandraTest** импортирует необходимые модули автоматической настройки Cassandra, включая сканирование компонентов @Table и @Repository . В результате это позволяет @Autowire класс Repository .

Однако он не сканирует и не импортирует обычные bean-компоненты @Component и @ConfigurationProperties .

Кроме того, в JUnit 4 эту аннотацию следует использовать в сочетании с @RunWith(SpringRunner.class) .

5.1. Класс интеграционного теста

Вот класс InventoryServiceIntegrationTest с аннотацией @DataCassandraTest и репозиторием @Autowired:

@RunWith(SpringRunner.class)
@DataCassandraTest
@Import(CassandraConfig.class)
public class InventoryServiceIntegrationTest {

    @Autowired
    private InventoryRepository repository;

    @Test
    public void givenVehiclesInDBInitially_whenRetrieved_thenReturnAllVehiclesFromDB() {
        List<Vehicle> vehicles = repository.findAllVehicles();

        assertThat(vehicles).isNotNull();
        assertThat(vehicles).isNotEmpty();
    }
}

Мы также добавили простой метод тестирования выше.

Чтобы упростить выполнение этого теста, мы будем использовать тестовый контейнер DockerCompose, который устанавливает трехузловой кластер Cassandra:

public class InventoryServiceLiveTest {

    // ...

    public static DockerComposeContainer container =
            new DockerComposeContainer(new File("src/test/resources/compose-test.yml"));

    @BeforeAll
    static void beforeAll() {
        container.start();
    }

    @AfterAll
    static void afterAll() {
        container.stop();
    }
}

Вы можете найти файл compose-test.yml в проекте GitHub здесь .

5.2. Класс репозитория

Пример класса репозитория InventoryRepository определяет несколько пользовательских методов JPA :

@Repository
public interface InventoryRepository extends CrudRepository<Vehicle, String> {

    @Query("select * from vehicles")
    List<Vehicle> findAllVehicles();

    Optional<Vehicle> findByVin(@Param("vin") String vin);

    void deleteByVin(String vin);
}

Мы также определим уровень согласованности «local-quorum», который подразумевает строгую согласованность, добавив это свойство в файл application.yml :

spring:
  data:
    cassandra:
      request:
        consistency: local-quorum

6. Другие аннотации @DataXXXTest ****

Ниже приведены некоторые другие подобные аннотации для тестирования уровня базы данных любого приложения:

  • @DataJpaTest импортирует репозитории JPA , классы @Entity и т. д. ``
  • @DataJdbcTest импортирует репозитории Spring Data, JdbcTemplate и т. д.
  • @DataMongoTest импортирует репозитории Spring Data MongoDB, шаблоны Mongo и классы @Document.
  • @DataNeo4jTest импортирует репозитории Spring Data Neo4j, классы @Node
  • @DataRedisTest импортирует репозитории Spring Data Redis, @RedisHash

Пожалуйста, посетите документацию Spring для получения дополнительных тестовых аннотаций и подробной информации.

7. Заключение

В этой статье мы узнали, как аннотация @DataCassandraTest загружает несколько компонентов автоконфигурации Spring Data Cassandra. В результате он позволяет избежать загрузки многих нежелательных модулей контекста Spring.

Как всегда, полный исходный код доступен на GitHub .