PHP-VCR的介绍

首先

你好。这是OPENLOGI AdventCalendar的第19天。

我日常作为一名工程师进行开发工作。
在转职之前,我写Ruby,但是在转职到OpenLogic后开始进行PHP的开发工作。
我接触PHP的时候正好是从PHP4过渡到PHP5的时候,所以感觉好像是很久以前回来了。相比于那个时候,现在在谷歌上搜索“php”出来的结果已经从巨型教材和PHP新书演变成了进化的感觉。

在OPENLOGI中,我们使用phpunit来编写测试。之前在Ruby中进行测试时使用了vcr,所以我对PHP中是否也有这个功能产生了疑问,并进行了确认,发现确实存在,现在向大家介绍一下。

PHP-VCR是一个在GitHub上托管的开源项目,网址为https://github.com/php-vcr/php-vcr。
VCR是另一个在GitHub上托管的开源项目,网址为https://github.com/vcr/vcr。

这是做什么的?

将HTTP结果记录下来以便重复使用。
当进行一次请求后,将结果保存为yaml文件,并从生成的yaml内容中读取以便进行再次请求。

在什么情况下使用?

我主要在以下用途中使用了它。

    • API呼び出しを行うテストをCIで回したときにつどリクエストを飛ばさせたくないのでAPIテスト箇所に使用

 

    • 予期せぬリクエストに対する結果を保存し異常系の確認時に使用

 

    バージョン管理されているAPIの期待する結果を保存しレスポンス形式の確認

使用方法

按照GitHub文档所写的,我会进行记录。

安装

在中国境内,只需一个选择。

参考信息:
根据我的环境,当需要SOAP支持时,您需要安装SOAP扩展,则无错误发生。
我通过$sudo apt-get install php-soap来安装,这样错误就消失了。

进行考试

我以以下的方式进行了测试。


use VCR\VCR;

class VCRTest extends TestCase
{
    public function testVCR()
    {
        // カセットの記録先を設定
        VCR::configure()->setCassettePath([対象パス]);

        // VCR起動
        VCR::turnOn();

        // カセットを入れる
        VCR::insertCassette('google');

        // リクエストする
        $result = file_get_contents('http://google.com');

        // カセットを取り出す
        VCR::eject();

        // VCRを停止
        VCR::turnOff();
    }
}

执行测试时,将在目标路径下生成一个 YAML 文件,然后从之前创建的 YAML 文件中读取数据,从第二次请求开始。

已创建的google.yml

-
    request:
        method: GET
        url: 'http://google.com'
        headers:
            Host: google.com
    response:
        status:
            http_version: '1.1'
            code: '302'
            message: Found
        headers:
            Cache-Control: private
            Content-Type: 'text/html; charset=UTF-8'
            Referrer-Policy: no-referrer
            Location: 'http://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=7484WtfHBMnEXrr-l5AM'
            Content-Length: '269'
            Date: 'Tue, 19 Dec 2017 04:05:03 GMT'
        body: "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>302 Moved</TITLE></HEAD><BODY>\n<H1>302 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.co.jp/?gfe_rd=cr&amp;dcr=0&amp;ei=7484WtfHBMnEXrr-l5AM\">here</A>.\r\n</BODY></HTML>\r\n"

在上述示例中,我们使用setCassettePath函数来设置磁带的路径,但是由于configure函数有很多其他选项,所以最好还是阅读源代码。
https://github.com/php-vcr/php-vcr/blob/master/src/VCR/Configuration.php

根据以下所述,似乎还有其他功能。

    • blacklist, whitelistで読み込み先を制限

 

    アノテーションでの読み込み(https://github.com/php-vcr/phpunit-testlistener-vcr)

結束

希望这个简单的VCR介绍能为您提供一些启发,让您知道还有这样的选择。

广告
将在 10 秒后关闭
bannerAds