我继承了一个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