返回首页

PHPUnit 基本用法

PHPUnit 常见的 assertion 和一个简单的测试示例。

发布 2017年6月02日 标签 #php #testing

~/posts/phpunit-basic $ cat post.md

/ 语言 EN / 中文
/ 主题 / /

单元测试的核心思路是从小组件入手,避免在大块代码里盲目 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

返回首页