ホームページ  >  記事  >  バックエンド開発  >  PHP スクリプトのテスト方法と例

PHP スクリプトのテスト方法と例

墨辰丷
墨辰丷オリジナル
2018-06-07 17:26:404493ブラウズ

この記事では主に PHP スクリプトのテスト方法と例を紹介しますので、興味のある方は参考にしていただければ幸いです。

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() を使用して、すべてのバッファ (バッファの内容) 出力を収集できます。 phpタグ。

注: 出力バッファリングは PHP の複数レベルのネストをサポートしているため、スクリプトが ob_* 呼び出し自体を使用している場合でも、ほとんどの場合、出力バッファリングはキャプチャされます。

3. テスト スクリプトには、このスクリプトの範囲内のすべてのメソッドを呼び出せるように、トランザクション スクリプトの内部メソッドが含まれている必要があります。例:
1. スクリプトに必要な変数は、データベース接続としての $connection など、ローカル変数として定義してカプセル化できます。
2. これは PHP の本来の組み込み関数ではありません。たとえば、header() は $this->header() として記述されます。

特定のコード

これはテストするトランザクション スクリプト オブジェクトであり、スクリプトに固有であり、次のようにカプセル化する必要もあります。 is us テスト コード:

<?php
class ForumPosting
{
  private $headers = array();
 
  public function handleRequest($postRequest)
  {
    $_POST = $postRequest;
    $connection = $this->getAConnection();
    ob_start();
    include &#39;forum/post_new_copy.php&#39;;
    $content = ob_get_clean();
    return array(
      &#39;content&#39; => $content,
      &#39;headers&#39; => $this->headers
    );
  }
 
  private function header($headerLine)
  {
    $this->headers[] = $headerLine;
  }
   
  ...
}

テスト コピーは単なる一時的なものです。これにより、変更のないテストを作成できるようになります。最後に、テストに合格した PHP スクリプトをリファクタリングして、冗長なコードを削除します。

テストが完了すると、handleRequest() の内容を実際のロジック コードに置き換えることができます。このようなテスト スクリプトを多数作成する場合は、テストのニーズを満たす一般的なテスト オブジェクトを作成できます。

2. PHP 開発者向けの単体テスト ツールキット
PHP 分野には、PHPUNIT、PHPUNIT2、SimpleTest の 3 つの主要な単体テスト ツールがあります。その中で、PHPUNIT は機能が非常に単純で完璧ではありません。PHPUNIT2 は PHP5 用に特別に作成された単体テスト ツールであり、構造と機能が Junit と一致しています。SimpleTest は非常に実用的なテスト ツールのセットであり、その中で webTest がサポートしています。 Web プログラム インターフェイスのテストは、Easy が最も推奨するテスト ツールです。この記事では、導入のために SimpleTest を選択します。

関連知識: PHPUNIT2 も非常に優れたツールであり、特にアーキテクチャについては、今後特別な記事で紹介する機会があればと思います。

SimpleTest: 以上です。Simple

SimpleTest のインストールは非常に簡単です。sf.net からソース コード パッケージをダウンロードし、Web ディレクトリに解凍して使用します。ここで詳細を説明します。

まず例を見てみましょう。Web サイトにアクセスできるかどうかを確認するテストを作成します。

最初に使用するファイルを紹介します:

コード リスト:

 public function testANewPostIsCreated()
{
  $action = new ForumPosting();
  $response = $action->handleRequest(array(
    &#39;id_thread&#39; => 42,
    &#39;text&#39; => &#39;Hello, world&#39;,
    ...
  ));
  $this->assertEquals(&#39;...&#39;, $response[&#39;content&#39;]);
  $this->assertContains(&#39;Content-type: text/html&#39;, $response[&#39;headers&#39;]);
}

次に、テスト クラスを作成します:

コード リスト:

require_once("../simpletest/unit_tester.php");
require_once("../simpletest/web_tester.php");
require_once("../simpletest/reporter.php");

まず、Web をテストする機能を自動的に取得できるように webTestCase クラスを拡張します。次に、コンストラクターで基本クラスを直接使用し、それにタイトルを渡します。次に、テスト メソッドを作成する必要があります。テスト メソッドはすべて「test」で始まり、テストを実行するときにクラス内のどのメソッドを呼び出す必要があるかを識別します。 Web ページのコンテンツでは、そのタイトルを「.: 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
  }
}

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP实现获取上月、本月、近15天、近30天的方法

PHP+Ajax实现的无刷新分页功能的方法

PHP 实现返回数组后的处理方法

以上がPHP スクリプトのテスト方法と例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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