编辑: liubingb | 2019-09-27 |
5.最后更新于 2018-04-12. 版权 ? 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014,
2015 Sebastian Bergmann 本作品依据 Creative Commons Attribution 3.0 Unported 许可协议进行授权. iii 目录 1. 安装 PHPUnit
1 需求
1 PHP 档案包 (PHAR)1 Windows
1 校验 PHPUnit PHAR 发行包
2 Composer
4 可选的组件包
4 2. 编写 PHPUnit 测试
5 测试的依赖关系
5 数据供给器
8 对异常进行测试
12 对PHP 错误进行测试
13 对输出进行测试
15 错误相关信息的输出
16 边缘情况
18 3. 命令行测试执行器
19 命令行选项
19 4. 基境(fixture)26 setUp() 多tearDown() 少28 变体
28 基境共享
28 全局状态
29 5. 组织测试
31 用文件系统来编排测试套件
31 用XML 配置来编排测试套件
32 6. 有风险的测试
33 无用测试
33 意外的代码覆盖
33 测试执行期间产生的输出
33 测试执行时长的超时限制
33 全局状态篡改
33 7. 未完成的测试与跳过的测试
34 未完成的测试
34 跳过测试
35 用@requires 来跳过测试
36 8. 数据库测试
38 数据库测试所支持的供应商
38 数据库测试的难点
38 数据库测试的四个阶段
39 1. 清理数据库
39 2. 建立基境
39 3C5. 运行测试、验证结果、并拆除基境
39 PHPUnit 数据库测试用例的配置
39 实现 getConnection(40 实现 getDataSet(40 数据库构架(DDL)怎么办?41 小建议:使用你自己的抽象数据库 TestCase 类41 理解 DataSet(数据集)和DataTable(数据表)42 可用的各种实现
43 当心外键
51 实现自有的 DataSet/DataTable
51 数据库连接 API
52 数据库断言 API
53 对表中数据行的数量作出断言
53 对表的状态作出断言
54 PHPUnit 手册 iv 对查询的结果作出断言
55 对多个表的状态作出断言
55 常见问题(FAQ)56 PHPUnit 会为每个测试(重新)创建数据库吗?56 为了让数据库扩展模块正常工作,需要在应用程序中使用 PDO 吗?56 如果看到 Too much Connections 错误该怎么办?56 Flat XML / CSV 数据集中如何处理 NULL?56 9. 测试替身
57 Stubs (桩件)57 仿件对象(Mock Object)62 Prophecy
67 对特质(Trait)与抽象类进行模仿
68 对Web 服务(Web Services)进行上桩或模仿
69 对文件系统进行模仿
70 10. 测试实践
73 在开发过程中
73 在调试过程中
73 11. 代码覆盖率分析
75 用于代码覆盖率的软件衡量标准
75 将文件列入白名单
76 略过代码块
76 指明要覆盖的方法
77 边缘情况
79 12. 测试的其他用途
80 敏捷文档
80 跨团队测试
80 13. Logging (日志记录)81 测试结果 (XML)81 代码覆盖率 (XML)82 代码覆盖率 (TEXT)82 14. 扩展 PHPUnit
84 PHPUnitFrameworkTestCase 的子类
84 编写自定义断言
84 实现 PHPUnitFrameworkTestListener
85 从PHPUnit_Extensions_TestDecorator 派生子类
86 实现 PHPUnit_Framework_Test
87 A. 断言
90 断言方法的用法:静态 vs. 非静态
90 assertArrayHasKey(90 assertClassHasAttribute(91 assertArraySubset(91 assertClassHasStaticAttribute(92 assertContains(93 assertContainsOnly(95 assertContainsOnlyInstancesOf(95 assertCount(96 assertDirectoryExists(97 assertDirectoryIsReadable(97 assertDirectoryIsWritable(98 assertEmpty(99 assertEqualXMLStructure(100 assertEquals(101 assertFalse(106 assertFileEquals(106 assertFileExists(107 assertFileIsReadable(108 assertFileIsWritable(108 assertGreaterThan(109 PHPUnit 手册 v assertGreaterThanOrEqual(110 assertInfinite(110 assertInstanceOf(111 assertInternalType(112 assertIsReadable(112 assertIsWritable(113 assertJsonFileEqualsJsonFile(114 assertJsonStringEqualsJsonFile(114 assertJsonStringEqualsJsonString(115 assertLessThan(116 assertLessThanOrEqual(117 assertNan(117 assertNull(118 assertObjectHasAttribute(119 assertRegExp(119 assertStringMatchesFormat(120 assertStringMatchesFormatFile(121 assertSame(122 assertStringEndsWith(123 assertStringEqualsFile(124 assertStringStartsWith(124 assertThat(125 assertTrue(128 assertXmlFileEqualsXmlFile(128 assertXmlStringEqualsXmlFile(129 assertXmlStringEqualsXmlString(130 B. 标注
132 @author
132 @after
132 @afterClass
132 @backupGlobals
133 @backupStaticAttributes
133 @before
134 @beforeClass
134 @codeCoverageIgnore*135 @covers
135 @coversDefaultClass
136 @coversNothing
136 @dataProvider
136 @depends
136 @expectedException
136 @expectedExceptionCode
137 @expectedExceptionMessage
137 @expectedExceptionMessageRegExp
138 @group
138 @large
139 @medium
139 @preserveGlobalState
139 @requires
139 @runTestsInSeparateProcesses
139 @runInSeparateProcess
140 @small
140 @test
140 @testdox
141 @ticket
141 @uses
141 C. XML 配置文件
142 PHPUnit
142 PHPUnit 手册 vi 测试套件
143 分组
143 Whitelisting Files for Code Coverage
144 Logging (日志记录)144 测试监听器
145 设定 PHP INI 设置、常量、全局变量
145 D. 索引
147 E. 参考书目
153 F. 版权
154 vii 表格清单 2.1. 用于对输出进行测试的方法
16 7.1. 用于未完成的测试的 API
35 7.2. 用于跳过测试的 API
36 7.3. 可能的 @requires 用法
36 9.1. 匹配器
66 A.1. 约束条件
126 B.1. 用于指明测试覆盖哪些方法的标注
135 viii 范例清单 2.1. 用PHPUnit 测试数组操作
5 2.2. 用@depends 标注来表达依赖关系
6 2.3. 利用测试之间的依赖关系
6 2.4. 有多重依赖的测试
7 2.5. 使用返回数组的数组的数据供给器
8 2.6. 使用带有命名数据集的数据供给器
9 2.7. 使用返回迭代器对象的数据供给器
9 2.8. CsvFileIterator 类10 2.9. 在同一个测试中组合使用 @depends 和@dataProvider
11 2.10. 使用 expectException() 方法
12 2.11. 使用 @expectedException 标注
13 2.12. 用@expectedException 来预期 PHP 错误
14 2.13. 对会引发PHP 错误的代码的返回值进行测试
14 2.14. 对函数或方法的输出进行测试
15 2.15. 数组比较失败时生成的错误相关信息输出
16 2.16. 长数组比较失败时生成的错误相关信息输出
17 2.17. 当使用弱比较时在生成的差异结果中出现的边缘情况
18 3.1. 命名数据集
22 3.2. 过滤器模式例子
22 3.3. 过滤器的快捷方式
23 4.1. 用setUp() 建立栈的基境
26 4.2. 展示所有可用模板方法的例子
27 4.3. 在同一个测试套件内的不同测试之间共享基境
28 5.1. 用XML 配置来编排测试套件
32 5.2. 用XML 配置来编排测试套件
32 7.1. 将测试标记为未完成
34 7.2. 跳过某个测试
35 7.3. 用@requires 来跳过测试
36 9.1. 需要对其上桩的类
57 9.2. 对某个方法的调用上桩,返回固定值
58 9.3. 使用可用于配置生成的测试替身类的仿件生成器 API
58 9.4. 对某个方法的调用上桩,返回参数之一
59 9.5. 对方法的调用上桩,返回对桩件对象的引用
59 9.6. 对方法的调用上桩,按照映射确定返回值
60 9.7. 对方法的调用上桩,由回调生成返回值
60 9.8. 对方法的调用上桩,按照指定顺序返回列表中的值
61 9.9. 对方法的调用上桩,抛出异常
61 9.10. 被测系统(SUT)中Subject 与Observer 类的代码
62 9.11. 测试某个方法会以特定参数被调用一次
63 9.12. 测试某个方法将会以特定数量的参数进行调用,并且对各个参数以多种方式进行 约束
64 9.13. 测试某个方法将会以特定参数被调用二次
64 9.14. 更加复杂的参数校验
65 9.15. 测试某个方法将会被调用一次,并且以某个特定对象作为参数.65 9.16. 创建仿件对象时启用参数克隆
66 9.17. 测试某个方法会以特定参数被调用一次
67 9.18. 对特质的具体方法进行测试
68 9.19. 对抽象类的具体方法进行测试
68 9.20. 对web 服务上桩
69 9.21. 一个与文件系统交互的类
70 9.22. 对一个与文件系统交互的类进行测试
71 9.23. 在对与文件系统交互的类进行的测试中模仿文件系统
71 11.1. 使用 @codeCoverageIgnore、@codeCoverageIgnoreStart 与@codeCoverageIgnoreEnd 标注
76 11.2. 在测试中指明欲覆盖哪些方法
77 PHPUnit 手册 ix 11.3. 指明测试不欲覆盖任何方法
78 11.4.79 14.1. PHPUnit_Framework_Assert 类的 assertTrue() 与isTrue() 方法
84 14.2. PHPUnit_Framework_Constraint_IsTrue 类85 14.3. 简单的测试监听器
85 14.4. 使用测试监听器基类
86 14.5. RepeatedTest 修饰器
87 14.6. 一个数据驱动的测试
87 A.1. assertArrayHasKey() 的用法
90 A.2. assertClassHasAttribute() 的用法
91 A.3. assertArraySubset() 的用法
91 A.4. assertClassHasStaticAttribute() 的用法
92 A.5. assertContains() 的用法
93 A.6. assertContains() 的用法
94 A.7. 带有 $ignoreCase 参数的 assertContains() 的用法
94 A.8. assertContainsOnly() 的用法
95 A.9. assertContainsOnlyInstancesOf() 的用法
96 A.10. assertCount() 的用法
96 A.11. assertDirectoryExists() 的用法
97 A.12. assertDirectoryIsReadable() 的用法
98 A.13. assertDirectoryIsWritable() 的用法
98 A.14. assertEmpty() 的用法
99 A.15. assertEqualXMLStructure() 的用法
100 A.16. assertEquals() 的用法
101 A.17. 将assertEquals()用于浮点数时的用法
103 A.18. assertEquals()应用于 DOMDocument 对象时的用法
103 A.19. assertEquals()应用于对象时的用法
104 A.20. assertEquals() 应用于数组时的用法
105 A.21. assertFalse() 的用法
106 A.22. assertFileEquals() 的用法
106 A.23. assertFileExists() 的用法
107 A.24. assertFileIsReadable() 的用法
108 A.25. assertFileIsWritable() 的用法
109 A.26. assertGreaterThan() 的用法
109 A.27. assertGreaterThanOrEqual() 的用法
110 A.28. assertInfinite() 的用法
111 A.29. assertInstanceOf() 的用法
111 A.30. assertInternalType() 的用法
112 A.31. assertIsReadable() 的用法
113 A.32. assertIsWritable() 的用法
113 A.33. assertJsonFileEqualsJsonFile() 的用法
114 A.34. assertJsonStringEqualsJsonFile() 的用法
115 A.35. assertJsonStringEqualsJsonString() 的用法
115 A.36. assertLessThan() 的用法
116 A.37. assertLessThanOrEqual() 的用法
117 A.38. assertNan() 的用法
117 A.39. assertNull() 的使用
118 A.40. assertObjectHasAttribute() 的用法
119 A.41. assertRegExp() 的用法
119 A.42. assertStringMatchesFormat() 的用法
120 A.43. assertStringMatchesFormatFile() 的用法
121 A.44. assertSame() 的用法
122 A.45. assertSame() 应用于对象时的用法
122 A.46. assertStringEndsWith() 的用法
123 A.47. assertStringEqualsFile() 的用法
124 A.48. assertStringStartsWith() 的用法
125 A.49. assertThat() 的用法
125 A.50. assertTrue() 的用法
128 PHPUnit 手册 x A.51. assertXmlFileEqualsXmlFile() 的用法
128 A.52. assertXmlStringEqualsXmlFile() 的用法
129 A.53. assertXmlStringEqualsXmlString() 的用法
130 B.1. 用@coversDefaultClass 缩短标注
136 1 第1章安装 PHPUnit 需求 PHPUnit 6.5 需要 PHP 7,强烈推荐使用最新版本的 PHP. PHPUnit 需要使用 dom [http://php.net/manual/en/dom.setup.php] 和json [http://php.net/manual/en/ json.installation.php] 扩展,它们通常是默认启用的. PHPUnit 还需要 pcre [........