Unit testing 为什么我应该避免使用DbUnit来测试MySQL?
我最近参与了一些使用PHPUnit的TDD。 我必须测试一个数据库驱动的应用程序,并阅读有关DbUnit扩展的文章,我计划在未来几周研究并实现它 然而,我自己也遇到过这个问题——塞巴斯蒂安·伯格曼(Sebastian Bergmann)——他有一张题为“如果可以,请避免对MySQL进行测试”的幻灯片,这让我对自己的行为产生了一些怀疑 有人能解释为什么我不应该测试MySQL吗 谢谢两个原因:Unit testing 为什么我应该避免使用DbUnit来测试MySQL?,unit-testing,tdd,phpunit,dbunit,Unit Testing,Tdd,Phpunit,Dbunit,我最近参与了一些使用PHPUnit的TDD。 我必须测试一个数据库驱动的应用程序,并阅读有关DbUnit扩展的文章,我计划在未来几周研究并实现它 然而,我自己也遇到过这个问题——塞巴斯蒂安·伯格曼(Sebastian Bergmann)——他有一张题为“如果可以,请避免对MySQL进行测试”的幻灯片,这让我对自己的行为产生了一些怀疑 有人能解释为什么我不应该测试MySQL吗 谢谢两个原因: 它很慢(单元测试需要很快) 它增加了超出您控制范围的额外故障点(当DB连接失败时,测试真的失败了吗?)
- 它很慢(单元测试需要很快)
- 它增加了超出您控制范围的额外故障点(当DB连接失败时,测试真的失败了吗?)
- “伙计,这东西跑得太慢了……”
- “也许我只能跑其中的几个……我以后再跑其余的”
- 在这一点上,我们知道以后永远不会到来
- “嘿,我的上一次提交没有破坏任何东西,我根本没有运行任何测试!”
- “我到底为什么要经营它们?”
总的来说,您的方法似乎是正确的——我不会将测试转移到SQLite。正如我所建议的,使用集成测试套件测试数据库层(这样它可以与常规的单元测试套件分开运行)。我使用DbUnit测试我的模型(说到MVC,包括ORM模型),因为它们与数据库密切相关。对于其他一切(主要是控制器),我都使用模拟对象 单元测试的基本思想是一次只测试一个应用程序代码单元(类),因此最好避免使用DB,除非代码直接使用DB
当然,表现也很重要。例如,我对模型进行了约500次测试,几乎所有模型都使用DB和Fixture。在一台速度相当快的计算机上执行所有这些测试大约需要30-40秒。代码覆盖率报告生成大约需要一分钟。我完全不同意Sebastian Bergmann编写的幻灯片33的标题 (因为幻灯片上的信息很容易被误解,我很抱歉 (当然,他在演讲中解释了真正的含义) 正如他在介绍中所说的那样,调试很糟糕,但测试很困难 如果真实环境使用mySQL,您必须对mySQL进行测试。否则,您将发现自己正在调试SQLite和mySQL之间的区别 我相信他的方向是面向开发人员而不是面向单元测试人员的,从这个意义上说,我还建议开发人员尽可能地保持代码数据库中立。它将提高项目整个生命周期的质量,而不仅仅是单元测试人员。它甚至可以保护mySQL本身的功能改进。(过去有很多问题) 但是当测试一段使用SQL的代码时,无论您已经做了哪些其他测试,您都必须根据实际情况对其进行测试 我的做法是创建数据库连接的抽象层,并对该层进行测试以作出反应。随后,我将为要测试的每个db服务器创建不同的具体类
在给定的环境下,我们可以对SQLite进行频率测试,但真正的测试每天至少运行一次。感谢您的明确回答。我们面临的问题是,我们正在尽可能多地进行单元测试(例如,每个新的bug修复/增强都应该有一个与之相关的单元测试)。当bug修复/增强只是一个新的和改进的SQL查询时,这是否合理可行?如果不建议Mysql使用DbUnit,那么测试这类修复程序(不使用SQLite方法)的标准过程是什么?将所有东西移植到SQLite似乎有点过分了。另外,为什么单元测试需要快速?我们目前没有优化单元测试过程的需求,我不明白为什么这会至关重要?(我是TDD的noob,所以任何启示都是值得赞赏的)因为你经常管理他们。每次提交时,都应该尽可能多地运行自动化测试。理想情况下,批(在所有自动测试运行并通过之前,“构建”不是构建)。如果这需要少于10分钟,那么它是令人恼火的,但可以接受,但超过10分钟,它就不再被接受了。@user1027562:请参阅我的