PHPUnit 基本用法
PHPUnit 常见的 assertion 和一个简单的测试示例。
~/posts/phpunit-basic $ cat post.md
单元测试的核心思路是从小组件入手,避免在大块代码里盲目 debug。PHP 这边的常用工具是 PHPUnit。
基础语法
几个常用 assertion:
assertTrue(true); # SUCCESSFUL
assertEquals('orz', 'oxz', 'The string is not equal'); # UNSUCCESSFUL
assertCount(1, array('Monday')); # SUCCESSFUL
assertContains('PHP', array('PHP', 'Java', 'Ruby')); # SUCCESSFUL
中途遇到失败的 assertion 测试会中断。每个 assertion 最后都可以再传一个字符串参数,用作失败时的提示信息。
一个例子
下面是用户与活动关系的业务类示例:
class User
{
public $id;
public $name;
public $email;
public function __construct($id, $name, $email)
{
$this->id = $id;
$this->name = $name;
$this->email = $email;
}
}
class Event
{
public $id;
public $name;
public $start_date;
public $end_date;
public $deadline;
public $attendee_limit;
public $attendees = array();
public function __construct($id, $name, $start_date, $end_date, $deadline, $attendee_limit)
{
$this->id = $id;
$this->name = $name;
$this->start_date = $start_date;
$this->end_date = $end_date;
$this->deadline = $deadline;
$this->attendee_limit = $attendee_limit;
}
public function reserve($user)
{
$this->attendees[$user->id] = $user;
}
public function getAttendeeNumber()
{
return sizeof($this->attendees);
}
}
对应的测试:
require_once('../src/phpunitdemo/UserDemo.php');
require_once('../src/phpunitdemo/EventDemo.php');
class EventTest extends PHPUnit_Framework_TestCase
{
public function testReserve()
{
$eventId = 1;
$eventName = '活動1';
$eventStartDate = '2014-12-24 18:00:00';
$eventEndDate = '2014-12-24 20:00:00';
$eventDeadline = '2014-12-23 23:59:59';
$eventAttendeeLimit = 10;
$event = new Event($eventId, $eventName, $eventStartDate,
$eventEndDate, $eventDeadline, $eventAttendeeLimit);
$userId = 1;
$userName = 'User1';
$userEmail = '[email protected]';
$user = new User($userId, $userName, $userEmail);
$event->reserve($user);
$expectedNumber = 1;
$this->assertEquals($expectedNumber, $event->getAttendeeNumber());
$this->assertContains($user, $event->attendees);
}
}
按这种模式逐个 class 写测试就可以了。
这里用的
PHPUnit_Framework_TestCase是 PHPUnit 6 之前的旧基类,现在标准写法是extends TestCase。