Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 为什么我应该避免使用DbUnit来测试MySQL?_Unit Testing_Tdd_Phpunit_Dbunit - Fatal编程技术网

Unit testing 为什么我应该避免使用DbUnit来测试MySQL?

Unit testing 为什么我应该避免使用DbUnit来测试MySQL?,unit-testing,tdd,phpunit,dbunit,Unit Testing,Tdd,Phpunit,Dbunit,我最近参与了一些使用PHPUnit的TDD。 我必须测试一个数据库驱动的应用程序,并阅读有关DbUnit扩展的文章,我计划在未来几周研究并实现它 然而,我自己也遇到过这个问题——塞巴斯蒂安·伯格曼(Sebastian Bergmann)——他有一张题为“如果可以,请避免对MySQL进行测试”的幻灯片,这让我对自己的行为产生了一些怀疑 有人能解释为什么我不应该测试MySQL吗 谢谢两个原因: 它很慢(单元测试需要很快) 它增加了超出您控制范围的额外故障点(当DB连接失败时,测试真的失败了吗?)

我最近参与了一些使用PHPUnit的TDD。 我必须测试一个数据库驱动的应用程序,并阅读有关DbUnit扩展的文章,我计划在未来几周研究并实现它

然而,我自己也遇到过这个问题——塞巴斯蒂安·伯格曼(Sebastian Bergmann)——他有一张题为“如果可以,请避免对MySQL进行测试”的幻灯片,这让我对自己的行为产生了一些怀疑

有人能解释为什么我不应该测试MySQL吗

谢谢两个原因:

  • 它很慢(单元测试需要很快)
  • 它增加了超出您控制范围的额外故障点(当DB连接失败时,测试真的失败了吗?)
相反,正如作者所建议的,您应该使用内存中的数据库(如SQLite)来测试DAL。这消除了上述问题

然而,这种方法也有其缺点——将SQL从一种数据库方言移植到SQLite时可能会遇到问题。这自然意味着您将无法测试DAL中特定于MySQL的部分。和往常一样,这是一把双刃剑——你得到了单元测试的速度和隔离,但你失去了可信度(如果我们可以这样称呼它的话)——如果它在SQLite上传递,你能100%确定它在MySQL上工作吗

将DAL/DAO测试的核心留给集成测试阶段可能不是个坏主意,在集成测试阶段,您将使用真正的DB引擎对它们进行测试,并将小事情留给单元测试;例如映射(如果您使用的是ORM)

编辑:fast并不是严格的要求——它只是一个很好的一般建议。在执行TDD时,您的开发人员将大量运行单元测试(这样想;每一次对本地repo的承诺/每一次重要的代码更改都需要通过运行单元测试来检查代码库的完整性)——也许不是所有的,但肯定是一些。你希望这个过程很快

现在,进行缓慢的测试通常会这样结束:

  • “伙计,这东西跑得太慢了……”
  • “也许我只能跑其中的几个……我以后再跑其余的”
  • 在这一点上,我们知道以后永远不会到来
  • “嘿,我的上一次提交没有破坏任何东西,我根本没有运行任何测试!”
  • “我到底为什么要经营它们?”
编写未运行的测试几乎扼杀了编写测试的目的

这件事发生在一个和我一起工作的朋友身上;他的团队让测试套件运行+/-20分钟(DAL测试做得很差,测试中涉及IoC容器),开发人员开始运行一些测试,很快,“当前构建破坏者”电子邮件就成了日常事务。他们有相当大的套间,但打破测试并没有那个么糟糕


总的来说,您的方法似乎是正确的——我不会将测试转移到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:请参阅我的