我繼承了一個Zend Framework的Web應用程序,它既不是面向對象的,也沒有在很多方面寫得很好,而且它沒有測試。因此,儘管我欣賞單元測試的價值,並且會在添加或重寫代碼時編寫它們,但代碼覆蓋的功能測試似乎是最佳開始。它也是理解應用程序如何工作的理想工具。這是Zend Framework 1.11,Matthew Weier O'Phinney指出Zend_Test只能在3.4以上的PHPUnit中工作。所以我安裝了最新的3.4.15。我已經驗證了我可以擴展Zend_Test_PHPUnit_ControllerTestCase並在控制器上進行單元測試。PHPUnit Selenium RC測試覆蓋適用於GET,但不適用於POST請求?
對於通過硒的功能測試,我有一些麻煩讓代碼覆蓋工作。實際上,我懷疑從Selenium服務器的工作方式獲取覆蓋率數據在技術上是否可行,但在Does PHPUnit_Selenium Code Coverage Work?和Does PHPUnit_Selenium Code Coverage Work?的幫助下,我終於可以與我的應用程序一起工作。能夠看到代碼的哪些部分受到不同請求的影響非常棒!
但我現在看到的問題是處理POST請求的代碼似乎沒有得到報告。
例如在控制器我有代碼contactAction方法是這樣的:
$this->view->form = $form;
if ($this->getRequest()->isPost()) {
if ($form->isValid($this->getRequest()->getPost())) {
$values = $form->getValues();
。這是一個聯繫我們形式。在Selenium測試中,我打開url,輸入消息,單擊提交按鈕,然後等待頁面加載。當我運行測試時,我可以看到在瀏覽器中發生了這種情況,並且接收到了由硒鍵入的消息的電子郵件,所以我確信表單是用有效數據發佈的,並且後面兩行確實執行了。但在報道報道中,前兩行是綠色,後兩行是橙色。
我儀表兩個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請求得到記錄兩次,POST只有一次。也許這與只有GET請求似乎被覆蓋而POSTS不覆蓋的事實有關?但我真的不知道這種行爲在幾個方面,我不知道該怎麼做,以幫助弄清楚。
有人對我爲什麼沒有獲得POST請求的覆蓋率有什麼想法,或者下一步可能要跟蹤它嗎?
我剛纔輸入了一個答案,將我的XDebug版本從2.1.0更新到2.1.2解決了這個問題。但是我刪除了它,因爲進一步的測試顯示,代碼顯示的內容是測試環境中的變化:密碼已更改,因此登錄失敗。因此,如果登錄成功,它會重定向,並且不會覆蓋POST請求。登錄失敗後,它顯示POST的覆蓋範圍,並重新顯示錶單。 XDebug的版本沒有什麼區別。這是WinXP SP3,PHP 5.3.1。 – sootsnoot 2013-03-02 19:43:13