warmans/http-testcase

用于与Web服务通信的端到端测试库的PHPUnit测试用例。

0.0.6 2015-02-16 15:48 UTC

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);
                }
            }
        }
    }