テスト駆動開発についてはネットでもよく話題になっており、Baidu や Google で検索してみたところ、PHP に関する記事もいくつかありましたが、テスト駆動開発に関する記事はあまり見かけませんでした。モック (偽装オブジェクト) を使用する技術について説明するには、ここに記事を書いてください。
まず、テスト駆動開発の基本概念を見てみましょう。最初にテスト ケースを作成し (通常、これらのテスト ケースは、迅速なロールバック実行を容易にするための自動化された単体テスト ケースです)、その後、テスト ケースを徐々に修復します。製品コードがコンパイルされ、最終テスト ケースが修復されると、製品が完成します。
私自身の実践から、クラス ライブラリを開発するときにテスト駆動開発テクノロジを使用するのは良い解決策だと思います。その理由は次のとおりです。
テスト ケースを作成できるようになります。問題の領域を説明する すでに明確に理解しています。
ドキュメントを作成する時間を節約できます。テスト ケースは、クラス ライブラリによって呼び出されるサンプル コードです。
クラス ライブラリを作成するプロセスがテスト ケースを修復するプロセスであるため、コードの品質が保証されます。そのため、テスト ケースが修復された後にクラス ライブラリが完成します。
時間の見積もりが簡単。クラス ライブラリの開発時間の見積もりの問題は、テスト ケースの修復時間の見積もりに帰着します。これは比較的簡単に見積もりが可能です。
文字列を数値に変換する関数の作成を例にしてテスト駆動開発の概念を説明し、Mock テクノロジーを紹介します。始める前に、PHPUnit と Mockery ライブラリをインストールする必要があります (この記事では PHPUnit に付属の Mock ライブラリは使用しません):
# 安装PHPUnitpear config-set auto_discover 1pear install pear.phpunit.de/PHPUnit# 安装Mock库sudo pear channel-discover pear.survivethedeepend.comsudo pear channel-discover hamcrest.googlecode.com/svn/pearsudo pear install --alldeps deepend/Mockery
テスト駆動開発の概念から行う場合は、次のように書きます。テスト ケースを最初に実行しますか? parseinttest.php:
<? class ParseIntTest extends PHPUnit_Framework_TestCase { public function testParseIntBasic() { $v = parse_int("12345"); $this->assertEquals(12345, $v); $v = parse_int("-12345"); $this->assertEquals(-12345, $v); /* $v = parse_int("abcd"); $this->assertEquals(0, $v); $v = parse_int("0xab12"); $this->assertEquals(0xab12, $v); $v = parse_int("01b"); $this->assertEquals(1, $v); */ } }?>
上記のコードでは、単体テスト ケースを通じて実装される関数 parse_int の要件を指定します。つまり、整数、符号付き整数を解析できます。時間とリソースの制約のため、16 進数と 2 進数のサポートを削除しました。
次のコマンドを実行してテスト ケースを実行します。
phpunit --verbose parseinttest
現時点ではコードがないため、PHPUnit は parse_int 関数を使用できないことを示す予想されるエラーを受け取りますか?見つかりました:
PHPUnit 3.6.12 by Sebastian Bergmann.
PHP 致命的エラー: /var/www/pmdemo/parseinttest2.php の 6 行目で未定義関数 parse_int() を呼び出します
次に、最初に空のスペースを作成しましょう parse_int 関数? parseint.php:
<? function parse_int($str) { return 0; }?>
上記のコードでは、最初に関数 parse_int のロジックを実装せず、テスト ケースを実行すると、次の結果が得られます。
shiyimin@ubuntu:/var /www/pmdemo$ phpunit --verbose parseinttest
PHPUnit 3.6.12 by Sebastian Bergmann.
F
時間: 0 秒、メモリ: 2.75Mb
失敗が 1 つありました:
1) ParseIntTest::testParseIntBasic
0 が期待される 12345 と一致するというアサートに失敗しました。
/var/www/ pmdemo/parseinttest.php:7
FAILURES!
テスト: 1、アサーション: 1、失敗: 1.
上記の赤で強調表示されたエラー メッセージから、最初のテスト ケースの判定が失敗しました。つまり、次の判定ステートメントが正常に実行されませんでした:
$this->assertEquals(12345, $v);
これは、parse_int 関数が常に値 0 を返すためです。このエラーが見つかったので、このロジックを完成させましょう。テスト ケースを修正します:
parseint.php
<? function parse_int($str) { $result = 0; $i = 0; for ( $i = 0; $i < strlen($str); ++$i ) { $result *= 10; $result += $str[$i] - '0'; } return $result; }?>
テスト ケースを再度実行します:
shiyimin@ubuntu:/var/www/pmdemo$ phpunit --verbose parseinttest
PHPUnit 3.6 .12 by Sebastian Bergmann.
F
時間: 0 秒、メモリ: 2.75Mb
失敗が 1 つありました:
1) ParseIntTest:: testParseIntBasic
12345 が予想される -12345 と一致するというアサートに失敗しました。
/var/www/pmdemo/parseinttest.php:10
失敗! >テスト: 1、アサーション: 2、失敗: 1。
parseint.php
<? function parse_int($str) { $result = 0; $i = 0; $neg = 1; if ( $str[0] == '-' ) { $neg = -1; } for ( $i = 0; $i < strlen($str); ++$i ) { $result *= 10; $result += $str[$i] - '0'; } return $result * $neg; }?>
shiyimin@ubuntu:/var/www/pmdemo$ phpunit --verbose parseinttest
PHPUnit 3.6. 12 by Sebastian Bergmann.
時間: 0 秒、メモリ: 2.75Mb
OK (1 つのテスト、2 つのアサーション)
はい、今回はすべてのテスト ケースが完了し、製品コードの実装が完了しました。もちろん、説明の便宜上、上記のコードは完全な実装ではありません。文字列 "+12345" を処理できません。
次の記事では、PHPUnit で Mock テクノロジを適用する方法について説明します。