Guzzle-asiakkaiden testaus

Guzzle tarjoaa useita työkaluja, joiden avulla voit helposti pilkata HTTP-kerrosta ilman, että sinun tarvitsee lähettää pyyntöjä internetin kautta.

  • Mock käsittelijä
  • Historia väliohjelmisto
  • Node.js-verkkopalvelin integraatiotestausta varten

Mock Handler

HTTP-asiakkaita testattaessa on usein simuloitava tiettyjä skenaarioita, kuten seuraavia. onnistuneen vastauksen palauttaminen, virheen palauttaminen tai tietynlaisen vastauksia tietyssä järjestyksessä. Koska yksikkötestien on oltava ennakoitavissa, helppo käynnistettäviä ja nopeita, todellisen etä-API:n käyttäminen on testin haju.

Guzzle tarjoaa mock-käsittelijän, jota voidaan käyttää HTTP-pyyntöjen täyttämiseen vastauksella tai poikkeuksella siirtämällä paluuarvoja pois jonosta.

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

Kun jonossa ei ole enää vastauksia ja pyyntö lähetetään, OutOfBoundsException heitetään.

History Middleware

Kun käytät esimerkiksi Mock -käsittelijää, sinun on usein tiedettävä, onko odotetut pyynnöt lähetettiin juuri niin kuin halusit. Vaikka mock käsittelijä vastaa jäljitellyillä vastauksilla, historia-väliohjelmisto ylläpitää historiaa asiakkaan lähettämistä pyynnöistä.

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.
}

Test Web-palvelin

Verkkopalveluasiakkaan testauksessa riittää lähes aina vastausten jäljittely. Kun toteutat mukautettuja HTTP-käsittelijöitä, sinun täytyy on lähetettävä todellisia HTTP-pyyntöjä, jotta käsittelijää voidaan testata riittävästi. Paras käytäntö on kuitenkin ottaa yhteyttä paikalliseen web-palvelimeen eikä palvelimeen Internetin kautta.

  • Testit ovat luotettavampia
  • Testit eivät vaadi verkkoyhteyttä
  • Testeillä ei ole ulkoisia riippuvuuksia

Testipalvelimen käyttö

Varoitus

Seuraavat toiminnot auttavat Guzzlen kehittäjiä. kehittää HTTP-käsittelijöitä. Yhteensopivuutta taaksepäin ei ole luvattu. node.js:n testipalvelimen tai GuzzleHttp\Tests\Server osalta. luokka. Jos käytät testipalvelinta tai Server-luokkaa muualla kuin osoitteessa guzzlehttp/guzzle, sinun on määritettävä automaattinen lataus ja varmistaa, että verkkopalvelin käynnistetään manuaalisesti.

Vihje

Tätä testiverkkopalvelinta ei juuri koskaan tarvitse käyttää. Sinun pitäisi aina vain harkita sen käyttöä vain HTTP-käsittelijöitä kehitettäessä. Testiverkkopalvelin ei ole välttämätön pyyntöjen pilkkomiseen. Käytä siihen Mock-käsittelijää ja historian väliohjelmistoa.

Guzzlen mukana toimitetaan node.js testipalvelin, joka vastaanottaa pyyntöjä ja palauttaa vastauksia jonosta. Testipalvelin tarjoaa yksinkertaisen API:n, jota käytetään seuraaviin tarkoituksiin jonottaa vastauksia ja tarkastaa vastaanottamansa pyynnöt.

Kaikki Server-objektiin kohdistuvat operaatiot varmistavat, että että palvelin on käynnissä ja odottaa, kunnes se pystyy vastaanottamaan pyyntöjä ennen kuin paluuta.

GuzzleHttp\Tests\Server tarjoaa staattisen rajapinnan testipalvelimelle. Sinä voit asettaa jonoon HTTP-vastauksen tai joukon vastauksia kutsumalla kutsua Server::enqueue(). Tämä metodi hyväksyy joukon Psr\Http\Message\ResponseInterface ja Exception -objekteja.

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

Kun vastaus asetetaan jonoon testipalvelimella, testipalvelin poistaa kaikki mahdolliset aiemmin jonossa olleet vastaukset. Kun palvelin vastaanottaa pyyntöjä, jonossa olevat vastaukset poistetaan jonosta ja palautetaan pyyntöön. Kun jono on tyhjä, palvelin palauttaa 500-vastauksen.

Voit tarkastella pyyntöjä, jotka palvelin on hakenut kutsumalla Server::received().

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

Voit tyhjentää web-palvelimen vastaanottamien pyyntöjen luettelon Server::flush() -menetelmällä.

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