2016-02-02 6 views
0

Я пытался развернуть приложение Grails (версия 2.2.2) в Jenkins (версия 1.638). Он выполняет clean, test-app -Dgrails.env=XXX и war команд.Тесты интеграции Grails на Jenkins

clean и war работал отлично. Для test-app -Dgrails.env=XXX блок проверки работоспособности работал нормально, каждый тест прошел. Однако большинство тестов интеграции не удалось. Кажется, что классы домена в контроллере не могут получить данные. Другими словами, методы get() или list() не вернули правильные записи. Я предполагаю, что база данных подключена правильно, потому что вывод на консоль не стал жаловаться на проблему подключения. Интеграционные тесты хорошо работают на моей локальной машине с одним и тем же источником данных.

Ошибки при тестировании выглядят следующим образом: size() всегда равен 0. Это тест интеграции контроллера. resultsget(), list() или createCriteria().list{} методы классов домена в контроллере.

results.size() == 9 
|  |  | 
[]  0  false 

Ниже приведен код в DataSource.groovy. Я пробовал оба testCI и testCI2. Обе настройки не помогают. Честно говоря, я мало что знаю о pool properties. Я просто скопировал его.

hibernate { 
cache.use_second_level_cache = true 
cache.use_query_cache = false 
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' 
} 

environments { 
testCI { 
    dataSource { 
     dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', '' 
     url = "jdbc:mysql://localhost:3306/build_db" // For non network testing 
     driverClassName = "com.mysql.jdbc.Driver" 
     username ="build" 
     password = "build" 
     pooled=true 
     properties { 
      maxActive = -1 
      minEvictableIdleTimeMillis=1800000 
      timeBetweenEvictionRunsMillis=1800000 
      numTestsPerEvictionRun=3 
      testOnBorrow=true 
      testWhileIdle=true 
      testOnReturn=true 
      validationQuery="SELECT 1" 
     } 
    } 
} 

testCI2 { 
    dataSource { 
     dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', '' 
     url = "jdbc:mysql://localhost:3306/build_db" // For non network testing 
     driverClassName = "com.mysql.jdbc.Driver" 
     username ="build" 
     password = "build" 
    } 
} 
} 

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

У кого-нибудь есть идеи по этому поводу? Огромное спасибо!!

+0

Вы можете поделиться с нами своим "DataSource.groovy"? Просто чтобы убедиться, что ваша тестовая база данных настроена правильно (обычно запускаются интеграционные тесты в память 'h2' и проверяются на нее) – defectus

+0

Спасибо @defectus. Я просто поделился DataSource.groovy. Я использую базу данных 'mysql' вместо' h2'. Я попробую h2, если придется. – johanzhou

+0

Если на вашем локальном компьютере не установлены jenkins, вы не используете одну и ту же базу данных, поскольку используете localhost как имя хоста. Поэтому проверьте, есть ли у вас требуемые данные в базе данных вашего сервера, и есть ли записи, которые вы запрашиваете, – droggo

ответ

0

IIRC, модульные тесты выполняются в представлении GORM на основе памяти.

Для тестов интеграции вам понадобится реальная (из вашего примера, MySQL) база данных.

Установлен ли MySQL на сервере Jenkins - это локальный хост при выполнении ваших тестов интеграции.

+0

Спасибо за ваш ответ. База данных MySQL устанавливается на хост в той же локальной сети сервера Jenkins. Я создал туннель, так что я могу подключиться к базе данных MySQL с помощью 'localhost' на моей локальной машине. В любом случае, ваш ответ напоминает мне, что база данных MySQL не находится на сервере Jenkins. Проблема решена, когда я изменяю 'localhost' на ip-адрес. – johanzhou

Смежные вопросы