phpUnit 单元测试

当你想把一些东西写到print语句或者调试表达式中时,别这么做,将其携程一个测试来代替. –Martin Fowler

依赖功能
生产者: 能生成被测单元并将其作为返回值的测试方法.
消费者: 是依赖于一个或多个生产者及其返回值的测试方法.

通过用 @depends 标注来表达测试方法之间的依赖关系

如果依赖的生产者测试失败,会中断消费者的执行,并会在结果中显示

消费者可以同时定义多个生产者

数据供给器
测试方法可以接收任意参数.参数由数据供给器提供.

通过 @dataProvider 标注来指定使用哪个数据供给器

数据供给器必须申明为public, 其返回值要么是一个数组,其每个元素也是数组;要么是一个实现了Iterator接口的对象,在对它进行迭代时每步产生一个数组.每个数组都是测试数据集的一部分,将以它的内容作为参数来调用测试方法.

对异常进行测试

通过 @expectedException 标注来测试被测代码中是否抛出了异常

另外可以将 @expectedExceptionMessage, @expectedExceptionMessageRegExp 和 @expectedExceptionCode 与 @expectedException联合使用,来对异常的讯息与代号进行测试.

对输出进行测试
phpUnit使用php的输出缓冲特性来为此提供必要的功能支持
在输出前使用$this->expectOutputString(”);如果输出内容与设定输出内容不符,测试将记为失败.

测试产生输出内容标记:
* 当测试成功时输出
F 当测试方法运行过程中一个断言失败时输出.
E 当测试方法运行过程中产生一个错误时输出.
R 当测试被标记为有风险时输出.
S 当测试被跳过时输出.
I 当测试被标记为不完整或未实现时输出.

phpUnit使用参数
UnitTest
运行由UnitTEst类提供的测试
–coverage-clover
为运行的测试生成带有代码覆盖率信息的xml格式的日志文件.
–coverage-crap4j
生成Crap4j格式的代码覆盖率报告
–coverage-html
生成html格式的代码覆盖率报告
–coverage-php
生成一个序列化后的PHP_CodeCoverage对象.此对象含有代码覆盖率信息.
–coverage-text
为运行的测试以人们可读的格式生成带有代码覆盖率信息的日志文件或命令行输出
–log-junit
为运行的测试生成JUnit XML 格式的日志文件
–log-tap
为运行的测试生成Test Anything Protocol(TAP)格式的日志文件
–log-json
生成JSON格式的日志文件
–testdox-html和–testdox-text
为运行的测试以HTML或纯文本格式生成敏捷文档
–filter
只运行名称与给定模式匹配的测试.如果模式未闭合包裹于分隔符, PHPUnit 将用/分隔符对其进行闭合包裹 可以查看官网的详细例子
–testsuite
只运行名称与给定模式匹配的测试套件
–group
只运行来自指定分组(可以多个)的测试.可以用@group标注为测试标记其所属的分组.@author标注是@group的一个别名,运行按作者来筛选测试.
–exclude-group
排除来自指定分组(可以多个)的测试.可以用@group标注为测试标记其所属的分组.
–list-groups
列出所有有效的测试分组
–test-suffix
只查找文件名以指定后缀(可以多个)结尾的测试文件.
–report-useless-tests
更严格对待事实上不测试任何内容的测试
–strict-coverage
更严格对待意外的代码覆盖
–strict-global-state
更严格对待全局状态篡改
–disallow-test-oupput
更严格对待测试执行期间产生的输出
–disallow-todo-tests
不执行文档注释块中含有@todo标注的测试
–enforce-time-limit
根据测试规模对其加上执行时长限制
–process-isolation
每个测试都在独立的PHP进程中运行
–no-globals-backup
不要备份并还原$GLOBALS
–static-backup
备份并还原用户定义的类中的静态属性
–colors
使用彩色输出 never 完全不使用彩色输出 默认; auto 如果当前中断不支持彩色或者输出被管道输出至其他命令或输出被重定向至文件时,不使用彩色输出,其余情况使用彩色;always 总是使用彩色输出.
–columns
定义输出所使用的列数.如果将其值定义为max, 则使用当前终端所支持的最大列数
–stderr
选择输出到STDERR而非STDOUT
–stop-on-error
首次错误出现后停止执行
–stop-on-failure
首次错误或失败出现后停止执行
–stop-on-risky
首次碰到风险的测试时停止执行
–stop-on-skipped
首次碰到跳过的测试时停止执行
–stop-on-incomplete
首次碰到不完整的测试时停止在执行
–verbose
输出更详细的信息,例如不完整或者跳过的测试的名称
–debug
输出调试信息, 例如当一个测试开始执行时输出其名称
–loader
指定要使用的PHPUnit_Runner_TestSuiteLoader实现
–repeat
将测试重复运行指定次数
–tap
使用Test Anything Protocol(TAP)报告测试进度
–testdox
将测试进度以敏捷文档方式报告
–printer
指定要使用的结果输出器(printer) 输出器类必须扩展PHPUnit_Util_printer并且实现PHPUnit_Framework_TestListener接口
–bootstrap
在测试前先运行一个”bootstrap”PHP文件
–configuration, -c
从XML文件中读取配置信息
如果phpunit.xml 或 phpunit.xml.dist 存在与当前工作目录并且未使用–configuration,将自动从此文件中读取配置
–no-configuration
忽略当前工作目录下的phpunit.xml与phpunit.xml.dist
–include-path
向PHP的include_path开头添加指定路径
-d
设置指定的php配置选项的值

基境
setUp()
在运行某个测试方法前调用
tearDown()
在测试方法运行结束后,不管是成功还是失败,都会调用
setUpBeforeClass()
在测试用例类的第一个测试运行之前调用
tearDownAfterClass()
在测试用例类的最后一个测试运行之后调用

测试目录
当执行测试命令时,执行器指向一个目录时, 它会在目录下查找*Test.php

可以在配置文件内指定测试顺序,不然测试顺序是无序的

测试状态
测试成功, 测试失败, 未完成
测试中通过调用$this->markTestIncomplete(“message”);可以把该测试标记未未完成

测试中通过调用$this->markTestSkipped(“message”);可以跳过该测试

数据库测试
需要实现两个抽象方法
getConnection()
getDataSet()

断言:
assertArrayHasKey(key, array) 判断数组是否存在指定key
assertArrayNotHasKey(key, array) 判断数组是否不存在指定key
assertClassHasAttribute(attribute, class)判断类是否存在指定属性
assertClassNotHasAttribute(attribute, class)判断类是否不存在指定属性
assertArraySubset(subsetArray, array)判断数组是否存在指定内容
assertClassHasStaticAttribute(attribute, class)判断类是否存在指定静态属性
assertContains(needle, haystack)判断内容是否存在指定值(数组,字符串)
assertNotContains(needle, haystack)判断内容是否不存在指定值
assertContainsOnly(type, haystack)判断内容是否仅包含指定类型
assertNotContainsOnly(type, haystack)判断内容是否不仅包含指定类型
assertContainsOnlyInstancesOf(class, haystack)判断内容是否仅包含类class
assertCount()判断元素数量与指定值是否一致
assertNotCount()判断元素数量与指定值是否不一致
assertEmpty()判断元素是否为空
assertNotEmpty()判断元素是否不为空
assertEqualXMLStructure()判断XML结构是否相同
assertEquals()判断元素是否相同
assertFalse()判断是否为false
assertNotFalse()判断是否不为false
assertFileEquals()判断文件内容是否相同
assertFileExists()判断文件是否存在
assertGreaterThan()判断值是否大于指定值
assertGreaterThanOrEqual()判断值是否不大于或者等于指定值
assertInfinite()判断值是否无限大
assertInstanceOf()判断内容是否为指定内容的实例
assertInternalType()判断内容是否为指定类型
assertJsonFileEqualsJsonFile()判断json文件内容是否相同
assertJsonStringEqualsJsonFile()判断json内容和json文件内容是否相同
assertJsonStringEqualsJsonString()判断json内容是否相同
assertLessThan()判断值是否小于指定值
assertLessThanOrEqual()判断值是否小于或者等于指定值
assertNan()判断值的类型是否为Nan
assertNull()判断值的类型是否为null
assertObjectHasAttribute()判断对象是否有指定属性
assertObjectNotHasAttribute()判断对象是否无指定属性
assertRegExp()判断内容是否符合正则
assertStringMatchesFormat()判断内容是否符合指定格式
%e: 表示目录分隔符
%s: 一个或多个除了换行符以外的任意字符
%S: 零个或多个除了换行符以外的任意字符
%a: 一个或多个包括换行符在内的任意字符
%A: 零个或多个包括换行符在内的任意字符
%w: 零个或多个空白字符
%i: 带符号整数值
%d: 无符号整数值
%x: 一个或多个十六进制字符.所谓十六进制字符,指的是在以下范围内的字符: 0-9, a-f, A-F
%f: 浮点数
%c: 单个任意字符
assertStringMatchesFormatFile()判断内容是否匹配指定文件内容所一定的格式
assertSame() 判断内容是否全等
assertStringEndsWith() 判断内容是否以指定内容结尾
assertStringEqualsFile() 判断内容和文件内容是否相同
assertStringStartsWith() 判断内容是否以指定内容开头
assertTrue() 判断内容是否为true
assertXmlFileEqualsXmlFile() 判断Xml文件是否相同
assertXmlStringEqualsXmlFile()判断Xml文件和Xml内容是否相同
assertXmlStringEqualsXmlString()判断Xml内容是否相同
assertThat() ???

标注
@author 允许基于作者对测试进行过滤
@after 此方法应当在测试用例类中的每个测试方法运行完成之后调用
@afterClass 此静态方法应该用于测试类中所有测试方法都运行完成之后调用
@backupGlobals 定义全局变量的备份与还原开关 disabled/enabled
@backupStaticAttributes 定义备份所有已声明的类的静态属性的值开关 disabled/enabled
@before 此方法应当在测试用例类中的每个测试方法开始运行之前调用
@beforeClass 此静态方法应该用于测试类中的所有测试方法都运行完成之后调用
@codeCoveragelgnore* 标注用于从覆盖率分析中排除掉某些代码行
@covers 用来指明测试方法想要对哪些方法进行测试
@coversDefaultClass 用来指定一个默认的命名空间或类名
@coversNothing 指定所标注的测试用例不需要记录任何代码覆盖率信息
@dataProvider 数据供给器
@depends 建立依赖关系
@expectedException 用来测试被测试代码中是否抛出了异常
@expectedExceptionCode 用来对抛出异常的代码做出断言
@expectedExceptionMessage 用来对抛出异常的代码做出断言
@expectedExceptionMessageRegExp 用来对抛出异常的代码做出断言
@group 用来标记该测试属于一个或多个组
@large 用来标记该测试启用大型超时限制
@medium用来标记该测试启用中型超时限制
@preserveGlobalState PHPUnit保持全局状态开关 disabled/enabled
@requires 标注该测试的前提条件
@runTestsInSeparateProcesses 指明单个测试类的所有测试要各自运行在独立的PHP进程中
@runInSeparateProcess 指明某个测试要运行在独立的PHP进程中
@small 用来标记该测试启用小型超时限制
@test 用来标识该方法是测试方法
@uses 用来指明哪些将会在测试中执行到但同时又不打算让其被测试所覆盖的代码
@testdox ???
@ticket ???

Categories: PHP, 后端开发