如何查看查看代码覆盖率与CakePHP的测试?(How Can I Check View Code

2019-09-30 05:54发布

当测试控制器,I可以合法地实现100%的代码覆盖,如下所示:

100%的代码覆盖率的正确报告的示例

控制器代码

<?php
App::uses('AppController', 'Controller');

class UsersController extends AppController {

    public function example($option = null) {
        if ($option == 'foo') {
            $some_var = 'hello';
        } elseif ($option == 'bar') {
            $some_var = 'goodbye';
        }

        $this->set(compact('option', 'some_var'));
    }
}

测试代码

<?php
App::uses('UsersController', 'Controller');

class UsersControllerTest extends ControllerTestCase {

    public function testExampleFoo() {
        $this->testAction('/users/example/foo');
        $this->assertEquals('hello', $this->vars['some_var']);
    }

    public function testExampleBar() {
        $this->testAction('/users/example/bar');
        $this->assertEquals('goodbye', $this->vars['some_var']);
    }
}

但是,我怎么能相信,我已经在我的意见达到了100%的代码覆盖率? 例如:

100%的代码覆盖率的报错的例子

控制器代码

<?php
App::uses('AppController', 'Controller');

class UsersController extends AppController {

    public function example($option = null) {
        $this->set('option', $option);
    }
}

查看代码

<?php

if ($option == 'foo') {
    $some_var = 'hello';
} elseif ($option == 'bar') {
    $some_var = 'goodbye';
}

if (isset($some_var)) {
    echo $some_var;
}

测试代码

<?php
App::uses('UsersController', 'Controller');

class UsersControllerTest extends ControllerTestCase {

    public function testExampleFoo() {
        $result = $this->testAction('/users/example/foo', array('return' => 'view'));
        $this->assertEquals('hello', $result);
    }
}

请注意,上述测试代码并不测试“/用户/示例/栏” URL,从而视图的elseif从未测试。 因此,即使控制器的代码进行100%测试,我还没有真正实现了100%的代码覆盖率(因为视图的代码小于100%的测试)。 我能做些什么呢?

Answer 1:

要回答标题中的问题, CakePHP的可以使用的XDebug拉出测试的代码覆盖率。 如果我没有记错,它嵌入代码覆盖率呈现到测试套件。

正如您在上面给出的示例的一般性意见,恕我直言,我甚至会去当没有选项传递,以确保其在预期的方式响应测试控制器的程度,即使它抛出一个异常。

更新

我的道歉不读@尼克的问题正确。

据我所知,CakePHP的不拉起来的代码覆盖率.ctp文件。 这并不意味着然而XDebug的不生成它,你大概可以使用你的IDE(我用PhpStorm具有工具 )或XDebug的本身直接拉回代码覆盖。 当然,这并没有使作为测试仅使用内CakePHP的测试套件一样光滑。

另外,您也可以测试对渲染视图。 根据该文件有可能测试行动时指定返回类型。 因此一种可能的解决方案将是比较任一viewcontents针对预渲染的文件。 没有与此危险然而,因为任何不可见字符( '\n', '\r', '\t' )可能会导致断言到失败,即使在逻辑上,目标和结果的标记是相同的。

中的一个例子文档演示了如何断言使用正则表达式允许你检查的有效性文档的特定区域的值。 你也可以使用PHP的DOM类遍历文件来代替。

祝好运!

更新21:21 2013年9月5日

CakePHP的测试套件是建立在PHP单位这反过来,使用XDebug的生成代码覆盖率。 我周围的源一看,视察了BaseCoverageReport类,并发现了用于运行测试任何框架文件,包括正在测试的设备(如控制器)的生成覆盖率。 这表明,我认为代码覆盖率不选择性地开启,它为包括视图模板的所有文件生成。 随着中说,我没能找到模板,因为它已经生成的代码覆盖率的文件之一。 但是,我也注意到没有为生成的代码覆盖率View类,这意味着什么都没有呈现。 正是在这一点上,我开始有点困惑,因为我想象的东西将不得不以访问要呈现viewcontents控制器测试用例性能。 在仔细检查,原来这些值是空的,所以它看起来可能存在问题与我的设置。

我建议你做的就是支持调试像一个开源IDE的保持PHP开发工具Eclipse的 ,并坚持在你的代码中的断点,并按照线穿过框架。 测试控制器时,这会给你更大的洞察观点的呈现,如果是这样,将有助于追查代码覆盖。 我个人会想到为模板的代码覆盖将是非常有用的,我很惊讶的是,功能不存在。 如果你选择修改框架的源代码,它可能是值得在GitHub上克隆CakePHP中,然后添加一个拉要求,使他们能够在更改到主分支合并。

我很抱歉,我不能成为任何更多的帮助,我把我最好的拍摄吧!



文章来源: How Can I Check View Code Coverage with CakePHP Tests?