单元测试文档学习笔记
注意事项:
- 编写单元测试,方法块注释不随意填写, 防止出现使用单元测试提供的注释语法无法使用
注释依赖(测试中的流程控制)
- 当某个测试所依赖的测试
- 失败时,PHPUnit 会跳过这个测试。 例如:测试a 需要 测试b获取的值 来进行测试a的测试; 可以用注释依赖进行值传递
- 如果测试同时从 @dataProvider 方法和一个或多个 @depends 测试接收数据,那么来自于数据供给器的参数将先于来自所依赖的测试的。来自于所依赖的测试的参数对于每个数据集都是一样的。
- 如果一个测试依赖于另外一个使用了数据供给器的测试,仅当被依赖的测试至少能在一组数据上成功时,依赖于它的测试才会运行。使用了数据供给器的测试,其运行结果是无法注入到依赖于此测试的其他测试中的。
详细使用参考: 手册
数据供给器(自动迭代)
- 测试a 需要多种数据进行测试, 用数据供给器后,会自动迭代测试数据供给器提供的数据进行测试.
测试方法可以接受任意参数。这些参数由数据供给器方法(在 writing-tests-for-phpunit.data-providers.examples.DataTest.php
中,是 ``additionProvider()方法)提供。用 @dataProvider 标注来指定使用哪个数据供给器方法。
数据供给器方法必须声明为
public,其返回值要么是一个数组,其每个元素也是数组;要么是一个实现了 Iterator 接口的对象,在对它进行迭代时每步产生一个数组。每个数组都是测试数据集的一部分,将以它的内容作为参数来调用测试方法。
Example 2.5 使用返回数组的数组的数据供给器
<?phpuse PHPUnit\Framework\TestCase;
class DataTest extends TestCase{ /** * @dataProvider additionProvider */ public function testAdd($a, $b, $expected) { $this->assertEquals($expected, $a + $b); }
public function additionProvider() { return [ [0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 3] ]; }}?>详细使用参考: 手册
测试出现异常:
标注来测试被测代码中是否抛出了异常。
-
php原生异常 使用
PHPUnit\Framework\Error来注释PHPUnit\Framework\Error\Notice和PHPUnit\Framework\Error\Warning分别代表 PHP 通知与 PHP 警告。 -
如果测试依靠会触发错误的 PHP 函数,例如 fopen ,有时候在测试中使用错误抑制符会很有用。通过抑制住错误通知,就能对返回值进行检查,否则错误通知将会导致抛出 PHPUnit\Framework\Error\Notice。
对异常进行测试是越明确越好的。对太笼统的类进行测试有可能导致不良副作用。因此,不再允许用 @expectedException 或 setExpectedException() 对 Exception 类进行测试。
测试的功能或代码, 编写的测试运行后断言肯定会抛出异常,可以用@expectException指定抛出的异常类型;如果抛出异常类型同注释异常类型一致,结果为测试成功;
@expectedExceptionCode (异常错误码)、@expectedExceptionMessage (异常信息)和 @expectedExceptionMessageRegExp (异常信息正则匹配)
详细使用参考: 手册
对输出进行测试(echo等)
如echo, print. 单元测试使用输出缓冲区控制方式获取此内容 详见手册
方法:手册
phpunit可生成日志(搭配Xdebug)
基镜(测试基础环境)
在执行测试时,有时需要预先搭建测试环境. 类似于php的魔术方法行为;
测试替身
-
桩件 在桩件中,创建测试所需要的对象,所需要的对象可能依赖或者创建复杂使用难度高
有时候对被测系统(SUT)进行测试是很困难的,因为它依赖于其他无法在测试环境中使用的组件。这有可能是因为这些组件不可用,它们不会返回测试所需要的结果,或者执行它们会有不良副作用。在其他情况下,我们的测试策略要求对被测系统的内部行为有更多控制或更多可见性。 使用桩件可以替换掉被测试系统所依赖的实际组件;返回配置好返回值的测试替身(桩件)的方法称为上桩;
- 可以固定简单返回值,也可以使用变量实现更复杂的上桩
willReturn($value)orwill($this->returnValue($value)) - 返回对桩件对象的引用
will($this->returnSelf()); - 不同参数对应的不同返回值方式上桩
returnValueMap(array $map); - 让上桩方法返回回调函数或方法的结果
returnCallback(); - 直接给出期望返回值的列表
will($this->onConsecutiveCalls(2, 3, 5, 7));调用顺序返回 - 抛出异常
will($this->throwException(new Exception));
- 可以固定简单返回值,也可以使用变量实现更复杂的上桩
-
仿件对象 使用仿件对象,主要的功能是验证预期的行为,作为观察点来核实被测试系统在测试中的间接输出。
-
方法的执行次数
expects($this->once())->method('update') -
传入方法的参数
with($this->equalTo('something')); -
对特质(Trait)与抽象类进行模仿
-
对 Web 服务(Web Services)进行上桩或模仿
-
对文件系统进行模仿
-
public function testMockBuy(){$appleMock = $this->getMockBuilder(Apple::class)->setMethods(['getPrice', 'buy'])->getMock();//建立预期情况,buy方法会被调用一次$appleMock->expects($this->once())->method('buy');$this->custom->buy($appleMock, 10);}
-
部分信息可能已经过时