Unitテスト | Test

Unitテストでは Functionalテスト よりも小さな単位、例えばクラス単位でのテストを行います。
※Unitテストを実行するには PHPUnit が必要です。

例として、下記のクラスをテストしてみましょう。
class Calc
{
  protected $num1 = 0;
  protected $num2 = 0;
  
  public function __construct($num1 = 0, $num2 = 0)
  {
    $this->num1 = $num1;
    $this->num2 = $num2;
  }
  
  public function setNum1($num)
  {
    $this->num1 = $num;
  }
  
  public function setNum2($num)
  {
    $this->num2 = $num;
  }
  
  public function add()
  {
    return $this->num1 + $this->num2;
  }
  
  public function sub()
  {
    return $this->num1 - $this->num2;
  }
  
  public function multi()
  {
    return $this->num1 * $this->num2;
  }
  
  public function div()
  {
    return $this->num1 / $this->num2;
  }
}
※話を簡潔するために数値かどうかのチェックやゼロ除算チェックはコードに含んでいません。

それでは、テストを作成します。Unitテスト用のテストケースは tests/unit 以下に配置します。ここではテストケースの名前を Calc とします。
tests/unit/Calc.php

class Unit_Calc extends Sabel_Test_TestCase
{
  
}
まずは下記のように testAdd() により、足し算が正しく行われるかのテストを行います。
テストメソッドのメソッド名は必ず "test" で始まるようにします。
class Unit_Calc extends Sabel_Test_TestCase
{
  public function testAdd()
  {
    $calc = new Calc(10, 20);
    $this->eq(30, $calc->add());
    
    $calc->setNum1(20);
    $this->eq(40, $calc->add());
  }
}
$ sakle UnitTest Calc
PHPUnit 3.4.3 by Sebastian Bergmann.

.

Time: 0 seconds

OK (1 test, 2 assertion)
※テスト実行(タスク)に関してはこちらを参照してください。

同じように testMulti() により、掛け算が正しく行われるかのテストを行います。
class Unit_Calc extends Sabel_Test_TestCase
{
  ...
  
  public function testMulti()
  {
    $calc = new Calc(10, 20);
    $this->eq(200, $calc->multi());
    
    $calc->setNum2(30);
    $this->eq(300, $calc->multi());
  }
}
$ sakle UnitTest Calc
PHPUnit 3.4.3 by Sebastian Bergmann.

.

Time: 0 seconds

OK (2 test, 4 assertion)
このようにUnitテストを行っておけばリファクタリングなど内部実装を変更した際に、既に動いてるものに影響が出ないことを(高い確率)で保証できます。また、先にテスト(そのクラスを使用する側のイメージ)を書いておき、それらテストをパスするように実装していく、のようなことも出来るかもしれません。