#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» является значением по умолчанию для тестовой среды.. Посмотрим, смогу ли я найти время для его тестирования.