ざっくりとPHPUnitマニュアル読みつつやってみる

2013-01-05T00:00:00+00:00 PHP

タイトル通りなんでkwskは(ry

ディレクトリ構造

├── bootstrap.php (PHPUnitのbootstrapスクリプト)
├── lib
│   └── class.php (テスト対象とするクラス)
├── phpunit.xml (PHPUnitの設定ファイル)
└── tests
    ├── sample1.php
    ├── sample2.php
    └── sample3.php

別にPHPUnitの設定ファイルは作らなくてもテストスクリプトをphpunitコマンドを使ってやればテスト出来るけど、そんなんめんどいのでXML設定でテストスイートを定義出来るのでそれを使う。んでライブラリの読み込みはbootstrapで行なって一回だけやるような感じで

lib/class.php

<?php

class Sample {
    private static function _add($nums) {
        $sum = 0;

        if (is_array($nums)) {
            foreach ($nums as $num) {
                if (!is_int($num)) {
                    continue;
                }

                $sum += $num;
            }
        }

        return $sum;
    }

    public static function add() {
        return static::_add(func_get_args());
    }

    public static function add_half() {
        $num = static::_add(func_get_args());

        return $num / 2;
    }
}

ってな感じで適当なクラスをでっち上げといた。これをテストする名目でPHPUnitを勉強する形で

単純にメソッドをテスト (tests/sample1.php)

<?php

class Sample1TestCase extends PHPUnit_Framework_TestCase {
    public function test_add_half() {
        $this->assertThat(Sample::add_half(1, 2, 3), $this->equalto(3));
    }
}

データプロバイダを使う (tests/sample2.php)

<?php

class Sample2TestCase extends PHPUnit_Framework_TestCase {
    /**
     * @dataProvider _provider
     */
    public function test_provider($data) {
        $this->assertTrue(is_int($data));
    }

    public function _provider() {
        return array(
            array(1),
            array(2)
        );
    }
}

@dataProviderなアノテーションで指定したメソッドから返される値(多次元配列、もしくはイテレータである必要がある模様)が、アノテーションを設定したテストメソッドの引数にバインドしてテストする事が可能な模様

出力内容をテスト (tests/sample3.php)

<?php

class Sample3TestCase extends PHPUnit_Framework_TestCase {
    public function test_output_callback() {
        $this->expectOutputRegex("/^[a-z]+$/");

        echo "abc";
    }
}

expectOutputRegex/expectOutputString等のメソッドを利用する事でecho/print等による出力制御をテストする事が可能

以上がとりあえずなテストケース

phpunit.xml

<?xml version="1.0" ?>
<phpunit bootstrap="bootstrap.php">
    <testsuites>
        <testsuite>
            <directory suffix=".php">tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

まぁFuelPHPを勉強した事があるのなら結構おなじみかと

bootstrap.php

<?php
require_once("lib/class.php");

実行

phpunit -c phpunit.xml

別に-c phpunit.xmlにしなくても、デフォルトがphpunit.xmlな模様なのでphpunitを実行するディレクトリ内にあれば指定しなくてもいい

PHPUnit+DbUnit Mockitoの件 (2)