带有模拟的 PHPUnit 测试覆盖率 API

Posted

技术标签:

【中文标题】带有模拟的 PHPUnit 测试覆盖率 API【英文标题】:PHPUnit test coverage API with mock 【发布时间】:2021-01-07 07:45:03 【问题描述】:

我想介绍一种从 API 获取身份验证的方法。

这是我的课:

class MyService

    private $api_token;
    private $uri_api;

    public function __construct(string $api_token, string $uri_api)
        $this->api_token = $api_token;
        $this->uri_api = $uri_api;
    
    public function api_authentication()
        $client = HttpClient::create();
        return $client->request('GET', $this->getUri_api().'salespoints/', [
            'auth_bearer' => $this->getApi_token()
        ]);
    

这是我的测试课:

class MyServiceTest extends WebTestCase

    public function test_api_authentication()
        $client = new HttpClient();

        $stub = $this->getMockBuilder(myService::class)
                    ->disableOriginalConstructor()
                    ->disableOriginalClone()
                    ->disableArgumentCloning()
                    ->disallowMockingUnknownTypes()
                    ->getMock();
        $stub->method('api_authentication')->willReturn($client);
        $this->assertSame($client, $stub->api_authentication());
    

我正在使用 phpUnit here 的文档(示例 8.4)。

问题是当我运行 phpunit 时我的测试通过了,但 sonarQube 告诉我这不是测试覆盖率。我是使用 phpunit 的新手,所以如果您有任何建议。

感谢您的帮助!

【问题讨论】:

你到底在测试什么?整个测试似乎有点毫无意义。也许你可以澄清你的意图。 是的,菲利普,我认为我想要的不可能做到。我想测试一个 api 调用,但最后它没有被包含在测试覆盖范围内。 【参考方案1】:

经过研究,我认为我想测试的方法无法涵盖。这是一个 API 调用,覆盖范围需要由编写此代码的开发人员完成。 感谢您的帮助。

【讨论】:

是的,没错,你只能覆盖你的代码。我认为,如果您使用任何代码覆盖工具,它可能会表明您的代码有多少被覆盖(这是 PhpStorm 代码覆盖的情况)。您可以按文件过滤并检查 API 调用是否被完全覆盖。那么你的工作就完成了!【参考方案2】:

您是否选择了首选覆盖引擎(如 xdebug 或 phpdbg)?

如果您使用的是 phpstorm,您可以右键单击测试目录,然后转到 Edit 'tests (PHPUnit)

然后选择一个代码覆盖引擎

然后点击Apply

现在使用代码覆盖率运行您的测试

【讨论】:

谢谢文森特!这对测试很有帮助 我知道这很诱人,但一般来说 cmets 部分不应该用来说“谢谢”。为此,最好通过单击帖子侧面的按钮来表明帖子是正面的。我向您表明这一点,因为您是新用户。无论如何,我很高兴知道我可以帮助你一点。

以上是关于带有模拟的 PHPUnit 测试覆盖率 API的主要内容,如果未能解决你的问题,请参考以下文章

在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率

phpunit 单元测试之代码覆盖率

如何用PHPUnit生成代码覆盖率报告

在 phpunit 测试中覆盖 symfony TokenAuthenticator

当我使用标志覆盖率运行 Phpunit 时,出现错误:未定义的变量工厂

phpunit --path-coverage(分支覆盖)需要 100 倍以上的时间