### PHPunit-book 知识点概述 #### 一、PHPUnit简介 - **PHPUnit** 是一个流行的单元测试框架,主要用于PHP程序的自动化测试。它能够帮助开发者编写可维护性更强、更可靠的代码。通过一系列预定义的断言方法,PHPUnit允许开发者验证函数、类和方法是否按预期工作。 #### 二、安装与配置 - **需求**: 支持PHP 5.3.3及以上版本。 - **安装方式**: - **PHP档案包(PHAR)**: 可以直接下载`phpunit.phar`文件,并将其添加到`PATH`环境变量中。 - **Composer**: 使用Composer作为项目依赖管理工具安装PHPUnit。 - **可选的组件包**: 可以根据需要选择安装额外的组件包,例如用于代码覆盖率分析的组件。 #### 三、编写PHPUnit测试 - **测试的依赖关系**: - 测试通常需要依赖于其他类或函数。PHPUnit提供了多种机制来管理和控制这些依赖关系。 - **数据供给器**: 可以使用数据供给器为测试提供不同的输入数据,以便测试在各种情况下都能正确运行。 - **对异常进行测试**: 可以使用`expectException`等方法来确保代码在特定条件下抛出正确的异常类型。 - **对PHP错误进行测试**: 可以使用`assertError`等方法来检查代码是否触发了预期的PHP错误。 - **对输出进行测试**: 可以使用`expectOutputString`等方法来验证脚本的输出是否符合预期。 - **边缘情况**: 测试应包括边界值和异常条件,确保程序能够妥善处理所有可能的情况。 #### 四、命令行测试执行器 - **命令行选项**: - 可以通过命令行参数来控制测试的执行,如指定测试文件、设置时间限制等。 #### 五、基境(Fixture) - **setUp()与tearDown()**: - `setUp()`方法在每个测试方法之前被调用,用于准备测试环境。 - `tearDown()`方法在每个测试方法之后被调用,用于清理测试后留下的资源。 - **变体**: 可以根据需要自定义基境的实现方式。 - **共享基境**: 当多个测试需要相同的测试环境时,可以考虑使用共享基境。 - **全局状态**: 需要注意避免测试之间的全局状态相互影响。 #### 六、组织测试 - **用文件系统来编排测试套件**: - 可以通过文件系统的结构来组织测试,如将相关的测试放在同一个目录下。 - **用XML配置来编排测试套件**: 也可以使用XML配置文件来定义测试套件的结构和执行顺序。 #### 七、严格模式 - **无用测试**: 避免编写对代码覆盖率没有贡献的测试。 - **意外覆盖的代码**: 确保测试只覆盖需要覆盖的部分代码。 - **测试执行期间产生的输出**: 控制测试过程中的输出,避免干扰测试结果。 - **测试执行时长的超时限制**: 设置合理的测试超时限制,防止测试长时间运行。 #### 八、不完整的测试与跳过的测试 - **不完整的测试**: 对于尚未完成的测试,可以使用`markTestIncomplete`方法标记为不完整。 - **跳过测试**: 使用`markTestSkipped`方法可以完全跳过某些测试。 - **用@requires来跳过测试**: 可以通过注释`@requires`来指定测试执行的条件。 #### 九、数据库测试 - **数据库测试所支持的供应商**: - 支持MySQL、PostgreSQL等多种数据库。 - **数据库测试中的难点**: 包括数据隔离、测试数据准备等。 - **数据库测试的四个阶段**: - 清理数据库: 确保每次测试前数据库是干净的。 - 建立基境: 准备测试所需的数据。 - 运行测试: 执行测试用例。 - 拆除基境: 清理测试产生的数据。 #### 十、测试替身 - **短连件(Stub)**: - 用于模拟对象的行为,以测试被测对象与其他对象交互的方式。 - **仿件对象(Mock Object)**: - 更加灵活的模拟技术,可以验证对象间的交互是否按照预期发生。 - **对性状(Trait)与抽象类进行模仿**: 通过模仿特定的类特性来测试复杂场景。 - **对Web服务(Web Services)进行短连或模仿**: 在不依赖实际网络请求的情况下测试Web服务的客户端代码。 - **对文件系统进行模仿**: 用于测试依赖文件系统操作的代码。 #### 十一、测试实践 - **在开发过程中**: - 强烈推荐在编写功能代码之前先编写测试。 - **在调试过程中**: - 利用PHPUnit提供的测试报告来定位问题。 #### 十二、代码覆盖率分析 - **指明要覆盖的方法**: 可以指定哪些方法需要被测试覆盖。 - **忽略代码块**: 根据需要可以选择忽略某些代码块的覆盖率统计。 - **包含与排除文件**: 可以通过配置文件指定哪些文件或目录参与覆盖率分析。 - **边缘情况**: 覆盖率分析可能会遇到一些特殊情况,如动态生成的代码。 #### 十三、测试的其他用途 - **敏捷文档**: 单元测试本身就是一种形式的文档,可以帮助新成员快速了解系统架构。 - **跨团队测试**: 不同团队之间可以通过测试套件来协调接口和功能。 #### 十四、PHPUnit与Selenium - **SeleniumServer**: 一种用于Web应用测试的工具,可以与PHPUnit结合使用。 - **PHPUnit_Extensions_Selenium2TestCase**: 提供了与Selenium 2兼容的测试案例类。 - **PHPUnit_Extensions_SeleniumTestCase**: 提供了与Selenium 1兼容的测试案例类。 #### 十五、日志记录 - **测试结果(XML)**: 可以将测试结果保存为XML格式,便于集成到持续集成系统中。 - **测试结果(TAP)**: Test Anything Protocol (TAP)是一种简单的文本格式,用于表示测试结果。 - **测试结果(JSON)**: 可以将测试结果保存为JSON格式。 - **代码覆盖率(XML)**: 将代码覆盖率信息保存为XML格式。 - **代码覆盖率(TEXT)**: 以纯文本格式显示代码覆盖率信息。 #### 十六、扩展PHPUnit - **从PHPUnit_Framework_TestCase派生子类**: 创建自定义的测试案例基类,以便更好地组织测试。 - **编写自定义断言**: 可以扩展PHPUnit的功能,添加自定义的断言方法。 - **实现PHPUnit_Framework_TestListener**: 实现监听器接口来监听测试事件。 - **从PHPUnit_Extensions_TestDecorator派生子类**: 创建装饰器类来增强测试的功能。 - **实现PHPUnit_Framework_Test**: 创建自定义的测试类来满足特殊的需求。 #### 十七、断言方法概览 - **assertArrayHasKey()**: 检查数组中是否存在某个键。 - **assertClassHasAttribute()**: 检查类是否具有某个属性。 - **assertClassHasStaticAttribute()**: 检查类是否具有静态属性。 - **assertContains()**: 检查某个值是否存在于数组或字符串中。 - **assertContainsOnly()**: 检查数组是否只包含某种类型的值。 - **assertContainsOnlyInstancesOf()**: 检查数组是否只包含某个类的实例。 - **assertCount()**: 检查数组或对象集合的元素个数。 - **assertEmpty()**: 检查数组或对象是否为空。 - **assertEqualXMLStructure()**: 比较两个XML文档的结构是否相同。 - **assertEquals()**: 检查两个变量是否相等。 - **...** 通过以上知识点的概述,可以看出**PHPUnit**不仅是一个强大的单元测试工具,还具备丰富的特性和扩展能力,非常适合PHP项目的测试需求。
剩余191页未读,继续阅读
- 粉丝: 6
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助