Тестирование при весенней загрузке без влияния на базу данных - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь протестировать свой уровень обслуживания (фактически вставить) без какого-либо влияния на мою базу данных. здесь, в моем коде:

@SpringBootTest
@RunWith(SpringRunner.class)
@Transactional
public class StateServiceTest {

@Autowired
private StateService stateService;

@Test
public void createState() {
    State state = State.builder()
            .id(null)
            .name("testState")
            .code("21")
            .build();

    Object mCreatedState = stateService.create(state);
    assertThat(mCreatedState).isNotNull().isNotInstanceOf(Exception.class);
    }

}

use @ Transactional , вероятно, решил мою проблему, и тестовые данные не вставляются в базу данных, но по-прежнему влияют на мою базу данных.

это означает, что если вставленные данные существуют в базе данных или дублируются (для уникального столбца), я получил дублированный ключ записи ошибки.

Есть ли способ протестировать мой сервис и уровень dao без влияния на мою базу данных? или я должен использовать тестовую базу данных, например h2 (в памяти)?

Ответы [ 3 ]

1 голос
/ 02 августа 2020

Всегда лучше не трогать ни одну из существующих инфраструктур во время тестирования. Подключение к базам данных будет иметь не только неожиданное поведение, не основанное на предоставленных значениях bust также добавляет время к общему времени выполнения.

Если тестирование уровня DAO само по себе является вариантом использования, тогда go впереди H2 , что позволяет выполнять все операции с БД без каких-либо последствий. Кроме того, одновременное выполнение нескольких тестов целого набора тестов не влияет друг на друга. Всегда рекомендуется имитировать внешние службы.

1 голос
/ 03 августа 2020

Наконец, я нашел лучшее решение.

Прочитав разные заметки, я думаю, что лучшим решением будет: Не для использования в базах данных памяти, таких как H2 или Fon go и если вы действительно этого хотите, вы должны использовать Docker контейнер, как ваша основная база данных.

Это потому, что базы данных памяти могут иметь не все поведение, такое же, как ваша основная база данных, как показано ниже:

1- Postgres имеет мощные функции, такие как оконные функции и типы данных JSON, которые не поддерживаются H2

2- Например, мы хотели использовать функцию MySQL unix_timestamp (), чтобы не зависеть от различных часовых поясов, где наш MySQL серверы баз данных работают. Мы хотим предотвратить небольшие неточности. Но этой функции нет в H2, поэтому мы не могли их использовать

И ...

Но если мы используем ту же базу данных, что и основная база данных (Docker контейнер), наш тест настолько улучшен, и, наконец, мы предотвращаем появление большинства ошибок базы данных после сборки проекта или развертывания в основной (окончательной) базе данных.

Прочтите приведенные ниже ссылки, которые могут вам помочь:

1- https://phauer.com/2017/dont-use-in-memory-databases-tests-h2/

2- https://medium.com/@sanchezdale / using-a-containerized-database-for-testing-spring-boot-applications-56ad38d39e15

надеюсь на помогите кому-нибудь.

1 голос
/ 02 августа 2020

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

Один из вариантов, предоставляемых Spring, - это @TestPropertSource. здесь вы можете переопределить любое свойство, определить новые свойства или определить местоположение нового файла .properties / .yml.

Вы можете включить h2 в свой класс в качестве тестовой области, предоставить новый application-test.yml файл в папке src / test / resources. Определите там свойства источника данных, чтобы они указывали на базу данных h2, и продолжите тест.

Ниже приведены некоторые блоги, посвященные тому же:

Существует еще один способ, называемый TestContaniers, который раскручивает контейнер db. Я лично этим не пользовался, но читал об этом. Хорошая отправная точка, чтобы узнать о них больше:

...