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&dcr=0&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介绍能为您提供一些启发,让您知道还有这样的选择。