PHP-VCR 开源项目教程
项目介绍
PHP-VCR 是一个用于记录和回放测试套件的 HTTP 交互的开源项目。它可以帮助开发者在测试过程中记录 HTTP 请求和响应,并在未来的测试运行中回放这些记录,从而实现快速、确定性和准确的测试。PHP-VCR 支持多种 HTTP 函数和扩展,如 fopen()
、fread()
、file_get_contents()
等,并且可以与 SoapClient
和 Guzzle
等库集成。
项目快速启动
安装
使用 Composer 进行安装:
composer require --dev php-vcr/php-vcr
配置
在测试引导文件中启用 PHP-VCR:
require 'vendor/autoload.php';
\VCR\VCR::turnOn();
\VCR\VCR::insertCassette('test_cassette');
// 运行你的测试
\VCR\VCR::eject();
\VCR\VCR::turnOff();
应用案例和最佳实践
SOAP Weather API 测试
以下是一个使用 PHP-VCR 进行 SOAP Weather API 测试的示例:
require 'vendor/autoload.php';
\VCR\VCR::turnOn();
\VCR\VCR::insertCassette('weather_api_test');
$client = new SoapClient('http://example.com/weather?wsdl');
$response = $client->getWeather(['city' => 'New York']);
\VCR\VCR::eject();
\VCR\VCR::turnOff();
// 验证响应
assert($response->temperature > 0);
Curl Github API 测试
以下是一个使用 PHP-VCR 进行 Curl Github API 测试的示例:
require 'vendor/autoload.php';
\VCR\VCR::turnOn();
\VCR\VCR::insertCassette('github_api_test');
$ch = curl_init('https://api.github.com/users/example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
\VCR\VCR::eject();
\VCR\VCR::turnOff();
// 验证响应
$data = json_decode($response, true);
assert($data['login'] === 'example');
典型生态项目
PHPUnit 集成
PHP-VCR 可以与 PHPUnit 集成,以便在单元测试中记录和回放 HTTP 交互。以下是一个简单的示例:
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
public function setUp(): void
{
\VCR\VCR::turnOn();
\VCR\VCR::insertCassette('example_test');
}
public function tearDown(): void
{
\VCR\VCR::eject();
\VCR\VCR::turnOff();
}
public function testExample()
{
$response = file_get_contents('http://example.com');
$this->assertStringContainsString('Example Domain', $response);
}
}
Behat 案例研究
PHP-VCR 还可以与 Behat 集成,以便在行为驱动开发(BDD)中记录和回放 HTTP 交互。以下是一个简单的示例:
use Behat\Behat\Context\Context;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
class FeatureContext implements Context
{
public function __construct()
{
\VCR\VCR::turnOn();
\VCR\VCR::insertCassette('behat_test');
}
public function __destruct()
{
\VCR\VCR::eject();
\VCR\VCR::turnOff();
}
/**
* @Given I send a GET request to :url
*/
public function iSendAGetRequestTo($url)
{
$response = file_get_contents($url);