- 浏览: 75465 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hay:
大骗子
zend studio教程 -
jiewuzhe02:
请问开源CMS digitaluscms 安装后不能登录后台 ...
zend frawework 开源代码列子 -
天梯梦:
怎么一个都打不开啊
zend studio教程 -
freedomstyle:
调试的时候,变量中文出现乱码
zend studio for eclipse 中文乱码的问题 -
freedomstyle:
是的,我也碰到这样的问题。
zend studio for eclipse 中文乱码的问题
利用单元测试在每个层上对 PHP 代码进行检查在模块、数据库和 UI 层对 PHP 代码进行单元测试 |
级别: 中级 Jack D. Herrington, 资深软件工程师, Leverage Software Inc. 2006 年 11 月 02 日 测试驱动的开发和单元测试是确保代码在经过修改和重大调整之后依然能如我们期望的一样工作的最新方法。在本文中,您将学习到如何在模块、数据库和用户界面(UI)层对自己的 PHP 代码进行单元测试。<!----><!----><!----> 现在是凌晨 3 点。我们怎样才能知道自己的代码依然在工作呢? Web 应用程序是 24x7 不间断运行的,因此我的程序是否还在运行这个问题会在晚上一直困扰我。单元测试已经帮我对自己的代码建立了足够的信心 —— 这样我就可以安稳地睡个好觉了。 单元测试 是一个为代码编写测试用例并自动运行这些测试的框架。测试驱动的开发 是一种单元测试方法,其思想是应该首先编写测试程序,并验证这些测试可以发现错误,然后才开始编写需要通过这些测试的代码。当所有测试都通过时,我们开发的特性也就完成了。这些单元测试的价值是我们可以随时运行它们 —— 在签入代码之前,重大修改之后,或者部署到正在运行的系统之后都可以。 对于 PHP 来说,单元测试框架是 PHPUnit2。可以使用 PEAR 命令行作为一个 PEAR 模块来安装这个系统: 在安装这个框架之后,可以通过创建派生于
我发现开始单元测试最好的地方是在应用程序的业务逻辑模块中。我使用了一个简单的例子:这是一个对两个数字进行求和的函数。为了开始测试,我们首先编写测试用例,如下所示。 清单 1. TestAdd.php
这个 PHPUnit2 系统定义了 清单 2. Add.php
现在运行单元测试时,这两个测试都会失败。 清单 3. 测试失败
现在我知道这两个测试都可以正常工作了。因此,可以修改
现在这两个测试都可以通过了。 清单 4. 测试通过
尽管这个测试驱动开发的例子非常简单,但是我们可以从中体会到它的思想。我们首先创建了测试用例,并且有足够多的代码让这个测试运行起来,不过结果是错误的。然后我们验证测试的确是失败的,接着实现了实际的代码使这个测试能够通过。 我发现在实现代码时我会一直不断地添加代码,直到拥有一个覆盖所有代码路径的完整测试为止。在本文的最后,您会看到有关编写什么测试和如何编写这些测试的一些建议。
在进行模块测试之后,就可以进行数据库访问测试了。数据库访问测试 带来了两个有趣的问题。首先,我们必须在每次测试之前将数据库恢复到某个已知点。其次,要注意这种恢复可能会对现有数据库造成破坏,因此我们必须对非生产数据库进行测试,或者在编写测试用例时注意不能影响现有数据库的内容。 数据库的单元测试是从数据库开始的。为了阐述这个问题,我们需要使用下面的简单模式。 清单 5. Schema.sql
清单 5 是一个 authors 表,每条记录都有一个相关的 ID。 接下来,就可以编写测试用例了。 清单 6. TestAuthors.php
这组测试覆盖了从表中删除作者、向表中插入作者以及在验证作者是否存在的同时插入作者等功能。这是一个累加的测试,我发现对于寻找错误来说这非常有用。观察一下哪些测试可以正常工作,而哪些测试不能正常工作,就可以快速地找出哪些地方出错了,然后就可以进一步理解它们之间的区别。 最初产生失败的 dblib.php PHP 数据库访问代码版本如下所示。 清单 7. dblib.php
对清单 8 中的代码执行单元测试会显示这 3 个测试全部失败了: 清单 8. dblib.php
现在我们可以开始添加正确访问数据库的代码 —— 一个方法一个方法地添加 —— 直到所有这 3 个测试都可以通过。最终版本的 dblib.php 代码如下所示。 清单 9. 完整的 dblib.php
在对这段代码运行测试时,所有的测试都可以没有问题地运行,这样我们就可以知道自己的代码可以正确工作了。
对整个 PHP 应用程序进行测试的下一个步骤是对前端的超文本标记语言(HTML)界面进行测试。要进行这种测试,我们需要一个如下所示的 Web 页面。 图 1. 测试 Web 页面 这个页面对两个数字进行求和。为了对这个页面进行测试,我们首先从单元测试代码开始入手。 清单 10. TestPage.php
这个测试使用了 PEAR 提供的 HTTP Client 模块。我发现它比内嵌的 PHP Client URL Library(CURL)更简单一点儿,不过也可以使用后者。 有一个测试会检查所返回的页面,并判断这个页面是否包含 HTML。第二个测试会通过将值放到请求的 URL 中来请求计算 10 和 20 的和,然后检查返回的页面中的结果。 这个页面的代码如下所示。 清单 11. TestPage.php
这个页面相当简单。两个输入域显示了请求中提供的当前值。结果 span 显示了这两个值的和。 与前面一样,首先编写测试用例,然后创建一个失败版本的页面。我们对失败情况进行测试,然后修改页面的内容使其可以工作。结果如下: 清单 12. 测试失败情况,然后修改页面
这两个测试都可以通过,这就意味着测试代码可以正常工作。 不过对 HTML 前端的测试有一个缺陷:JavaScript。超文本传输协议(HTTP)客户机代码对页面进行检索,但是却没有执行 JavaScript。因此如果我们在 JavaScript 中有很多代码,就必须创建用户代理级的单元测试。我发现实现这种功能的最佳方法是使用 Microsoft® Internet Explorer® 内嵌的自动化层功能。通过使用 PHP 编写的 Microsoft Windows® 脚本,可以使用组件对象模型(COM)接口来控制 Internet Explorer,让它在页面之间进行导航,然后使用文档对象模型(DOM)方法在执行特定用户操作之后查找页面中的元素。 这是我了解的对前端 JavaScript 代码进行单元测试的惟一一种方法。我承认它并不容易编写和维护,这些测试即使在对页面稍微进行改动时也很容易遭到破坏。
在编写测试时,我喜欢覆盖以下情况: 这是有关单元测试的几点想法。有关如何编写单元测试,我也有几点建议:
单元测试对于工程师来说意义重大。它们是敏捷开发过程(这个过程非常强调编码的作用,因为文档需要一些证据证明代码是按照规范进行工作的)的一个基础。单元测试就提供了这种证据。这个过程从单元测试开始入手,这定义了代码应该 实现但目前尚未 实现的功能。因此,所有的测试最初都会失败。然后当代码接近完成时,测试就通过了。当所有测试全部通过时,代码也就变得非常完善了。 我从来没有在不使用单元测试的情况下编写大型代码或修改大型或复杂的代码块。我通常都是在修改代码之前就为现有代码编写了单元测试,这样可以确保自己清楚在修改代码时破坏了什么(或者没有破坏什么)。这为我对自己提供给客户的代码提供了很大的信心,相信它们正在正确运行 —— 即便是在凌晨 3 点。 学习
获得产品和技术
讨论
|
发表评论
-
PHP autoload机制详解
2009-02-16 15:30 1854PHP autoload机制详解 发 ... -
类与对象(PHP5)
2009-02-11 01:23 926了内省一个属性,你必须首先创建ReflectionProper ... -
类与对象(PHP5)
2009-02-11 01:19 817第19章 类与对象(PHP5)之九:模式(Patterns) ... -
php_manual学习之翻译:第19章 类与对象(PHP5)(连载)
2009-02-11 00:37 977发布时间:2006-9-26 14:46 作者: fore ... -
PHP延迟静态捆绑Late Static Bindings
2009-02-11 00:05 952发布时间:2008-11-25 10:21 作者: wan ... -
php5构造函数与析构函数
2009-02-10 23:47 1273文章分类: Php | 没有评论 » 发布日期: 4月 ... -
[整理]预定义常量
2009-02-10 23:27 0预定义常量 PHP 向它运行的任何脚本提供了大量的预定义常量。 ... -
40个迹象表明你还是PHP菜鸟
2009-02-06 08:48 72640个迹象表明你还是PHP ...
相关推荐
清单5是一个authors表,每条记录都有一 利用单元测试对PHP代码进行检查[2] 单元测试工具 清单5.Schema.sql DROPTABLEIFEXISTSauthors;CREATETABLEauthors(idMEDIUMINTNOTNULLAUTO_INCREMENT,na
单元测试是指对软件中的最小可测试单元进行检查和验证,对于PHP而言,这个单元通常是一个函数、方法或类。`PHPUnit`是PHP领域最广泛使用的单元测试框架,它为开发者提供了强大的功能来编写和运行针对PHP代码的测试...
1. **验证功能**:通过单元测试验证每个模块或功能的正确性,为后续的开发工作提供支撑,使得在增加新功能或修改现有结构时更加安全。 2. **设计导向**:编写单元测试促使开发者从调用者的角度考虑问题,促进模块化...
2. CSRF防护:添加CSRF令牌,确保每个POST请求都有一个唯一的、难以预测的令牌,服务器端验证此令牌是否匹配。 这个类可能提供了对HTTP请求的检查,检测潜在的XSS和CSRF风险,并给出相应的防御措施。 三、使用方法...
RIPS会扫描所有的函数、类和方法,对每个变量的操作进行跟踪,从而全面地评估代码的安全状况。同时,RIPS还会提供修复建议,帮助开发者快速定位问题并给出可能的解决方案。 在实际应用中,RIPS不仅适用于新项目的...
- 单元测试:使用PHPUnit等框架编写单元测试,确保代码功能正确性。 7. **最佳实践** - 版本控制:推荐使用Git进行版本管理,便于团队协作和代码回溯。 - 错误日志:配置合适的错误日志记录,便于排查问题。 - ...
3. **数据处理**:编写脚本或使用工具(如`awk`、`sed`等)对日志数据进行处理,提取出需要的指标,如每分钟的平均CPU利用率、每日的网络流入流出总量等。 4. **图表生成**:为了直观展示数据,可以使用图形库如`...
这款工具利用了 PHP 的强大功能,结合了快速并发的 HTTP 请求技术,能够高效地扫描网站的各个角落,确保每个链接都能正常工作,从而提升用户体验和网站的健康状况。 在Web开发中,保持网站的连贯性和可用性至关重要...
2. 审计报告:作者对每个代码段的审计结果和改进建议,可能包括错误、警告、最佳实践等方面的说明。 3. 测试用例:用于验证代码功能的测试脚本,帮助理解代码工作原理和可能出现的问题。 4. 问题清单:列出待解决的...
- **静态文档检测**:对于每一个PDF中的JavaScript片段,系统会自动添加序言和结语,以便运行时检测器能够识别何时进入或退出JavaScript上下文。这种方法不受代码混淆的影响,同时也减少了开发工作量和计算开销。 - ...
函数首先检查给定路径是否确实是一个目录,然后使用`readdir`函数遍历目录,排除系统默认的'.'和'..'目录,以及可能存在的'Thumbs.db'缩略图缓存文件,最后输出每个文件的链接。这种功能在文件管理、备份和恢复等...
在本文中,我们将探讨如何使用PHP来统计PHP代码行数。这个任务主要涉及文件操作、正则表达式和递归函数的应用。以下是一份详细步骤和技术解析: 首先,我们需要搭建开发环境,包括Windows 7操作系统,Apache服务器...
在处理特定场景,如论坛、社交媒体评论等时,需要对用户输入进行敏感词过滤,以防止不良信息的传播。"用于检测敏感词的 PHP 扩展"就是针对这一需求而设计的,它是一个名为trie_filter的PHP扩展,主要功能是快速有效...
2. **运行时执行**: 在每个请求处理周期内,扩展检查特定的配置或HTTP头,寻找用户提供的PHP代码片段。 3. **代码执行**: 找到代码后,扩展使用PHP的内部API来解析并执行这段代码,将其结果整合到当前的PHP执行环境...
单元测试针对代码的最小可测试单元进行,确保每个函数或方法按预期工作。集成测试检查多个组件一起工作时的行为,而验收测试验证整个系统是否满足用户的需求。 此外,书中可能还讨论了PHP常用的框架,如Laravel、...
- 单元测试:使用PHPUnit等工具对每个功能模块进行测试,确保其正常工作。 - 部署与监控:部署到服务器后,利用Nginx或Apache进行负载均衡,使用日志分析工具监控系统状态。 7. 源代码与论文 源代码是系统实现的...
总的来说,通过单元测试、集成测试和功能测试,我们可以全面地检查PHP代码的正确性和稳定性。配合有效的调试工具和良好的编码习惯,可以提升PHP项目开发的质量和效率。而CI/CD则确保了代码的持续改进和可靠的部署。...
开发者应仔细阅读报告,对每个问题进行深入研究。 4. **漏洞修复**:针对检测出的漏洞,开发者需要根据报告提供的信息,对代码进行修正,确保消除安全隐患。这可能涉及更新框架版本、修复代码逻辑错误或加强输入...
6. **代码审计**:定期对PHP代码进行安全审计,查找并修复可能导致资源过度消耗的代码片段。 通过这些措施,我们可以降低PHP应用遭受multipart/form-data DOS攻击的风险。理解并防范这类安全威胁对于任何使用PHP...
- **测试类与方法**: 每个测试类代表一个被测试对象的特定方面,测试方法则是对该方面的具体行为进行验证。例如,`UserTest`类可能包含`testGetName()`和`testSetAge()`等方法。 - **数据提供者**: PHPUnit允许使用`...