1. よく使われるテスト例
私たちはよくこのような状況に遭遇します。それは、まったくテストされていないレガシー コードを書き直すことですが、これらのコードでさえ依然としてオブジェクト指向モードで書かれています。このようなコードをテストする場合の私のアドバイスは、テストしやすいようにコードをいくつかのチャンクに分割することです。
ただし、これらのレガシー コードは、元のプログラムへの影響を避けるため、リファクタリングが簡単ではありません。
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() を介して取得できます。echo() または 798fbdefc99d114a19dc9b3a9aa00a60header() として記述されます。
特定のコード
これはテストしたいトランザクション スクリプト オブジェクトであり、スクリプトに固有のものであり、カプセル化する必要もあります。
リーリー
リーリー
テストコピーは一時的なものです。これにより、変更のないテストを作成できるようになります。最後に、テストに合格した PHP スクリプトをリファクタリングして、冗長なコードを削除します。
テストが完了すると、handleRequest() の内容を実際のロジック コードに置き換えることができます。このようなテスト スクリプトを多数作成する場合は、テストのニーズを満たす一般的なテスト オブジェクトを作成できます。
2. PHP開発者向けの単体テストツールキット
PHP の分野には、PHPUNIT、PHPUNIT2、SimpleTest の 3 つの主要な単体テスト ツールがあります。その中で、PHPUNIT は機能が非常に単純で完璧ではありません。PHPUNIT2 は PHP5 用に特別に作成された単体テスト ツールであり、構造と機能が Junit と一致しています。SimpleTest は非常に実用的なテスト ツールであり、webTest は以下のテストをサポートします。 Web プログラム インターフェイスは、Easy が最も推奨するテスト ツールです。この記事では、導入のために SimpleTest を選択します。
関連知識: PHPUNIT2 も、特にアーキテクチャの点で非常に優れたツールです。今後、特別な記事で紹介する機会があればと思います。
SimpleTest: とてもシンプルです
SimpleTest のインストールは非常に簡単です。sf.net からソース コード パッケージをダウンロードし、Web ディレクトリに解凍して使用します。ここでは詳しく説明しません。
まず例を見てみましょう: Web サイトにアクセスできるかどうかを確認するテストを作成します。
まず、使用するファイルを紹介します:
コードリスト:
リーリー
次に、テストクラスを作成します:コードリスト:
リーリー
まず、Web をテストする機能を自動的に取得できるように webTestCase クラスを拡張します。次に、コンストラクターで基本クラスを直接使用し、それにタイトルを渡すだけです。次に、テスト メソッドを作成する必要があります。テスト メソッドはすべて「test」で始まり、テストの実行時にクラス内のどのメソッドを呼び出す必要があるかを識別します。
而$this->get将取得网页的内容,我们指定它的标题为 ".: facebook :.", 接着我们要做的就是实例化这个类的对象,并运行它。
代码列表:
$test = &new TestOfSite(); $test->run(new HtmlReporter());
下边是运行结果:
如果测试出错则会出现下边的界面:
到这里一个简单的测试就算完成了。
实战演习 – 一个Login测试
下面我们进入实战,在这个基础上完成一个login的测试。这次我们先贴出完整的代码:
代码列表:
require_once("../simpletest/unit_tester.php"); require_once("../simpletest/web_tester.php"); require_once("../simpletest/reporter.php"); class TestOfLogin extends WebTestCase { function TestOfLogin() { $this->WebTestCase("Login测试"); } function testLoginOk() { // 取得页面 $this->get("http://howgo.net/prettyface/login.php"); // 添加测试表项 $this->setField("name","Easy"); $this->setField("pass","******"); // 提交 $this->clickSubmit("提交"); // 察看提交后返回页面是否正确 $this->assertWantedPattern("/成功登录/"); // 点击页面链接 $this->clickLink("点击这里进入管理页面"); // 察看指定页面标题和关键内容 $this->assertTitle("ADMINCP"); $this->assertWantedPattern("/请选择要进行的任务/"); // 退出登陆 $this->clickLink("退出管理"); $this->clickLink } }