PHPUnit3で始めるユニットテスト

第2回 ショッピングカートクラスを作ってみる(1)

この記事を読むのに必要な時間:およそ 7 分

ショッピングカートクラスを作ってみる

これから,実際にPHPUnitを使ってテストケースを書きつつ,クラスの実装を行ってみましょう。今回作成するのは,以下の機能を持つ簡易的なショッピングカートクラス(Cartクラス)です。

  • 前提条件:商品コード,数量共に自然数とする
  1. 初期状態では,カートに入れられた商品数は0
  2. 商品を追加する場合,商品コードと数量(正数)を指定する
  3. 数量を変更する場合,商品コードと変更する数量(整数)を指定する
  4. 商品コードを指定して,カートに入っている数量を取得できる
  5. すべての商品コードと数量をまとめて取得できる
  6. クリアすると,カートは初期状態になる

1番目の仕様「初期状態では,カートに入れられた商品数は0」

それでは早速,1番目の仕様である

初期状態では,カートに入れられた商品数は0

を実装していきましょう。まずは,テストケースから作成しましょう。Cartクラスのテストケースなので,テストケースのクラス名をCartTest,ファイル名をCartTest.phpとします。

<?php
require_once 'PHPUnit/Framework.php';

class CartTest extends PHPUnit_Framework_TestCase
{
}

それではphpunitコマンドを実行してみます。

$ phpunit CartTest
PHPUnit 3.1.7 by Sebastian Bergmann.

F

Time: 0 seconds

There was 1 failure:

1) Warning(PHPUnit_Framework_Warning)
No tests found in class "CartTest".

FAILURES!
Tests: 1, Failures: 1.
$ 

実行するテストがまだ存在しないため,失敗してしまいます。それでは,1つ目の仕様に対するテストを書いてみます。ただし,1つ目の仕様だけでは「どうやって初期状態の商品数が0であることをテストするか?」が書きにくいと思います。そこで,5番目の仕様

すべての商品コードと数量をまとめて取得できる

と併せてテストを書いていくことにします。また,5番目の仕様で実装する予定のメソッドをgetItemsメソッドとし,getItemsメソッドは商品コードをキー,カートに入れられた商品の数を値とするハッシュを返すものとしました。

<?php
require_once 'PHPUnit/Framework.php';

class CartTest extends PHPUnit_Framework_TestCase
{
    public function testInitCart() {
        $cart = new Cart();
        $this->assertTrue(is_array($cart->getItems()));
        $this->assertEquals(0, count($cart->getItems()));
    }
}

そして,再びphpunitコマンドを実行します。

$ phpunit CartTest
PHPUnit 3.1.7 by Sebastian Bergmann.

PHP Fatal error:  Class 'Cart' not found in /home/shimooka/public_html/gihyo.jp/01.phpunit/CartTest.php on line 7

Fatal error: Class 'Cart' not found in /home/shimooka/public_html/gihyo.jp/01.phpunit/CartTest.php on line 7
$ 

今度はCartクラスが存在しないためのFatal errorとなりました。必要最低限のCartクラスとメソッドの枠だけ作成し(Cart.php),テストケースで読み込むようにしましょう。

<?php
class Cart
{
    public function getItems() {
    }
}
<?php
require_once 'PHPUnit/Framework.php';
require_once 'Cart.php';

class CartTest extends PHPUnit_Framework_TestCase
{
    public function testInitCart() {
        $cart = new Cart();
        $this->assertTrue(is_array($cart->getItems()));
        $this->assertEquals(0, count($cart->getItems()));
    }
}

そしてphpunitコマンドの実行です。

$ phpunit CartTest
PHPUnit 3.1.7 by Sebastian Bergmann.

F

Time: 0 seconds

There was 1 failure:

1) testInitCart(CartTest)
Failed asserting that <boolean:false> is true.
/home/shimooka/public_html/gihyo.jp/01.phpunit/CartTest.php:9

FAILURES!
Tests: 1, Failures: 1.

$this->assertTrueメソッドでfalseが返ってきているためのエラーのようです。まだCartクラスのgetItemsメソッドを実装していたいためなので当然ですね。では,getItemsメソッドを実装しましょう。

<?php
class Cart
{
    public function getItems() {
        return array();
    }
}
$ phpunit CartTest
PHPUnit 3.1.7 by Sebastian Bergmann.

.

Time: 0 seconds


OK (1 test)
$ 

「えっ?」と思われたかも知れませんが,まずはテストが通るようになりました。ひとまず,これで実装完了としておきましょう。

著者プロフィール

下岡秀幸(しもおかひでゆき)

PHP関連の情報サイト「Do You PHP?」の管理人。PHP歴は長いが,あまり仕事で使ったことがないという噂がある。最近はα版のPEAR・PECLに手を出しては地雷を踏んでいることが多い。

URLhttp://www.doyouphp.jp/http://d.hatena.ne.jp/shimooka/

コメント

コメントの記入