私たちはよくこのような状況に遭遇します。つまり、まったくテストされていないレガシー コードを書き直してテストすることですが、これらのコードでさえ依然としてオブジェクト指向モードで記述されています。このようなコードをテストする場合の私のアドバイスは、テストしやすいようにコードをいくつかのチャンクに分割することです。
ただし、これらのレガシー コードは、元のプログラムへの影響を避けるため、テスト前にコードを書き直すことはそれほど簡単ではありません。もちろん、単体テストを実行することも簡単ではありません。
PHP プログラムでは、通常、コードの一部が複数の Index.php および script.php ファイルに記述されており、これらの .php ファイルは複数の異なるフォルダーに保存されます。エントリ ポイントが見つからない場合、Web サーバーから直接アクセスすることはできません。
テストコピー
PHP スクリプトをテストするには、HTTP リクエストをシミュレートし、返された応答が期待値と等しいかどうかを確認する必要があります。ここで注意が必要なのは、リクエストをシミュレートし、レスポンスとリクエストの内容が異なるだけでなく、ヘッダーも異なることです。
さらに、データを操作するトランザクション スクリプトをテストする場合は、それが実際のデータベースやアプリケーションの残りの部分に接続しないようにする必要があります。
実際には、通常、テストのために元の PHP スクリプトを直接書き直す人は誰もいません。コードが回復不能になるのが怖いからです。 PHP コードに簡単な操作を実行できるように、PHP スクリプトのコピーを使用することをお勧めします。
コードに最小限の変更を加える方法: include ステートメントと require ステートメント (使用されていない場合) を削除し、内部関数の呼び出し方法を変更します。たとえば、header() を $object->header() として記述します。
最後に、このトランザクション スクリプトをテストしてみましょう。テスト後、複製スクリプトからそれらを抽出し、新しいスクリプト ファイルに配置できます。
具体的な手順
1. HTTP リクエストをシミュレートし、変数 $_GET および $_POST を再定義し、$_SERVER のヘッダーも変更します。
2. リクエストのレスポンスを取得します。レスポンスの本文は、ob_start() および ob_get_clean() を使用して取得できます。
注: 出力バッファリングは PHP の複数レベルのネストをサポートしているため、スクリプトが ob_* 呼び出し自体を使用している場合でも、ほとんどの場合、出力バッファリングがキャプチャされます。3. テスト スクリプトには、このスクリプトの範囲内のすべてのメソッドを呼び出せるように、トランザクション スクリプトの内部メソッドが含まれている必要があります。例:
1. スクリプトに必要な変数は、ローカル変数として定義してカプセル化できます (データベース接続としての $connection など)。
2. これは PHP のオリジナルの組み込み関数ではありません。たとえば、header() は $this->header() として記述されます。
特定のコード
これはテストしたいトランザクション スクリプト オブジェクトであり、これをカプセル化する必要もあります:
クラスフォーラム投稿
{
private $headers = array();
パブリック関数 handleRequest($postRequest)
{
$_POST = $postRequest;
$connection = $this->getAConnection();
ob_start();
「forum/post_new_copy.php」をインクルードします;
$content = ob_get_clean();
配列を返します(
'content' => $content,
'ヘッダー' => $this->ヘッダー
);
}
プライベート関数ヘッダー($headerLine)
{
$this->headers[] = $headerLine;
}
...
}
これは私たちのテストコードです:
パブリック関数 testANewPostIsCreated()
{
$action = new ForumPosting();
$response = $action->handleRequest(array(
'id_thread' => 42,
'text' => 'Hello, world',
...
));
$this->assertEquals('...', $response['content']);
$this->assertContains('Content-type: text/html', $response['headers']);
}
結論
テスト コピーは一時的なものであり、作成したテストが変更されるのを防ぎます。最後に、テストに合格した PHP スクリプトをリファクタリングして、冗長なコードを削除します。
テストが完了すると、handleRequest() の内容を実際のロジック コードに置き換えることができます。このようなテスト スクリプトを多数作成する場合は、テストのニーズを満たす一般的なテスト オブジェクトを作成できます。