warmans / http-testcase
用于与Web服务通信的端到端测试库的PHPUnit测试用例。
Requires (Dev)
- phpunit/phpunit: ~4.5
This package is not auto-updated.
Last update: 2024-09-28 15:28:53 UTC
README
PHPUnit测试用例,用于辅助行为/集成测试HTTP客户端库。测试用例可以启动一个http服务器,并排队一组响应(一个会话),这些响应可以回放给服务器的HTTP请求。这大致类似于Guzzle提供的测试用例,但没有任何外部(NPM)依赖。
HTTP服务器是用golang编写的。源代码在此处可用: https://github.com/warmans/http-playback
测试用例API
测试用例公开以下方法
startServer($port)
在指定端口启动服务器并返回一个 Server
实例。
getServer($port)
使用 startServer()
启动服务器后获取 Server
实例。
stopServers()
告诉所有运行的服务器退出。请注意,Server实例已自动注册关闭函数,因此省略对 tearDown
的调用不应该留下服务器运行。
服务器API
使用从 startServer()
和 getServer()
调用返回的 Server
实例简化与http回放服务器的交互。
start()
启动服务器(通常由 HttpTestCase::startServer()
调用)。
stop()
停止服务器(通常由 HttpTestCase::startServer()
调用)。
enqueue($session, $status = 200, $body = "", $headers = array(), $wait = 0)
将响应添加到HTTP会话中。会话只是服务器内部保持的响应的命名列表。使用命名会话允许测试人员模拟不同的端点,而无需精确路径。如果您不关心不同页面的隔离响应队列,只需始终使用相同的会话名称即可。
getReplayUri($session, $path)
如果您已排队一些响应,只需获取完整的回放URI,则可以使用此方法。例如。
$server->enqueue("foo", 200); //setup a session
$server->getReplayUri("foo", "/bar/baz"); // https://:8080/p/foo/bar/baz - will return the configured response
getOutput()
获取服务器日志输出作为字符串。请注意,服务器日志在 sys_get_temp_dir().'/http-testcase.log'
创建。
isRunning()
检查服务器是否正在运行。
示例
一个测试用例将如下所示(如果已安装开发依赖项,则可以从项目根目录运行此测试用例: ./vendor/bin/phpunit example
)
use HttpTestCase\HttpTestCase; class Test extends HttpTestCase { public static function setUpBeforeClass() { self::startServer('8081'); } public static function tearDownAfterClass() { self::stopServers(); } /** * Just send a HTTP GET request somewhere. */ protected function sendGet($host) { $ch = curl_init($host); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); return curl_exec($ch); } /** * Enqueue and request a single response. */ public function testHttpServerReturnsConfiguredResponse() { $server = self::getServer('8081'); $server->enqueue(1, 200, 'bar'); $this->assertEquals('bar', $this->sendGet('https://:8081/p/1/')); } /** * Enqueue some responses then send some GET requests to the server and assert they were returned in the * expected order. */ public function testHttpServerReturnsMultipleResponses() { $server = self::getServer('8081'); $server->enqueue(1, 200, 'bar'); $server->enqueue(1, 200, 'baz'); $server->enqueue(1, 200, 'cat'); $this->assertEquals('bar', $this->sendGet('https://:8081/p/1/')); $this->assertEquals('baz', $this->sendGet('https://:8081/p/1/')); $this->assertEquals('cat', $this->sendGet('https://:8081/p/1/')); } /** * Enqueue 1000 responses then request them all. */ public function testOneWayLoad() { $requests = 1000; //in $server = self::getServer('8081'); for ($i = 0; $i < $requests; $i++) { $server->enqueue(1, 200, "foo", array()); } //out for ($i = 0; $i < $requests; $i++) { if ('foo' !== ($res = $this->sendGet($server->getReplayUri(1)))) { $this->fail('bad response: '.$res); } } } /** * Enqueue and request 1000 responses */ public function testAlternatingLoad() { $requests = 1000; $server = self::getServer('8081'); for ($i = 0; $i < $requests; $i++) { //in $server->enqueue(1, 200, "foo", array()); //out if ('foo' !== ($res = $this->sendGet($server->getReplayUri(1)))) { $this->fail('bad response: '.$res); } } } }