2010-04-21 81 views
4

我们对相当大的Web应用程序使用Maven/Surefire和Spring/Hibernate事务测试。有138个测试*类,共运行1178个测试。Maven Spring测试在一起运行时失败,但单独成功(ehcache关闭,IllegalTransactionStateException)

一个简单的“MVN测试”将产生82个错误,其性质往往意味着腐败的应用程序上下文:

许多这样的:
IllegalTransactionStateException:预先绑定的JDBC Connection找到了!

其中的几个:
的NoSuchMethodError:org.hibernate.cache.CacheException(Ljava /郎/异常;)V

对于每一个测试失败,运行单独的测试类“MVN测试-Dtest = TestFailingClass“成功。事实上,使用-Dtest = TestClass1,TestClass2等“与我的所有测试类的各个子集成功或失败的方式不同,例如,仅运行失败的测试类成功出现0个错误。为了控制Surefire测试的课程顺序,我很难确定哪些测试课程似乎在不良状态下处于上下文状态。

我在寻找的是帮助确定什么是发生在某种确定性的方式,我当然可以看到从日志运行的测试顺序,但我无法可控地重现该顺序。怎么办吧...

+0

?你的测试是继承自AbstractJUnit4SpringContextTests还是AbstractTransactionalJUnit4SpringContextTests? – 2010-04-21 19:58:32

+0

Spring 2.5,JUnit 4。4,并且大部分是AbstractAnnotationAwareTransactionalTests,尽管我怀疑是有一些版本蠕变。较新的测试类可以从较新的Spring脚手架扩展。在这一点上,我还没有研究过所有的138个测试类。 – Mojo 2010-04-21 21:14:37

回答

2

事实上,问题来自一个腐败的Spring应用程序上下文。早期的测试之一是弄脏上下文并导致以下测试出错。

一个难题是试图控制测试顺序,同时发现造成麻烦的测试。

我能够通过使用Maven的日志来找到测试类运行的顺序,然后从顶部一次不包括测试。三十四个测试中,我找到了罪魁祸首。

这是一个名为TestSpringContexts的测试。在这些测试中添加@DirtiesContext解决了这个问题,但是通过从测试中去除对context.close()的调用也解决了这个问题。

我写了一篇博客文章对这里的过程,但是这是问题的要点是:你用哪个Spring和JUnit版本http://mojo.whiteoaks.com/2010/04/27/finding-the-test-that-corrupts-the-suite/

1

With no apparent means to control the order of classes tested by Surefire, I have a difficult time determining which of my test classes seem to be leaving the context in a bad state.

确实。运行测试的子集会产生不同的结果(从执行顺序的角度来看),这使得调试问题变得非常困难。

但你也许可以使用来自SUREFIRE-321补丁(运行测试按字母顺序),以得到较好的控制(检查的意见,海报之一正面临一个非常类似的问题,以你的)。

相关问题