我继承了一个 Zend Framework Web 应用程序,它既不是面向对象的,也不是在很多方面都写得很好,而且它带有零测试。因此,虽然我很欣赏单元测试的价值,并且会在我添加或重写代码时编写它们,但具有代码覆盖率的功能测试似乎是最好的起点。它也是了解应用程序如何工作的绝佳学习工具。这是 Zend Framework 1.11,Matthew Weier O'Phinney 已经声明 Zend_Test 仅适用于 PHPUnit 到 3.4。所以我安装了最新的3.4.15。我已经验证我可以扩展 Zend_Test_PHPUnit_ControllerTestCase 并以这种方式对控制器进行单元测试。
对于通过 Selenium 进行的功能测试,我在让代码覆盖工作时遇到了一些麻烦。事实上,我怀疑根据 Selenium 服务器的工作方式获取覆盖数据在技术上是否可行,但在PHPUnit_Selenium Code Coverage Work 的帮助下,它是否可行?和PHPUnit_Selenium 代码覆盖是否有效?我终于让它与我的应用程序一起工作。能够看到代码的哪些部分被不同的请求击中真是太好了!
但我现在看到的问题是处理 POST 请求的代码似乎没有被报告。
例如,在控制器中,我有一个 contactAction 方法,其代码如下:
$this->view->form = $form;
if ($this->getRequest()->isPost()) {
if ($form->isValid($this->getRequest()->getPost())) {
$values = $form->getValues();
这是用于联系我们的表格。在 Selenium 测试中,我打开 url,输入消息,单击提交按钮,然后等待页面加载。当我运行测试时,我可以在浏览器中看到这种情况,并收到带有由 selenium 键入的消息的电子邮件,所以我确定表单发布了有效数据,并且后两行确实执行了。但是在覆盖率报告中,前两行是绿色的,后两行是橙色的。
我检测了 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" .
一件奇怪的事情是,只有 prepend 脚本会被记录,而不是 append 脚本。我不知道为什么,但它似乎不会影响覆盖数据(至少对于 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 请求的报道,或者下一步可能是什么来追踪它?