4

私は本「GrailsInAction 」からグライルを学び、例から統合テストを実行しようとしています。この本では、各統合テスト機能は、各テストが終了するときにその操作をロールバックする必要があると述べています。各トランザクションをロールバックしていません(データベースがダーティであると終了したときのように)。理由を調べてみたところ、「transactional」というプロパティが見つかりました。伝えられるところでは、このプロパティをtrueに設定すると、テストケースがトランザクションになりますが、動作が変わるようには見えません。以下に単体テストのコードを含めました。

私はgrails1.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
4

2 に答える 2

9

テスト(およびサービス)はデフォルトでトランザクションであるため、通常は静的transactionalプロパティを指定するのは。の場合のみですfalse。方言を指定していない場合は、MySQLが自動検出されている可能性がありますが、テーブルはデフォルトのエンジン(おそらくMyISAM)を使用して作成されます。トランザクションではないMyISAMテーブル。MySQLを使用するときは、必ずInnoDB方言を指定してください。

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'
}
于 2011-04-18T02:30:48.067 に答える
0

私も同じ問題を抱えていました。

  • 私の場合、

環境:STS(IDE)、mysql(データベース)

grails統合テストは、ご存知のとおりロールバックする必要があります(デフォルト)。

「grails統合テスト」は、各テストが終了するたびにロールバックを試みます。

データベースがトランザクションをサポートしていない場合..?

Type = InnoDBオプションを使用して、データベーステーブルの自動作成を直接テーブルを作成するように変更します。だから私はそれを解決することができます。

テーブルsomething(...)を作成しますType = InnoDB;

  • 私は韓国の学生です。私は少し英語を話すことができます。私を理解してみてください。
于 2011-09-02T06:42:17.477 に答える