Grails test-app在CI服务器上失败,但在开发者机器上失败

net*_*ain 3 java grails hibernate maven

我有两台机器,一台Continuus集成服务器和一台开发机器.

两台机器运行相同版本的java,maven和grails,两者都运行Ubuntu.我能想到的唯一区别是CI处于虚拟化环境中.

一些证据:

CI java -version

java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode) 
Run Code Online (Sandbox Code Playgroud)

DEV java -version

java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode) 
Run Code Online (Sandbox Code Playgroud)

CI mvn -version

Apache Maven 2.2.1 (rdebian-1)
Java version: 1.6.0_24
Java home: /usr/lib/jvm/java-6-sun-1.6.0.24/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-31-server" arch: "amd64" Family: "unix" 
Run Code Online (Sandbox Code Playgroud)

DEV mvn -version

Apache Maven 2.2.1 (rdebian-1)
Java version: 1.6.0_24
Java home: /usr/lib/jvm/java-6-sun-1.6.0.24/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-31-generic" arch: "amd64" Family: "unix" 
Run Code Online (Sandbox Code Playgroud)

CI grails

Welcome to Grails 1.3.7 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /usr/local/lib/grails-1.3.7 
Run Code Online (Sandbox Code Playgroud)

DEV grails

Welcome to Grails 1.3.7 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /home/netbrain/dev/apps/grails-1.3.7 
Run Code Online (Sandbox Code Playgroud)

我从两台机器上的版本控制进行了干净的检查,并删除了文件夹~/.m2,~/.ivy2以避免任何不确定性.

当我grails test-app在我的CI服务器上运行6时,测试似乎失败了.当我们的DEV系统上的所有人都通过同样的情况.

CI grails test-app

Tests Completed in 28213ms ...
-------------------------------------------------------
Tests passed: 14
Tests failed: 6
------------------------------------------------------- 
Run Code Online (Sandbox Code Playgroud)

DEV grails test-app

Tests Completed in 25889ms ...
-------------------------------------------------------
Tests passed: 20
Tests failed: 0
------------------------------------------------------- 
Run Code Online (Sandbox Code Playgroud)

当我看到从测试输出中获取的错误消息时,我可以看到如下内容:

junit.framework.AssertionFailedError: expected:<1> but was:<0>
not-null property references a null or transient value
Run Code Online (Sandbox Code Playgroud)

据我所知,测试在逻辑上是正确的,他们不应该"得到这些错误,特别是当几个获得"瞬态值"错误的测试没有存储到数据库的任何东西时!

对我来说,似乎问题出在hibernate/memory-database/test阶段的组合中.

导致此问题的环境之间存在一些差异.有没有人有任何关于如何进一步调试问题的提示?

再次感谢!

编辑

好的,所以这就是我试过的:

  1. 删除文件夹~/.m2,~/.ivy2,~/.grails
  2. 运行grails clean
  3. 运行grails test-app

但我仍然看到我的CI环境上的测试失败,但在开发机器上却没有.

编辑

一些新的发展..

我尝试只运行CI上失败的测试,似乎在运行时grails test-app :integration path.to.failing.tests他们都通过了!运行grails test-app导致那些测试失败!:(

我完全感到困惑,对这里发生的事情一无所知......

Ted*_*eid 7

我几乎可以保证这是一个测试污染问题,不同的服务器以不同的顺序运行测试.

测试污染的最大线索始终是您可以自己成功运行测试,但是当您首先运行其他测试时,它会失败.

我已经多次发生这种情况,我在一次测试中弄乱了类的metaClass或注入弹簧单例(如服务bean),忘了清理它,并且受到其他测试的影响.观察运行测试的输出并比较它们以确保它们在两个盒子上以完全相同的顺序运行.如果它们不是,那就是测试订购问题.

找出哪些测试交互得很糟糕的"最简单"的方法是运行grails test-app并传入每个测试名称,其顺序与它们在失败的框中发生的顺序相同(我通常使用文本编辑器来切割以前的测试名称)运行并将它们连接起来,所以我知道我按照相同的顺序将它们放在一起).

另一个潜在的问题是,如果一台机器正在使用mysql,并且您错误配置为将"myisam"作为默认存储引擎而不是"innodb"(或支持事务的其他引擎).你可以输入"show engines;" 在mysql实例上查看默认的引擎.听起来你正在使用hsqldb或其他内存数据库进行测试,所以这可能不是你的问题.