【问题标题】:Grails test-app fails on CI server, but not on developer machineGrails 测试应用程序在 CI 服务器上失败,但在开发人员机器上失败
【发布时间】:2011-08-29 12:01:01
【问题描述】:

我有两台机器,一台 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 圣杯

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 时,6 次测试似乎失败了。当它们在我的 DEV 系统上全部通过时。

CI grails 测试应用

Tests Completed in 28213ms ...
-------------------------------------------------------
Tests passed: 14
Tests failed: 6
------------------------------------------------------- 

DEV grails 测试应用

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

据我所知,这些测试在逻辑上是正确的,它们不应该出现这些错误,尤其是当几个得到“瞬态值”错误的测试没有将任何内容存储到数据库时!

对我来说,问题似乎在于休眠/内存数据库/测试阶段的组合。

导致此问题的环境之间必须存在一些差异。有没有人有任何提示我可以如何继续以进一步调试问题?

再次感谢!

编辑

好的,这就是我尝试过的:

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

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

编辑

一些新的发展..

我尝试只运行在 CI 上失败的测试,似乎在运行 grails test-app :integration path.to.failing.tests 时它们都PASS!在运行 grails test-app 时会导致这些测试FAIL! :(

我完全不知道这里发生了什么......

【问题讨论】:

标签: java hibernate grails maven


【解决方案1】:

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

测试污染的最大线索总是当你自己可以成功运行测试,但当你先运行其他测试时,它会失败。

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

找出哪些测试交互不良的“最简单”方法是运行grails test-app,并按照它们在失败框中发生的顺序传递每个测试名称(我通常使用文本编辑器来切出之前运行的测试名称并将它们连接在一起,所以我知道它们的顺序相同)。

另一个潜在问题是,如果一台机器正在使用 mysql,而您将“myisam”配置为默认存储引擎而不是“innodb”(或另一个支持事务的引擎)。您可以键入“显示引擎;”在 mysql 实例上查看默认的引擎。听起来您正在使用 hsqldb 或其他内存数据库进行测试,所以这可能不是您的问题。

【讨论】:

  • 非常有用的帖子!生病调查它!是的,我正在使用内存数据库进行测试。
  • 看来你说的很对。以与开发机器相同的顺序进行测试就像一个魅力。现在我只需要比较两个运行顺序并尝试找出罪魁祸首。
  • 这对我来说总是以二进制搜索结束,我在失败测试之前运行前半部分测试,如果没有失败,则运行第二半部分测试。继续将测试分成两半,直到您发现在与失败的测试隔离运行时是哪个其他测试类导致了问题。然后,当您确定罪魁祸首时,尝试注释掉该类中的一半测试,直到找到错误的测试方法(有时它在设置中)。冲洗,重复直到你确定你留下了什么污染。
  • 感谢您带领我进行污染测试,这反过来又帮助我弄清楚我实际上是在 grails 测试框架中看到了一个错误。这个错误导致测试数据泄漏,如果按特定顺序运行,反过来又导致我的测试失败。有关此错误的更多信息:stackoverflow.com/questions/6080568/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2017-10-09
  • 2011-12-10
  • 2012-06-01
  • 2019-04-19
相关资源
最近更新 更多