ホームページ >php教程 >php手册 >phpUnit を使用して PHP プログラムのデバッグに役立てる

phpUnit を使用して PHP プログラムのデバッグに役立てる

WBOY
WBOYオリジナル
2016-06-21 09:07:401162ブラウズ

プログラム

プログラムのデバッグは長いプロセスです。プログラムが長く複雑になればなるほど、デバッグは難しくなります。 PHP プログラムをデバッグしている場合は、デバッグを大幅に高速化できる phpUnit を使用するとよいでしょう。
PhpUnit とは何ですか?
PhpUnit は、Fred Yankowski によって作成された有名な Junit テスト フレームワークから生まれました。 Web サイト http://www.ontosys.com/phiki/phpunit にアクセスして、最新バージョンをダウンロードできます。 phpUnit を使用してテスト パッケージを作成できます。プログラムコードが正しいことを確認してください。すべてのテストは、わずか 1 ステップで自動的に完了できます。
バグが検出された場合は、小さなテストコードを作成して、エラーがどこにあるかを見つけることができます。今後同じバグが再び発生した場合は、以前のテスト パッケージを実行するだけですぐに発見できます。テスト スイートを頻繁に実行すると、プログラム コードの堅牢性が保証されます。
開始
銀行口座処理プログラムがあると仮定します。次に、Account クラスのテスト パッケージを作成する必要があります。
以下はAccountクラスのソースコードです:

class Account{
var $balance;
function Account($initialBalance=0){
$this->balance = $initialBalance;
function;引き出し( $amount){
$this->残高 -= $amount;
}
関数デポジット($amount){
$this->残高 += $amount
}
function getBalance(){
return $this ->残高
}
関数 transferFrom(&$sourceAccount,$amount){
$sourceAccount->withdraw($amount);
$this->deposit($amount); ;

テストクラスを作成する

まず、PhpUnitが提供するTestCaseのサブクラスであるテストクラスAccountTestを作成します。この TestCase クラスには、setUp と TearDown という 2 つの基本メソッドがあります。 これら 2 つのメソッドの実装は親クラスの空のプロセスであるため、自分でオーバーロードする必要があります。 SetUp は、AccountTest クラスを初期化するために使用されます。この例では、テストで使用されるいくつかのアカウントを初期化します。 tearDown は、AccountTest クラスをクリアするために使用されますが、この例では必要ありません。したがって、過負荷にはなりません。 AccountTester クラスのソースコードは次のとおりです。

class AccountTester extends TestCase{
var $_ac2;
var $_ac4; name){
$this->TestCase($name); // 親コンストラクターを呼び出す
}
function setUp(){
$this->_ac1 = new Account(100); // testWithdraw のデータ
$this ->ac2 = new Account(20); // testDeposit のデータ
$this->_ac3 = new Account(30); // testTransferFrom のデータ
$this->_ac4 = new Account(50); }
}
?>

特別なテストコードを追加する
これで、AccountTesterクラスにテストコードを追加できます。


// _ac1 から 25 ユニットを引き出します
// _ac1 の初期残高は 100 です
function testWithdraw(){
$this->_ac1->withdraw(25); $this->assert($this->_ac1->getBalance() == 75); // 100 - 25 = 75
}

// _ac2 に 10 ユニットを入金します。初期残高は20

function testDeposit(){
$this->_ac2->deposit(10);
$this->assertEquals(30,$this->_ac2->getBalance()); //20 +10 = 30
}

// _ac3 から _ac4 に 10 ユニットを転送
// _ac3 の初期残高は 30
// _ac4 の初期残高は 50

function testTransferFrom(){
$this->_ac4 ->transferFrom(&$this->_ac3,10);
$this->assertEquals(20,$this->_ac3->getBalance(),"ソースアカウントの残高が正しくありません"); - 10 = 20
$this->assertEquals(60,$this->_ac4->getBalance(),"ターゲットアカウント残高が正しくありません") // 50 + 10 = 60
}
?>
;
このコードでは、assert (C のアサーションと同様) メソッドがテストの重要な部分です。 Assert の条件式が true の場合、テストは合格します。それ以外の場合はエラーが返されます。なぜなら、assert メソッドは主に 2 つの変数の値が等しいかどうかを判断するために使用されるからです。したがって、testclass クラスは、この関数を具体的に実装するためのassertEquals メソッドを導入します。 AssertEquals メソッドには、期待値、テスト値、および 2 つの値が等しくない場合に返されるメッセージ プロンプト文字列の 3 つのパラメーターがあります。
テストプロセスを実行する
さて、コンパイルしたテストプログラムを実行できるようになりました。すべてのテストを実行するには、runtest.php テスト プログラムも作成する必要があります。

runtest.phpのソースコードは以下の通りです:

$tSuite = new TestSuite(); //テストスイートオブジェクトの作成 テストスイートオブジェクトを作成します
$tSuite->addtest(new AccountTester( "testWithdraw" )); // 個別のテストを追加します
$tSuite->addtest(new AccountTester("testDeposit")); // 特別なテスト メソッドを追加します。
$tSuite->addtest(new AccountTester("testTransferFrom"));
$res = new TextTestResult() //結果の作成によりテスト結果クラスが作成されます
$tSuite->run(&$res); /テストの実行 テストを実行します
$res->report(); //結果の印刷 テスト結果を出力します。
?>
プログラムの説明:
最初にテスト スイート オブジェクト tSuite を作成し、次に addtest メソッドのパラメーターを 1 つずつ追加します。次に、テスト レポート オブジェクトを作成して実行します。テスト。テストで見つかったエラーの結果は、TestResult クラスによって取得され、一連の text/html エラー レポートをカスタマイズできます。必要に応じて、出力部分を自分で書くこともできます。テスト結果を出力するために、テスト結果は TestResult クラスにカプセル化されます。 phpUnit が提供する別のクラス TextTestResult クラスを使用します。これは、テキストまたはハイパーテキスト形式でレポートを出力できます。もちろん、新しい TestResult サブクラスをカスタマイズして、より複雑な出力形式を制御することもできます。

ヒントとコツ
1. 新しいテスト スイートを作成した後、最初に小さなバグを導入して、テスト スイートが正常に実行できることを証明できます。
たとえば、このアカウント クラスの例では、問題のある関数を意図的に導入しました。
functiondraw($amount){
$this->balance -= $Amount;
// 本来の目的は $amount パラメータを呼び出すことですが、新しい変数です。 $Amount が導入されました。
}
?>
さて、それではテスト スイートを実行しましょう。何もなければすぐにエラーが見つかります。
2.すべてのメソッドがテストを必要とするわけではないことに注意することが重要です。関連するメソッドをテストするだけで済みます。
3.コーディングを開始する前にテスト コードを作成すると、プログラムがどのようなタスクを完了する必要があるかをよりよく理解できます。
さて、phpUnitのテストスイートクラスを導入することで、バグを発見する時間が短縮され、プログラマとしての作業効率も向上することがわかります。
それでは、虫捕りを楽しんでください。召し上がれ。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。