使用数据库和实体管理器时,Junit 测试随机失败
我尝试写一个大的测试类。
我正在使用 Junit、Hibernate、TopLink 和 H2 数据库。在此之前我使用EJB3Unit(包括Hibernate和H2)。
我的测试类有 57 个测试方法。如果我立即运行所有测试,则随机的一个或多个测试会失败。如果我单独运行每个测试,则不会出现错误。
有谁知道出了什么问题吗?我怎样才能防止这种情况发生?
- 对于每种测试方法,我都会创建一个具有不同名称的新内存数据库。
- 我创建了一个新的entitymanagarfactory 和entitymanagar 实例。
- 我已经禁用了二级缓存。
- 我通过脚本创建所有表(没有发生错误,因此数据库非常新鲜)。
- 我做了一些数据库操作并进行测试。
- 我清除会话和他们。
- 我删除内存数据库中的所有对象
- 我关闭数据库
- 我关闭em和emf。
我还需要做更多吗?
多谢...
I try to write an big test class.
I'm using Junit, Hibernate and TopLink and H2 database. Before this I used EJB3Unit (including Hibernate and H2).
My test class has 57 test methods. If I run all test at once randomized one or more test fails. If I run each test alone, I get no error.
Has anyone an idea what's going wrong? And how I can prevent this?
- For each test method I create a new in memory database with a different name.
- I create a new entitymanagarfactory and entitymanagar instance.
- I've disabled second level caching.
- I create all table via script (no error occurs so database is really fresh).
- I do some db actions and test.
- I clear session and em.
- I drop all object in my in-memory database
- I shut down the database
- I close em and emf.
Have I to do more?
Thanks a lot...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
看来测试之间存在依赖性。
理想情况下,您应该在每次测试后使用tearDown方法将数据库恢复到其原始状态(在JUnit 4中,使用@After注释)。
如果您已经这样做了,那么依赖性就会更加微妙。为了找出其原因,我建议您开始对测试进行二分搜索:注释掉一半的测试。如果随机失败仍然存在,则注释掉剩余一半的一半(依此类推)。如果故障消失,则问题出在另一半:取消注释并注释掉另一半。这个过程会很快收敛。
狩猎好。
It seems that there is dependency among the tests.
ideally you should restore the database to its original state after each test by using a tearDown method (in JUnit 4, use the @After annotation).
If you're already doing that then the dependency is more subtle. To find out its cause I suggest you start doing a binary search on the tests: comment out half of your tests. If the random failure persists then comment out half of the remaining half (and so on). If the failure disappears then the problem is in the other half: uncomment and comment out the other half. This process will converge quite quickly.
Good hunting.
依赖性是这种随机失败的可能性。
另一个原因可能是集合中元素的顺序。有一次我正在编写一个测试并依赖于第一个元素。它没有排序,所以我不确定我要问的对象是否总是相同的。
Dependencies are a possibility for this random failing.
An other reason can be the order of elements in a collection. Once i was writing a test and depended on the first element. It was not sorted so i was not sure that the object i was asking was always the same.