Grails. поддельные данные из модульного теста доступны в интеграционном тесте

#unit-testing #grails #groovy #integration-testing

#модульное тестирование #grails #groovy #интеграционное тестирование

Вопрос:

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

Однако меня немного смущает то, что, похоже, модульный тест, в котором я издевался над некоторыми данными mockDomain(Media.class,[new Movie(...)]) , все еще присутствует и доступен в других тестах, даже в интеграционных тестах.

Это ожидаемое поведение? почему платформа тестирования не выполняет очистку после себя для каждого теста?

Редактировать

Действительно странно, в документации указано, что:

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

Однако в моем интеграционном тесте у меня есть следующий код

     protected void setUp() {
      super.setUp()
      assertEquals("TEST POLLUTION!",0,Movie.count())
      ...
    }
  

Который выдает мне результат:

 TEST POLLUTION! expected:<0> but was:<1>
  

Это означает, что данные присутствуют, когда их не должно быть!

Просматривая данные, которые присутствуют в Movie.list (), я нахожу, что данные соответствуют данным, установленным в предыдущем тесте (модульный тест)

 protected void setUp() {
    super.setUp()

    //mock the superclass and subclasses as instances
    mockDomain(Media.class,[
            new Movie(id:1,name:'testMovie')
    ])
    ...
}
  

Есть идеи, почему у меня возникают эти проблемы?

Комментарии:

1. Создал простое тестовое приложение с grails, где я мог бы воссоздать проблему, с которой я столкнулся в своем приложении. Итак, я сообщил об этом как об ошибке @ jira.grails.org/browse/GRAILS-7514

2. Я получаю тот же сбой теста в вашем примере приложения на Grails 1.3.7 Java 1.6.0_25

3. Новая ссылка на GRAILS-7514: github.com/grails/grails-core/issues/5842

Ответ №1:

Также возможно, что загрязнение находится в тестовой базе данных. Проверьте DataSources.groovy , чтобы увидеть, что используется для тестовой среды. Если вы настроили его на использование базы данных, для которой dbCreate установлено значение, отличное от "create-drop" , также может отображаться любое предыдущее содержимое базы данных.

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

Мы столкнулись с этой проблемой, поскольку для нашей тестовой среды было установлено значение иметь dbCreate as "update" . Меня озадачило, почему это было установлено для интеграционных тестов, поэтому я переключился на использование dbCreate as "create-drop" и убедился, что при запуске наборов тестов мы начинали с чистой базы данных.

Комментарии:

1. хм, было бы интересно перейти на create-drop в моем тестовом приложении и посмотреть, по-прежнему ли модульные тесты завершаются неудачей. хотя странно, почему «update» является значением по умолчанию для тестовой среды.. Посмотрим, смогу ли я найти время для его тестирования.