No.4473【引用】8時間耐久PHPUnitの教室 // Speaker Deck
https://speakerdeck.com/u/yandod/p/8phpunit
トップ > メモ一覧 > カテゴリ「テスト」の絞り込み結果 : 5件
5件中 | 1 〜 5 表示 | 1 |
色なし | $test->run(new |
|
---|---|---|
色つき |
$test->run(new Cnv_Util_TestReporter()); |
&strlen()文字
SimpleTestはPHPUnitと比べてはるかに多くのテスト用メソッドが用意されています。ここではSimpleTestの基本となる UnitTestCaseに実装されているテスト用メソッドの判定条件と、そのメソッドを使った実際に動作するテストケースを用意しました。これらのメ ソッドを利用して、テストの結果が特定の条件を満たしているかどうかをチェックします。一部のメソッドは古いバージョンにはなかったり、PHP4と PHP5で挙動がちがったりするので気を付けて下さい。(今回のテストケースはPHP5で動作させています。)
2つの変数の値が同じ時に成功します。
function testAssertEqual(){
$a = 'hoge';
$b = 'huga';
$this->assertEqual($a, $b);
$a = $b;
$this->assertEqual($a, $b);
}
assertEqualの逆で、2つの値が同じでない場合成功になります。
function testAssertNotEqual(){
$a = 'hoge';
$b = 'huga';
//同じでないので成功
$this->assertNotEqual($a, $b);
$a = $b;
//同じなので失敗
$this->assertNotEqual($a, $b);
}
エラーが発生した時に成功します。
function testAssertError()
{
//エラーは発生していないので失敗
$this->assertError();
trigger_error('error');
//エラーが発生したので成功
$this->assertError();
}
エラーの中にPerlの正規表現で指定した文字列が含まれている場合、成功します。
function testAssertErrorPattern()
{
//エラーメッセージがhogeだったら
$pattern = '/hoge/';
//エラーが発生していないので失敗
$this->assertErrorPattern($pattern);
trigger_error('huga');
//エラーは発生しているがエラーメッセージがhogeではないので失敗
$this->assertErrorPattern($pattern);
trigger_error('hoge');
//hogeというエラーメッセージのエラーが発生したので成功
$this->assertErrorPattern($pattern);
}
エラーがなければ成功。ひとつでもあれば失敗になります。
function testAssertNoErrors()
{
//エラーがないので成功
$this->assertNoErrors();
trigger_error('error');
//エラーがあるので失敗
$this->assertNoErrors();
}
対称のオブジェクトが特定のクラスがどうかを調べ、特定のクラスであれば成功。対称のオブジェクトが特定のクラスのサブクラスであっても成功となります。
function testAssertIsA()
{
$a = new Hoge();
//Hogeを継承したHogeHoge
$b = new HogeHoge();
//$aはHogeクラスなので成功
$this->assertIsA($a, 'Hoge');
//指定するクラス名は小文字でも良い(成功)
$this->assertIsA($a, 'hoge');
//$bの親クラスはHogeなので成功
$this->assertIsA($b, 'Hoge');
}
特定のオブジェクトが指定したクラスでなければ成功となります。assertIsAの全く逆の挙動になるので、特定のオブジェクトが指定したクラスのサブクラスであっても失敗になります。
function testAssertNotA()
{
$a = new Hoge();
//Hogeを継承したHogeHogeクラス
$b = new HogeHoge();
//クラス名が同じなので失敗
$this->assertNotA($a, 'Hoge');
//違うので成功
$this->assertNotA($a, 'huga');
//指定したクラスのサブクラスなので失敗
$this->assertNotA($b, 'Hoge');
}
2つの変数の値と型が一致していた場合成功します。
function testAssertIdentical()
{
$a = '0';
$b = 0;
//数字は同じだが型が違うので失敗
$this->assertIdentical($a, $b);
//文字列0を数値0にキャスト
$a = (int)$a;
//値も型も同じなので成功
$this->assertIdentical($a, $b);
}
assertNotIdenticalと逆で2つの変数が値、型、ともに違えば成功になります。
function testAssertNotIdentical()
{
$a = '0';
$b = 0;
//2つの値は同じだが型は違うので成功
$this->assertNotIdentical($a, $b);
$a = (int)$a;
//型も同じになったので失敗
$this->assertNotIdentical($a, $b);
}
このメソッドは、引数の型がNULL以外の場合テストに失敗します。 以下のテストは両方とも成功になります。
function testAssertNull()
{
$target = null;
$this->assertNull($target, 'type is ' . gettype($target));
//未定義の変数はNULLなので成功
$this->assertNull($undefined, 'type is ' . gettype($undefined));
}
assertNullと逆の動作になります。
function testAssertNotNull()
{
$target = 'aa';
$this->assertNotNull($target, 'type is ' . gettype($target));
//未定義の変数はNULLなので失敗
$this->assertNotNull($undefined, 'type is ' . gettype($undefined));
}
特定の文字列に指定したパターンがマッチすれば成功になります。パターンはPerlの正規表現で記述します。バージョン1.0.1alpha以降で利用できます。
function testAssertPattern()
{
$subject = 'hoge';
$pattern = '/gigigi/';
//hogeにgigigiは存在しないので失敗
$this->assertPattern($pattern, $subject);
$subject = 'gigigi';
//変数の内容が変わりマッチするようになったので成功
$this->assertPattern($pattern, $subject);
}
assertPatternと逆の動作をします。バージョン1.0.1alpha以降で利用できます。
function testAssertNoPattern()
{
$subject = 'hoge';
$pattern = '/gigigi/';
//hogeにgigigiは存在しないので成功
$this->assertNoPattern($pattern, $subject);
$subject = 'gigigi';
//変数の内容が変わりマッチするようになったので失敗
$this->assertNoPattern($pattern, $subject);
}
2つの変数がどちらかの参照渡し(Reference)である場合に成功します。
function testAssertReference(){
$a = new Hoge();
$b = clone $a;
//copyなので失敗
$this->assertReference($a, $b);
$a =& $b;
//参照なので成功
$this->assertReference($a, $b);
}
PHP5から代入はデフォルトで参照渡しになったのでこの関数のテストはPHP4とPHP5で挙動がかわります。
assertReferenceと逆の動作をします。
function testAssertCopy(){
$a = new Hoge();
$b = clone $a;
$this->assertCopy($a, $b);
$a =& $b;
$this->assertCopy($a, $b);
}
PHP5から代入はデフォルトで参照渡しになったのでこの関数のテストはPHP4とPHP5で挙動がかわります。
assertPatternと同じ挙動です。既存のシステムとの互換性を保つ為に用意されているだけなので基本的にassertPatternを使って下さい、(非推奨メソッド)
assertNoPatternと同じ挙動です。既存のシステムとの互換性を保つ為に用意されているだけなので基本的にassertNoPatternを使って下さい、(非推奨メソッド)
第二引数が、「第一引数±第三引数」の間にある場合に成功します。バージョン1.0.1alpha以降で利用できます。
function testAssertWithinMargin()
{
$a = 100;
$b = 105;
$c = 10;
//105は90と110の間にあるので成功
$this->assertWithinMargin($a, $b, $c);
}
assertWithinMarginと逆の動作になります。バージョン1.0.1alpha以降で利用できます。
function testAssertOutsideMargin()
{
$a = 100;
$b = 105;
$c = 10;
//105は90と110の間にあるので失敗
$this->assertWithinMargin($a, $b, $c);
}
以上がユニットテストケースクラスの基本のassertメソッドです。assertメソッド一覧の解説は本家サイトにもないので、複雑なメソッドを利用する時に役立つと思います。
いわゆるUNIT test系のプログラムなのですが。最近 SimpleTest がいたくお気に入り。
理由は「インストールがシンプルだから」。
とりあえず
http://simpletest.sourceforge.net/
からダウンロード。tar ballがゲトれるはずなので、解凍して適当なディレクトリにほぉりこんで終わり。
ああなんてシンプルw
使い方のサンプルは
http://blog.zuzara.com/2007/03/01/194/
とか
http://project-p.jp/halt/kinowiki/php/SimpleTest
とか
とか
http://www.geocities.jp/toyprog/simpletest/first_test_tutorial.html
とか参照。
うるとら大雑把に書くと
<?php require_once(simpletestが入ってるディレクトリ . 'unit_tester.php'); require_once(simpletestが入ってるディレクトリ . 'reporter.php'); require_once(テストしたいクラス); class てけとうなクラス名 extends UnitTestCase { public function __construct() { $this->UnitTestCase(); } public function 適当なメソッド名() { // テストしたい内容をご自由に } } // end of class $test = new てけとうなクラス名; $test->run(new HtmlReporter());
こげな感じ。
内部のメソッドは複数あってもOK。勝手に探し出してくれるらしい。
でも順番とか考えると、あんまりこねくり回さずに1メソッド集約のほうが楽な気もする。
この辺まだちゃんとホゲれてないので、よいアイデアあったら突っ込みよろです。
んで。肝心のテスト方法ってか記法。
とりあえず極めてよく使ってるのが
assertEqual($result, $ans);
$result == $ansがtrueならOKしてくれる………ってまて。2a問題考えると微妙怖いぞ?
実験。結果。………予想通り orz
近いのを探す。光の速さで発見。
assertIdentical($result, $ans);
===なので、2a問題も平気…なはづ。
実験。結果。………予想通りよっしゃ!!
っつわけでとりあえず気を取り直して。
…っても、あと使うのは…
assertNull($value);
が、ようは「値がnullならok」してくれる。これの逆が
assertNotNull($value);
くらい?
なんでか、assertTrue はあまり使いませぬ。assertEqual………もとい、assertIdenticalで片付いてしまうので。
後は、ファクトリ系とかで使うのが
assertIsA ($obj, $type);
ようは「$objが$typeクラスに属してる(当人または子クラス) ならtrue」ってやつです。
厳密には、例外投げたときとかもいろいろやりたいんだけど(あるかもしれないんだけど調べてない)。
とりあえず近々に使う程度にゃ上述のメモで十分かと。おいら的には。
いぢょ。相変わらずのメモ書き〜
5件中 | 1 〜 5 表示 | 1 |