2009-11-29 87 views
26

我想知道,你们如何在CakePHP中进行单元测试? 你如何在项目中加入测试? 你测试一个项目的哪些部分?你如何决定哪些部分被单元测试? 你们还在截止日期前完成工作吗?在CakePHP中进行单元测试?

回答

39

我想知道,你们怎么样在CakePHP中单元测试 ? 你如何在项目中加入测试?

我通常使用Cake Core使用的最简单的设置。我为每个控制器和模型设置了一个测试文件。如果代码有复杂的选项或者帮助程序有很大的变量输出,我通常会测试helpers/components/behavior的输出。我发现我的覆盖率大概在65-75%之间,即使我的测试代码覆盖率很低(65%的文件的有限子集相当弱),我通过测试发现或修复了比我发现的更多的bug没有正确固定。

什么 您测试项目的某些部分? 您如何确定哪些部件将通过 单元测试?

我总是测试所有的模型功能。自定义查找,分页结果集等我测试他们以下。正确的结果数量(来自夹具数据的查找),正确的结果集(来自夹具数据的查找),返回字段的正确性,返回的结果数量以及每个自定义查找类型的正确数据集。如果我在任何发现,自定义或其他方式上使用分页集,请更正分页。

我总是测试不会导致视图呈现的控制器函数。作为一种习惯,我倾向于移动所有逻辑,这些逻辑并非专用于设置视图变量或选择视图以呈现给控制器中的私有/受保护功能或模拟函数调用。 这使我可以直接测试剩余控制器操作(具有视图输出的操作)。如果我在所有上渲染视图,那么这些函数可能表现良好,并且的任何问题都会呈现在调用堆栈的更上方。

我测试助手的输出与特定的选项设置。我并不总是涵盖选项数组的所有排列,但是当两个不同的键导致相互排斥的行为,或者我可以检查包含在我的标记中的可预测属性时 - 我测试这些场景。

如果一个组件从某处获取数据并对其进行操作,我还会检查组件函数的格式或返回数据。行为相同。

如果我有一个静态类用于某处,我将测试该类中的函数以获得正确的返回结果以及生成一些强制失败或故意错误条件。特别是如果错误导致重定向,或者以某种形式向管道发送数据。如果失败是沉默或返回一个默认值我也检查,以确保实际发生。

你们还在 截止日期前完成工作吗?

这里的第一个通过期限总是稍微“软”来说明测试和出现的任何问题。我发现,如果您使用普通的旧铅笔和一些方格纸或白板,您甚至可以在编写任何代码之前就轻松地找出一组基本测试。通过这种方法,您可能会发现一个项目需要多花25%的时间,但是在整个应用程序生命周期中,您将通过轻松地节省您前期花费的25%,因为没有太多问题在进行中。


我编辑这在一些链接添加到看两个实际的测试技术和作为一种方式来获得的他们是怎么走到一起的视觉感。

  1. http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite
  2. http://book.cakephp.org/view/160/Testing
  3. http://debuggable.com/posts/unit-testing-in-cakephp-part-1---introduction-to-unit-testing:48102610-c5d0-4398-a010-76974834cda3
  4. http://mark-story.com/nodes/view/testing-cakephp-controllers-the-hard-way

另外,我不得不同意与写作测试的开发者蛋糕不同意。它一个非常好的主意来测试任何你想要重用的东西 - 无论是单一的组件文件或复杂的插件 - 因为你将分发它,测试都显示工作代码,是很好的例子,可以做什么一段代码。

至于没有测试控制器,因为你必须使用模拟对象 - 这只是一个弱的理由,而不是做一点棘手的工作,一旦你打扰它,它变得相当容易,每次你做它和它真的,真的会降低错误率,并让你自己增加对自己的代码的理解。

+1

非常感谢你的真棒回答:) – user133127 2009-12-01 15:57:50

+1

你的欢迎 - 我没有想到这篇文章受欢迎。 – 2011-11-22 20:05:28

4

你可能想看看this

我对CakePHP不是很熟悉,但我通常使用PHPUnit。我使用Netbeans,它很好地集成了PHPUnit(我不知道这是否适合您)。可以运行独立于您使用的Web框架的单元测试。

我通常会测试所有数据源连接(整个数据访问层),并确保持久性按预期工作。此外,如果您的应用程序中有任何业务特定逻辑,则会对其进行测试,以便您知道它确实有效。我没有很长的测试经验,但我认为其他人会建议你测试你的观点。就个人而言,我在浏览器中使用F5,呵呵:)。当谈到AJAX功能时,我会测试它的每一个位(请求执行它的事情和/或检索所需的结果)。

关于时间/截止日期,可以肯定的是您的项目将从测试中受益。如果不使用某种形式的测试来确保应用程序的构建块按照您的要求运行,超出截止日期的可能性会更大。假设您的应用程序变得更大(在大多数情况下它会这样做),您没有任何单元测试并且应用程序失败。你怎么知道在哪里调试,以及你会用多少时间来搜索这个问题?要理解的主要事情是,确保小部分代码的工作非常重要,当你得到许多小部分。

编写测试所耗费的时间可能看起来没有任何效果,因为它并不直接导致功能,但随着时间的推移它确实发挥着非常重要的作用。把它看作一种保险形式。