私は、オブジェクト指向でも多くの点で適切に記述されていないZend Framework Webアプリケーションを継承しましたが、テストはありませんでした。したがって、単体テストの価値を高く評価し、コードを追加または再記述しながらそれらを記述しますが、コードカバレッジを備えた機能テストを開始するのに最適な場所のようです。また、アプリケーションがどのように機能するかを理解するための優れた学習ツールにもなります。これはZendFramework1.11であり、Matthew Weier O'Phinneyは、Zend_Testは3.4までのPHPUnitでのみ機能すると述べています。そこで、最新の3.4.15をインストールしました。Zend_Test_PHPUnit_ControllerTestCaseを拡張して、その方法でコントローラーの単体テストを実行できることを確認しました。
Seleniumを介した機能テストでは、コードカバレッジを機能させるのに問題がありました。実際、Seleniumサーバーの動作方法を考えると、カバレッジデータを取得することが技術的に実現可能かどうかは疑問でしたが、PHPUnit_Seleniumコードカバレッジは機能しますか?PHPUnit_Seleniumコードカバレッジは機能しますか?私はついにそれを私のアプリケーションで動作させることができました。コードのどの部分がさまざまなリクエストによってヒットされているかを確認できるのは素晴らしいことです。
しかし、私が今目にしている問題は、POSTリクエストを処理するコードが報告されていないように見えることです。
たとえば、コントローラーには、次のようなコードを持つcontactActionメソッドがあります。
$this->view->form = $form;
if ($this->getRequest()->isPost()) {
if ($form->isValid($this->getRequest()->getPost())) {
$values = $form->getValues();
お問い合わせフォーム用です。Seleniumテストでは、URLを開き、メッセージを入力し、送信ボタンをクリックして、ページが読み込まれるのを待ちます。テストを実行すると、ブラウザーでこれが発生し、セレンによって入力されたメッセージが記載された電子メールを受信することがわかります。したがって、フォームは有効なデータで投稿され、次の2行は実行されたと確信しています。ただし、カバレッジレポートでは、最初の2行は緑色で、次の2行はオレンジ色です。
prepend.phpスクリプトとappend.phpスクリプトの両方をインストルメント化して、次の情報をログに記録しました。
"(File: " . __FILE__ . "): REQUEST_METHOD: " . $_SERVER['REQUEST_METHOD'] . "\n" .
"REQUEST_URI: " . $_SERVER['REQUEST_URI'] . "\n" .
"_COOKIE['PHPUNIT_SELENIUM_TEST_ID']: '" . print_r(isset($_COOKIE['PHPUNIT_SELENIUM_TEST_ID']), 1) . "'\n" .
"_GET['PHPUNIT_SELENIUM_TEST_ID']: '" . print_r(isset($_GET['PHPUNIT_SELENIUM_TEST_ID']), 1) . "'\n" .
"_POST['PHPUNIT_SELENIUM_TEST_ID']: '" . print_r(isset($_POST['PHPUNIT_SELENIUM_TEST_ID']), 1) . "'\n" .
奇妙なことに、追加スクリプトではなく、追加スクリプトのみがログに記録されます。理由はわかりませんが、カバレッジデータには影響しないようです(少なくともGETリクエストの場合)。それを説明するかもしれない私が見た唯一のことは、Zend MVCアプリがexit()で終了するかどうかです。それは理にかなっていますか?
お問い合わせのやり取りでログに記録される内容は次のとおりです。
(File C:\xampp\htdocs\myapp\public\prepend.php): REQUEST_METHOD: GET
REQUEST_URI: /index/contact
_COOKIE['PHPUNIT_SELENIUM_TEST_ID']: '1'
_GET['PHPUNIT_SELENIUM_TEST_ID']: ''
_POST['PHPUNIT_SELENIUM_TEST_ID']: ''
extension_loaded('xdebug'): '1'
(File C:\xampp\htdocs\myapp\public\prepend.php): REQUEST_METHOD: GET
REQUEST_URI: /index/contact
_COOKIE['PHPUNIT_SELENIUM_TEST_ID']: '1'
_GET['PHPUNIT_SELENIUM_TEST_ID']: ''
_POST['PHPUNIT_SELENIUM_TEST_ID']: ''
extension_loaded('xdebug'): '1'
(File C:\xampp\htdocs\myapp\public\prepend.php): REQUEST_METHOD: POST
REQUEST_URI: /index/contact
_COOKIE['PHPUNIT_SELENIUM_TEST_ID']: '1'
_GET['PHPUNIT_SELENIUM_TEST_ID']: ''
_POST['PHPUNIT_SELENIUM_TEST_ID']: ''
extension_loaded('xdebug'): '1'
(File C:\xampp\htdocs\myapp\public\prepend.php): REQUEST_METHOD: GET
REQUEST_URI: /default/index/contact
_COOKIE['PHPUNIT_SELENIUM_TEST_ID']: '1'
_GET['PHPUNIT_SELENIUM_TEST_ID']: ''
_POST['PHPUNIT_SELENIUM_TEST_ID']: ''
extension_loaded('xdebug'): '1'
(File C:\xampp\htdocs\myapp\public\prepend.php): REQUEST_METHOD: GET
REQUEST_URI: /default/index/contact
_COOKIE['PHPUNIT_SELENIUM_TEST_ID']: '1'
_GET['PHPUNIT_SELENIUM_TEST_ID']: ''
_POST['PHPUNIT_SELENIUM_TEST_ID']: ''
extension_loaded('xdebug'): '1'
(File C:\xampp\htdocs\myapp\public\prepend.php): REQUEST_METHOD: GET
REQUEST_URI: /phpunit_coverage.php?PHPUNIT_SELENIUM_TEST_ID=a85030b0bcdb0460bfb17a83a373d6b5
_COOKIE['PHPUNIT_SELENIUM_TEST_ID']: ''
_GET['PHPUNIT_SELENIUM_TEST_ID']: '1'
_POST['PHPUNIT_SELENIUM_TEST_ID']: ''
extension_loaded('xdebug'): '1'
ご覧のとおり、GETリクエストは2回ログに記録され、POSTは1回だけログに記録されます。おそらくそれは、POSTSがカバーしていないのに、GETリクエストだけがカバーされているように見えるという事実に関連していますか?しかし、私はこの振る舞いをいくつかの点で本当に理解しておらず、それを理解するために何をすべきか途方に暮れています。
なぜ私がPOSTリクエストのカバレッジを取得していないのか、またはそれを追跡するための次のステップは何かについて、誰かが何かアイデアを得ましたか?