`
leegorous
  • 浏览: 4034 次
  • 性别: Icon_minigender_1
  • 来自: 新会
最近访客 更多访客>>
社区版块
存档分类
最新评论

Grails Integration Testing中一个不显眼的特性

    博客分类:
  • web
阅读更多
Grails是鼓吹先做测试的,而其Integration Testing是最简单直接的测试,连壳都造好了,就等着填测试代码了。
不过Grails还不只是造了一个壳,还做了一些动作,在它的文档里面就有半句话描述了它还做了什么:“and clear out all the data from the database in between each test”。实在是太不起眼了,不过用起来又是何其的畅快啊。

在一个偶然的机会下,跑test case时调试进去了(完全是新手的行为),到断点之前插了一条数据,指明要flush,然后测试插入重复数据。这时,我想应该在数据库里面可以看到那条数据的,结果是什么都看不到的。甚至到验证都通过了,最后是没有把插进去的数据清空的。理所当然的以为应该可以看到那条数据的,结果还是没有。

在各路高手的讨论和指导之下,终于知道grails干了些什么了。
文档里面那么隐晦的半句话,其实没那么简单哦。首先它为每个有数据库操作的case建立transaction,在跑的时候,其数据库操作都没有真正 commit,case结束后,transaction roll back。如果跑的时候断点调试,数据库的隔离级别设成Read Uncommitted,这时是可以看到插进去的那条数据的。当然这是按表像猜测的行为实现。
而且在case抛异常时这个机制还是有效的。

这个不显眼的特性太好了,不用过于担心数据残留的问题。最重要是:省事。
不明白为什么文档不写清楚点?也许这是故意的……

--
Copy from my base
2
2
分享到:
评论
1 楼 leegorous 2008-05-09  
以下的做法在写case时是相当不对的:
在case里用一个static的field指向一条已经预先插进数据库的记录,
第一次运行没错,但后面的运行都报错(unique约束)了。不是数据会被自动删除吗?
是的,但static的field所指向的记录不在保护范围内。

所以,最后不要用static field指向记录,即使愿意是想在不同的testcases类之间共享一条记录,最简单的想法是static field了,但还是有别的做法可以实现的。

相关推荐

Global site tag (gtag.js) - Google Analytics