PHP
vcr
OriginalOPENLOGIDay 19

php-vcrの紹介

はじめに

こんにちわ。 OPENLOGI AdventCalendar 19日目です。

普段はエンジニアとして開発をしています。
転職前はrubyを書いてましたがオープンロジに転職しphpの開発になりました。
自分がphpを触っていたのはphp4から5に移行するごろだったので久しぶりに戻ってきた感じです。マンモス本だのphpとググるとphp新書が出てきていた時代から比べると進化しているなぁという感じがしました。

OPENLOGIではphpunitでテストを書いています。
Rubyでテスト時にvcrを使用していたので、PHPにもあるのか気になり確認したところあったのでご紹介します。

php-vcr:
https://github.com/php-vcr/php-vcr
vcr:
https://github.com/vcr/vcr

何をするものなのか

HTTP結果を記録しておいて再度使い回すものです。
一度リクエストを行うと結果をyamlに保存して再度のリクエストには
生成したyaml内容から読み込みます。

どういうときに使用するのか

主に以下の用途で使用しました。

  • API呼び出しを行うテストをCIで回したときにつどリクエストを飛ばさせたくないのでAPIテスト箇所に使用
  • 予期せぬリクエストに対する結果を保存し異常系の確認時に使用
  • バージョン管理されているAPIの期待する結果を保存しレスポンス形式の確認

使い方

githubのdocsに書いてある通りなのですが記載します。

インストール

$composer require --dev php-vcr/php-vcr

参考情報:
自身の環境だと
For soap support you need to install the soap extension
とエラーになったので
$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ができ、上記の2度目リクエストからは対象パスにできたyamlからデータを読み込みます。

作成されたgoogle.yml

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

他に下記のような機能もあるようです

終わりに

簡易なvcrの紹介になりましたが、こういうのもあるんだときっかけになれば幸いです。