我有两台机器,一台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)
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)
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"
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"
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
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
我在两台计算机上对版本控制进行了干净的结帐,并删除了文件夹~/.m2
和~/.ivy2
,以避免任何不确定性。
当我在CI服务器上运行grails test-app
时,测试似乎失败了。当我们的DEV系统上的所有人都在相同的情况下通过。
CI grails test-app
Tests Completed in 28213ms ...
-------------------------------------------------------
Tests passed: 14
Tests failed: 6
-------------------------------------------------------
DEV grails test-app
Tests Completed in 25889ms ...
-------------------------------------------------------
Tests passed: 20
Tests failed: 0
-------------------------------------------------------
当我查看从测试输出中获取的错误消息时,我可以看到如下内容:
junit.framework.AssertionFailedError: expected:<1> but was:<0>
not-null property references a null or transient value
据我所知,测试在逻辑上是正确的,他们不应该这样做。得到这些错误,特别是当几个测试得到&#34;瞬态值&#34;错误不会将任何内容存储到数据库中!
对我来说,似乎问题出在hibernate / memory-database / test阶段的组合中。
导致此问题的环境之间存在一些差异。有没有人有任何关于如何进一步调试问题的提示?
再次感谢!
修改
好的,所以这就是我的尝试:
~/.m2
,~/.ivy2
,~/.grails
但我仍然看到我的CI环境上的测试失败,但是在开发机器上没有。
编辑
一些新的发展..
我尝试只运行CI上失败的测试,似乎在运行grails test-app :integration path.to.failing.tests
时,所有 PASS !运行grails test-app会导致这些测试失败! :(
我完全感到困惑,并且对这里发生的事情一无所知......
答案 0 :(得分:7)
我几乎可以保证这是一个测试污染问题,并且不同的服务器以不同的顺序运行测试。
测试污染的最大线索始终是您可以自己成功运行测试,但是当您首先运行其他测试时,它会失败。
我已经多次发生这种情况,我在一次测试中弄乱了类的metaClass或注入弹簧单例(如服务bean),忘了清理它,并且有其他测试受到影响。观察运行测试的输出并比较它们以确保它们在两个盒子上以完全相同的顺序运行。如果它们不是,那就是测试订购问题。
找出哪些测试交互得很糟糕的“最简单”的方法是运行grails test-app
并按照它们在失败的框中发生的顺序传递每个测试名称(我通常使用文本编辑器来从先前的运行中切出测试名称并将它们连接在一起,这样我知道我的顺序是相同的。)
另一个潜在的问题是,如果一台机器使用mysql并且您错误配置为将“myisam”作为默认存储引擎而不是“innodb”(或支持事务的其他引擎)。你可以输入“show engines;”在mysql实例上查看默认的引擎。听起来你正在使用hsqldb或其他内存数据库进行测试,所以这可能不是你的问题。