Guzzle kliensek tesztelése

A Guzzle számos olyan eszközt kínál, amelyek segítségével könnyedén leképezheti a HTTP-réteget anélkül, hogy kéréseket kellene küldenie az interneten keresztül.

  • Mock kezelő
  • Történelem middleware
  • Node.js webszerver integrációs teszteléshez

Mock Handler

A HTTP-kliensek tesztelésekor gyakran kell szimulálni bizonyos forgatókönyveket, mint pl. sikeres válasz visszaküldése, hiba visszaküldése, vagy meghatározott válaszok egy bizonyos sorrendben történő visszaadása. Mivel az egységteszteknek kiszámíthatónak, egyszerűnek és indíthatóak és gyorsak legyenek, egy tényleges távoli API elérése egy teszt szagát jelenti.

A Guzzle egy olyan mock kezelőt biztosít, amely a HTTP-kérelmek teljesítésére használható válasz vagy kivétel, a visszatérési értékek sorból való áthelyezésével.

use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Exception\RequestException;

// Create a mock and queue two responses.
$mock = new MockHandler([
    new Response(200, ['X-Foo' => 'Bar'], 'Hello, World'),
    new Response(202, ['Content-Length' => 0]),
    new RequestException('Error Communicating with Server', new Request('GET', 'test'))
]);

$handlerStack = HandlerStack::create($mock);
$client = new Client(['handler' => $handlerStack]);

// The first request is intercepted with the first response.
$response = $client->request('GET', '/');
echo $response->getStatusCode();
//> 200
echo $response->getBody();
//> Hello, World
// The second request is intercepted with the second response.
echo $client->request('GET', '/')->getStatusCode();
//> 202

// Reset the queue and queue up a new response
$mock->reset();
$mock->append(new Response(201));

// As the mock was reset, the new response is the 201 CREATED,
// instead of the previously queued RequestException
echo $client->request('GET', '/')->getStatusCode();
//> 201

Ha nincs több válasz a várólistában, és egy kérés elküldésére kerül sor, akkor egy OutOfBoundsException hibaüzenetet kap.

Történelem Middleware

Amikor olyan dolgokat használunk, mint a Mock kezelő, gyakran kell tudnunk, hogy a Mock kezelőt használjuk-e. az elvárt kérések pontosan úgy lettek-e elküldve, ahogyan azt terveztük. Míg a mock kezelő mockolt válaszokkal válaszol, a history middleware fenntartja a előzményeket az ügyfél által küldött kérésekről.

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;

$container = [];
$history = Middleware::history($container);

$handlerStack = HandlerStack::create();
// or $handlerStack = HandlerStack::create($mock); if using the Mock handler.

// Add the history middleware to the handler stack.
$handlerStack->push($history);

$client = new Client(['handler' => $handlerStack]);

$client->request('GET', 'http://httpbin.org/get');
$client->request('HEAD', 'http://httpbin.org/get');

// Count the number of transactions
echo count($container);
//> 2

// Iterate over the requests and responses
foreach ($container as $transaction) {
    echo $transaction['request']->getMethod();
    //> GET, HEAD
    if ($transaction['response']) {
        echo $transaction['response']->getStatusCode();
        //> 200, 200
    } elseif ($transaction['error']) {
        echo $transaction['error'];
        //> exception
    }
    var_dump($transaction['options']);
    //> dumps the request options of the sent request.
}

Teszt webkiszolgáló

A webszolgáltatás-ügyfél tesztelésekor szinte mindig elegendő a mock-válaszok használata. Egyéni HTTP kezelők implementálásakor a következőkre van szükség tényleges HTTP-kérelmeket kell küldeni a kezelő megfelelő teszteléséhez. A legjobb gyakorlat azonban az, hogy inkább egy helyi webkiszolgálóval lépjen kapcsolatba, mint egy kiszolgálóval az interneten keresztül.

  • A tesztek megbízhatóbbak
  • A tesztekhez nincs szükség hálózati kapcsolatra
  • A teszteknek nincsenek külső függőségei

A tesztkiszolgáló használata

Figyelmeztetés

A következő funkciók a Guzzle fejlesztőinek segítségére szolgálnak HTTP-kezelők fejlesztéséhez. Nincs ígéret a visszafelé kompatibilitásra a node.js tesztkiszolgálóval vagy a GuzzleHttp\Tests\Server osztály. Ha a tesztkiszolgálót vagy a Server osztályt használja aServer osztályon kívül. guzzlehttp/guzzle, akkor be kell állítania az automatikus betöltést és a biztosítani, hogy a webkiszolgálót manuálisan indítsa el.

Hint

Ezt a teszt webkiszolgálót szinte soha nem kell használni. Mindig csak csak HTTP-kezelők fejlesztésekor érdemes megfontolni a használatát. A teszt webkiszolgáló nem szükséges a kérések mockingjához. Ehhez használja a Mock handler és history middleware-t.

A Guzzle egy node.js tesztkiszolgálóval érkezik, amely fogadja a kéréseket és visszaadja a válaszokat egy várólistáról. A tesztkiszolgáló egy egyszerű API-t tesz közzé, amelyet a következőkre használunk sorba állítani a válaszokat és megvizsgálni a kapott kéréseket.

A Server objektummal végzett bármely művelet biztosítja, hogy a kiszolgáló fut, és megvárja, amíg képes lesz kéréseket fogadni, mielőtt a visszatér.

GuzzleHttp\Tests\Server egy statikus interfészt biztosít a tesztkiszolgálóhoz. A sorba állíthat egy HTTP-választ vagy válaszok tömbjét a következő hívással Server::enqueue(). Ez a módszer elfogad egy tömbnyi Psr\Http\Message\ResponseInterface és Exception objektumokat.

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Tests\Server;

// Start the server and queue a response
Server::enqueue([
    new Response(200, ['Content-Length' => 0])
]);

$client = new Client(['base_uri' => Server::$url]);
echo $client->request('GET', '/foo')->getStatusCode();
// 200

Amikor egy válasz a tesztkiszolgálón sorba kerül, a tesztkiszolgáló eltávolítja az esetleges a korábban sorba állított válaszokat. Ahogy a kiszolgáló megkapja a kérelmeket, a sorba állított válaszok sorba kerülnek, és visszakerülnek a kéréshez. Ha a várólista kiürül, a kiszolgáló 500-as választ küld vissza.

A Server::received() meghívásával ellenőrizheti a szerver által lekérdezett kéréseket.

foreach (Server::received() as $response) {
    echo $response->getStatusCode();
}

A webkiszolgálótól kapott kérések listáját a Server::flush() módszerrel törölheti.

Server::flush();
echo count(Server::received());
// 0