2 编写PHPUnit测试
类测试
- 针对类的测试,命名习惯是
$className+Test
,即类名+Test
。 - 该类通常继承
PHPUnit\Framework\TestCase
- 测试方法都是以
test+$functionName
命名的,配合phpDocumentor
,可以在注释中使用@test
方法标注为测试方法 - 继承的
PHPUnit\Framework\TestCase
中有很多判断方法,这些方法都是以assert
开头的。
具体的函数名太多了,肯定记不住,就说他们的大致内容,当你需要的时候再去找对应的方法:
- 数据类型判断,
int
,float
,string
等 - 文件,路径等,该文件是否可读,路径是否存在,该文件是否存在等
- 数组判断,该数组中是否有该值
- 字符串判断,字符串是否以指定字符串开头,字符串是否包含指定字符
- xml文件判断,两个xml文件是否相等等
- 对象判断,该对象是否包含指定属性,两个对象是否相同,该对象是否是一个类的实例等
- 大于,小于等判断
以上判断有是否相等,就会有不想等的对应函数。
<?php
use PHPUnit\Framework\TestCase;
class StackTest extends TestCase
{
public function testPushAndPop()
{
$stack = [];
// 判断是否相同
$this->assertEquals(0, count($stack));
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertEquals(1, count($stack));
$this->assertEquals('foo', array_pop($stack));
$this->assertEquals(0, count($stack));
}
}
?>
判断都是正确时,系统执行结果:
判断错误,系统执行结果:
测试依赖关系:@depends
PHPUnit支持对测试方法之间的显式依赖关系进行声明。这种依赖关系并不是定义在测试方法的执行顺序中,而是允许生产者(producer)返回一个测试基境(fixture)的实例,并将此实例传递给依赖于它的消费者(consumer)们。
- 生产者(producer),是能生成被测单元并将其作为返回值的测试方法。
- 消费者(consumer),是依赖于一个或多个生产者及其返回值的测试方法。
class UserStoreTest extends TestCase{
public function testDepends(){
$this->testPop(
$this->testPush(
$this->testEmpty()
)
);
}
public function testEmpty()
{
$stack = [];
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testEmpty
*/
public function testPush(array $stack)
{
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
return $stack;
}
/**
* @depends testPush
*/
public function testPop(array $stack)
{
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
我感觉没有特定的生成者与消费者,而是看调用关系,比如testPush
依赖testEmpty
,则testEmpty
是生产者,而testPush
是消费者。再来看testPop
和testPush
,testPush
这时就是生产者,而testPop
则是消费者。
默认情况下,生产者所产生的返回值将“原样”传递给相应的消费者。这意味着,如果生产者返回的是一个对象,那么传递给消费者的将是一个指向此对象的引用。如果需要传递对象的副本而非引用,则应当用 @depends clone 替代 @depends。
class UserStoreTest extends TestCase{
public function testOne()