Тест интеграции Grails НЕ ОТДАЕТСЯ - PullRequest
4 голосов
/ 18 апреля 2011

Я изучаю Grails из книги " Grails In Action " и пытаюсь запустить интеграционные тесты из примеров.В книге говорится, что каждая функция интеграционного теста должна откатывать свои операции после завершения каждого теста.Он НЕ откатывает каждую транзакцию (так как, когда я заканчиваю, база данных грязная).Я попытался выяснить почему и нашел найденное свойство под названием «транзакционный».Предположительно вы устанавливаете для этого свойства значение true, и тест будет выполнен транзакционным, но, похоже, это не изменит его поведение.Я включил код для модульных тестов ниже.

Я использую Grails 1.3.7 и подключаюсь к базе данных MySql.Тесты проходят успешно, просто не откатывается.Что-то не так в этом тесте интеграции, что он пропускает откат?

UserIntegrationTests.groovy:

package com.grailsinaction

import framework.TestTools

class UserIntegrationTests extends GroovyTestCase {
    static transactional = true

    protected void setUp() {
        super.setUp()
    }

    protected void tearDown() {
        super.tearDown()
    }

    void testCreateUser() {
        TestTools.banner(log, "testCreateUser()")

        def user = new User(userId:"joe", password:"secret")
        assertNotNull user.save()
        assertNotNull user.id

        def foundUser = User.get(user.id)
        assertEquals 'joe', foundUser.userId
    }

    void testSaveAndUpdate() {
        TestTools.banner(log, "testSaveAndUpdate()")

        def user = new User(userId:"joe2", password:"secret")
        assertNotNull user.save()

        def foundUser = User.get(user.id)
        foundUser.password = 'sesame'
        foundUser.save()

        def editedUser = User.get(user.id)
        assertEquals 'sesame', editedUser.password
    }

    void testSaveThenDelete() {
        TestTools.banner(log, "testSaveThenDelete()")

        def user = new User(userId: 'joe3', password: 'secret')
        assertNotNull user.save()

        def foundUser = User.get(user.id)
        foundUser.delete()
        assertFalse User.exists(foundUser.id)
    }

    void testValidation() {
        TestTools.banner(log, "testValidation()")

        def user = new User(userId: 'chuck-norris', password: 'tiny')
        assertFalse user.validate()
        assertTrue user.hasErrors()

        def errors = user.errors
        assertNotNull errors

        errors.allErrors.each {
            log.info("field: ${it.field}, code=${it.code}, rejected=${it.rejectedValue}")
        }
    }
}

User.groovy

package com.grailsinaction

class User {
    String userId
    String password
    Date dateCreated
    Profile profile

    static constraints = {
        userId(size: 3..20, unique: true)
        password(size: 6..8, validator: {password, user ->
            return (password != user.userId)
        })
        dateCreated()
        profile(nullable: true)
    }

    static mapping = {
        profile lazy: false
    }

    static hasMany = [posts : Post]
}

Журнал выполнения теста

Testing started at 8:28 PM ...
Welcome to Grails 1.3.7 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: C:\Users\jmquigley\workspace\apps\Grails\grails-1.3.7
Base Directory: C:\Users\jmquigley\workspace\samples\lang-grails\hubbub
Resolving dependencies...
Dependencies resolved in 963ms.
Running script C:\Users\jmquigley\workspace\apps\Grails\grails-1.3.7\scripts\TestApp.groovy
Environment set to test
  [groovyc] Compiling 1 source file to C:\Users\jmquigley\workspace\samples\lang-grails\hubbub\target\classes
    [mkdir] Created dir: C:\Users\jmquigley\workspace\samples\lang-grails\hubbub\target\test-reports\html
    [mkdir] Created dir: C:\Users\jmquigley\workspace\samples\lang-grails\hubbub\target\test-reports\plain
Starting integration test phase ...
  [groovyc] Compiling 1 source file to C:\Users\jmquigley\workspace\samples\lang-grails\hubbub\target\classes
  [groovyc] Compiling 1 source file to C:\Users\jmquigley\workspace\samples\lang-grails\hubbub\target\classes
[INFO ]20110417@20:28:42,959:grails.spring.BeanBuilder: [RuntimeConfiguration] Configuring data source for environment: TEST
  [groovyc] Compiling 1 source file to C:\Users\jmquigley\workspace\samples\lang-grails\hubbub\target\test-classes\integration
-------------------------------------------------------
Running 4 integration tests...
Running test com.grailsinaction.UserIntegrationTests...
--Output from testCreateUser--
[INFO ]20110417@20:28:46,897:groovy.util.GroovyTestCase: Test Case: testCreateUser()
--Output from testSaveAndUpdate--
[INFO ]20110417@20:28:47,534:groovy.util.GroovyTestCase: Test Case: testSaveAndUpdate()
--Output from testSaveThenDelete--
[INFO ]20110417@20:28:47,568:groovy.util.GroovyTestCase: Test Case: testSaveThenDelete()
--Output from testValidation--
[INFO ]20110417@20:28:47,642:groovy.util.GroovyTestCase: Test Case: testValidation()
[INFO ]20110417@20:28:47,668:groovy.util.GroovyTestCase: field: password, code=size.toosmall, rejected=tiny
null
PASSED
Tests Completed in 1173ms ...
-------------------------------------------------------
Tests passed: 4
Tests failed: 0
-------------------------------------------------------
[junitreport] Processing C:\Users\jmquigley\workspace\samples\lang-grails\hubbub\target\test-reports\TESTS-TestSuites.xml to C:\Users\JMQUIG~1\AppData\Local\Temp\null90011239
[junitreport] Loading stylesheet C:\Users\jmquigley\workspace\apps\Grails\grails-1.3.7\lib\junit-frames.xsl
[junitreport] Transform time: 415ms
[junitreport] Deleting: C:\Users\JMQUIG~1\AppData\Local\Temp\null90011239
Tests PASSED - view reports in target\test-reports
Application context shutting down...
Application context shutdown.

Process finished with exit code 0

Ответы [ 2 ]

9 голосов
/ 18 апреля 2011

Тесты (и службы) по умолчанию являются транзакционными, поэтому обычно статическое свойство transactional указывается только тогда, когда оно false. Если вы не указали диалект, он, вероятно, автоматически обнаруживает MySQL, но затем таблицы создаются с использованием механизма по умолчанию, который, вероятно, является MyISAM. Таблицы MyISAM, которые не являются транзакционными. Обязательно указывайте диалект InnoDB всякий раз, когда вы используете MySQL, например,

test {
   dataSource {
      dialect= org.hibernate.dialect.MySQLInnoDBDialect
      driverClassName = 'com.mysql.jdbc.Driver'
      username = '...'
      password = '...'
      url = '...'
      dbCreate = 'update'
   }
}

или если вы используете MySQL для всех сред, вы можете переместить его на верхний уровень, например,

dataSource {
   pooled = true
   dialect = org.hibernate.dialect.MySQLInnoDBDialect
   driverClassName = 'com.mysql.jdbc.Driver'
}
0 голосов
/ 02 сентября 2011

У меня была такая же проблема.

  • В моем случае

среда: STS (IDE), mysql (база данных)

Тест интеграции Grails должен откатываться, как вы знаете (по умолчанию).

«Тест интеграции Grails» попытаться выполнить откат после завершения каждого теста.

если ваша база данных не поддерживает транзакции ..?

Я изменяю автоматическое создание таблицы базы данных на непосредственное создание таблицы с параметром Type = InnoDB. Так что я могу решить это.

создать таблицу чего-либо (...) Type = InnoDB;

  • Я корейский студент. Я немного говорю по-английски. Пожалуйста, попытайтесь понять меня.
...