【发布时间】:2010-12-21 09:35:41
【问题描述】:
我想知道,你们如何在 CakePHP 中进行单元测试? 你如何在项目中加入测试? 你测试项目的哪些部分?你如何决定哪些部分要进行单元测试? 你们还能在截止日期前完成工作吗?
【问题讨论】:
标签: php unit-testing cakephp
我想知道,你们如何在 CakePHP 中进行单元测试? 你如何在项目中加入测试? 你测试项目的哪些部分?你如何决定哪些部分要进行单元测试? 你们还能在截止日期前完成工作吗?
【问题讨论】:
标签: php unit-testing cakephp
我想知道你们怎么样 CakePHP 中的单元测试?你怎么 在项目中加入测试?
我通常使用 Cake Core 使用的最简单的设置。我为每个控制器和模型设置了一个测试文件。如果代码具有复杂的选项或助手的输出变化很大,我通常会测试助手/组件/行为的输出。我发现我的覆盖率约为 65-75%,即使我的测试的代码覆盖率如此之低(有限的文件子集的 65% 非常薄弱),我通过测试发现或修复的错误比我发现的和没有正确修复。
什么 你测试项目的一部分吗?怎么做 你决定哪些部分成为 单元测试?
我总是测试所有模型功能。自定义查找、分页结果集等。我对它们进行了以下测试。正确的结果数量(来自夹具数据的查找)、正确的结果集(来自夹具数据的查找)、返回字段的正确性、返回的结果数量以及每个自定义查找类型的正确数据集。如果我在任何发现(自定义或其他)上使用分页集,请正确分页。
我总是测试不会导致视图被渲染的控制器功能。作为一种习惯,我倾向于移动不专用于设置视图变量或选择视图以呈现给控制器中的私有/受保护函数或模型函数调用的 all 逻辑。 这让我可以直接测试剩余的控制器操作(带有视图输出的操作)。如果我渲染一个视图,那么这些函数可能表现良好,what 渲染的任何问题都在调用堆栈的上方。
我使用特定选项集测试助手的输出。我并不总是涵盖选项数组的所有排列,但是当两个不同的键导致互斥行为或者我可以检查结果是否包含在我的标记中的可预测属性时 - 我会测试这些场景。
如果一个组件从某个地方获取数据并对其进行操作,我也会检查格式或返回组件函数上的数据。行为也一样。
如果我在某处使用了静态类,我将测试该类中的函数以获得正确的返回结果以及生成一些强制失败或故意错误条件。特别是如果错误导致重定向,或者数据以某种形式通过管道发送。如果失败是静默的或返回默认值,我还会检查以确保确实发生了这种情况。
你们还可以吗? 在截止日期前完成工作?
这里的第一次通过截止日期总是稍微“软”,以解决测试和任何突然出现的问题。我发现,如果您使用普通的旧铅笔和一些方格纸或白板,您甚至可以在编写任何代码之前轻松找出一组基本测试。使用这种方法,您可能会发现一个项目需要多花 25% 的前期时间,但在应用程序的整个生命周期中,您将轻松节省您前期花费的 25%,因为后续不会有那么多问题管道。
我对此进行了编辑以添加一些链接,以查看实际测试技术并作为一种直观地了解它们如何结合在一起的方式。
另外,我必须同意和不同意蛋糕开发人员在编写测试方面的看法。 测试您想要重用的任何内容(无论是单个组件文件还是复杂插件)都是一个非常好的主意,因为您将分发它并且测试都显示工作代码并且是很好的示例一段代码可以做什么。
至于不测试控制器,因为您必须使用模拟对象 - 这只是一个不做一些棘手工作的弱借口,确实确实降低了错误率,并让您巨大增加了您对自己代码的理解。
【讨论】:
您可能想看看this。
我对 CakePHP 不是很熟悉,但我一般使用 PHPUnit。我使用 Netbeans,它很好地集成了 PHPUnit(我不知道这是否适合您)。可以独立于您使用的 Web 框架运行单元测试。
我通常会测试所有数据源的连接性(整个数据访问层),并确保持久性按预期工作。此外,如果您的应用程序中有任何特定于业务的逻辑,请对其进行测试,以便您知道它确实有效。我没有任何长期的测试经验,但我认为其他人会建议您测试您的观点。就个人而言,我在浏览器中使用 F5,呵呵 :)。当谈到 AJAX 功能时,我会测试它的每一点(请求完成它的事情和/或检索所需的结果)。
关于时间/截止日期,可以确定的一件事是您的项目将从测试中受益。当不使用某种形式的测试来确保应用程序的构建块按您希望的方式工作时,超过截止日期的可能性要大得多。假设您的应用程序变得更大(在大多数情况下确实如此),您没有任何单元测试并且您的应用程序失败。您如何知道在哪里进行调试,以及您将使用多少时间来搜索问题?要理解的主要一点是,当您获得许多这样的小片段时,确保小片段的代码能够正常工作非常重要。
编写测试所花费的时间可能看起来没有成效,因为它不会直接导致功能,但随着时间的推移它确实发挥着非常重要的作用。将其视为一种保险形式。
【讨论】: