Пружинная проверка потока интеграции - PullRequest
2 голосов
/ 13 мая 2019

В настоящее время я пишу тест интеграции Spock для моего приложения Spring.

Я хотел бы использовать @Stepwise для выполнения теста, который взаимодействует с базой данных, а затем получить следующую сборку теста.поверх данных, оставленных после первого теста.

К сожалению, кажется, что для каждого метода теста запускается новая транзакция, таким образом, очищаются данные, на которых я должен основываться.Rollback(false) не предотвращает такое поведение, так как вся транзакция отбрасывается AFAIK.

Вот пример, MyUserService взаимодействует с @Repository -интерфейсом.

@Stepwise
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
class MyServiceImplIntegrationFlowSpec extends Specification {

  @Autowired
  @Subject
  MyUserService myUserService

  @Shared
  String userId

  void "create user"() {

    when:
    userId = myUserService.createUser()

    then:
    userId
  }

  void "change user permission"() {

    when:
    myUserService.changePermission(userId, "read")

    then:
    myUserService.fetchPermission() == "read"
  }
}

Какможно ли повторно использовать данные, созданные предыдущим методом тестирования, как это обычно делается с @Stepwise в сочетании с операциями с базой данных?

1 Ответ

1 голос
/ 15 мая 2019

Среда Spring Test по умолчанию откатывает данные каждого метода тестирования.Вы можете изменить это поведение по умолчанию, добавив аннотацию @Commit к каждому из ваших методов тестирования, где вы хотите сохранить изменения в базе данных.Если весь набор тестов должен фиксировать данные в базе данных, я думаю, вы можете поместить аннотацию @Commit также на уровне класса.

См. Ссылку https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testing-tx

В ней говорится:

Одной из распространенных проблем в тестах, которые обращаются к реальной базе данных, является их влияние на состояние постоянного хранилища.Даже когда вы используете базу данных разработки, изменения в состоянии могут повлиять на будущие тесты.Кроме того, многие операции, такие как вставка или изменение постоянных данных, не могут быть выполнены (или проверены) вне транзакции.

и продолжается описание с помощью

Каркас TestContextрешает эту проблему. По умолчанию платформа создает и откатывает транзакцию для каждого теста .Вы можете написать код, который может предполагать существование транзакции.Если вы вызываете транзакционно проксируемые объекты в своих тестах, они ведут себя правильно, в соответствии с их настроенной транзакционной семантикой.Кроме того, если метод теста удаляет содержимое выбранных таблиц во время работы в транзакции, управляемой для теста, транзакция по умолчанию откатывается, и база данных возвращается в свое состояние до выполнения теста.Транзакционная поддержка предоставляется тесту с использованием bean-компонента PlatformTransactionManager, определенного в контексте приложения теста.

Если вы хотите зафиксировать транзакцию (необычно, но иногда полезно, когда вы хотите, чтобы определенный тест заполнял или изменял базу данных), вы можете указать платформе TestContext заставить транзакцию совершать транзакцию вместо отката, используя аннотацию @ Commit .

Ваш тестовый пример может выглядеть как

@Stepwise
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
@Commit // if you want all test methods to commit to the database
class MyServiceImplIntegrationFlowSpec extends Specification {

  @Autowired
  @Subject
  MyUserService myUserService

  @Shared
  String userId

  @Commit // if a single test needs to commit to the database
  void "create user"() {

    when:
    userId = myUserService.createUser()

    then:
    userId
  }

  void "change user permission"() {

    when:
    myUserService.changePermission(userId, "read")

    then:
    myUserService.fetchPermission() == "read"
  }
}
...