ざっくりとPHPUnitマニュアル読みつつやってみる
タイトル通りなんで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を実行するディレクトリ内にあれば指定しなくてもいい