我们有一个奇怪的问题。我们正在使用自动测试工具。 DSL是在Scala中实现的。我们用这个工具测试的系统是用Java编写的,两个组件之间的接口是RMI。实际上,自动测试工具的界面部分也是Java(其余部分是Scala)。我们可以完全控制这些组件的源代码。
我们已经拥有数千个测试案例。我们每天晚上使用Jenkins在Linux服务器上自动执行这些测试用例。问题是我们偶尔会收到java.lang.NoClassDefFoundError
例外。当尝试从Scala代码访问Java工件时,通常会发生这种情况。
如果我们手动执行相同的测试用例,或检查下一次夜间运行的结果,那么通常问题会自动解决,但有时会在完全不同的地方再次发生。在某些运行的情况下,根本不会出现这样的问题。最大的问题是错误不可重现;此外,在自动运行的情况下,我们几乎没有关于确切情况的信息,只有测试用例和日志。
有人遇到过这样的问题吗?你知道怎么办吗?任何提示或信息都会有所帮助,而不仅仅是问题的解决方案。谢谢!
答案 0 :(得分:0)
我找到了错误的原因(99%肯定)。我们有以下2个Jenkins职位:
Job1
:执行经过测试的系统的完整干净版本,用Java编写,然后执行完全干净的DSL构建,最后执行测试用例。这是一项长期工作(约5小时)。Job2
:执行已测试系统的完整清理构建,然后在其上执行其他操作。 DSL没有涉及。这是一个较短的工作(约1小时)。我们为所有工作提供了一个Maven存储库。此外,被测组件的某些部分是两个组件之间接口的一部分。
考虑到时间戳,发生了以下情况:
Job1
执行了两个组件的完整构建,并启动了一个包含多个测试用例的测试套件,执行时间大约为半小时。Job2
启动了构建,它还重建了接口部分,包括由Job1
的垃圾收集器扫除的接口部分。Job1
到达了一个使用已经扫除的接口组件的测试用例。 解决方案如下:我们将Job2
移到了更早的时间;现在它在Job1
开始测试之前完成了工作。