Δοκιμές πελατών Guzzle

Το Guzzle παρέχει διάφορα εργαλεία που θα σας επιτρέψουν να κοροϊδέψετε εύκολα το επίπεδο HTTP χωρίς να χρειάζεται να στέλνετε αιτήσεις μέσω του διαδικτύου.

  • Χειριστής προσομοίωσης
  • Ιστορία middleware
  • Διακομιστής ιστού Node.js για δοκιμές ενσωμάτωσης

Mock Handler

Όταν δοκιμάζετε πελάτες HTTP, συχνά χρειάζεται να προσομοιώσετε συγκεκριμένα σενάρια όπως η επιστροφή μιας επιτυχημένης απόκρισης, η επιστροφή ενός σφάλματος ή η επιστροφή συγκεκριμένων αποκρίσεις με συγκεκριμένη σειρά. Επειδή οι δοκιμές μονάδας πρέπει να είναι προβλέψιμες, εύκολες να ξεκινήσουν και να είναι γρήγορες, το χτύπημα ενός πραγματικού απομακρυσμένου API είναι μια οσμή δοκιμής.

Το Guzzle παρέχει έναν χειριστή προσομοίωσης που μπορεί να χρησιμοποιηθεί για την εκπλήρωση αιτημάτων HTTP με απάντηση ή εξαίρεση, μετατοπίζοντας τις τιμές επιστροφής από μια ουρά.

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

Όταν δεν υπάρχουν άλλες απαντήσεις στην ουρά και αποστέλλεται ένα αίτημα, εκπέμπεται μια OutOfBoundsException.

Ιστορία Middleware

Όταν χρησιμοποιείτε πράγματα όπως ο Mock χειριστής, συχνά πρέπει να γνωρίζετε αν το οι αιτήσεις που περιμένατε να στείλετε στάλθηκαν ακριβώς όπως θέλατε. Ενώ ο mock χειριστής ανταποκρίνεται με προσομοιωμένες απαντήσεις, το ενδιάμεσο λογισμικό ιστορικού διατηρεί ένα ιστορικό των αιτήσεων που στάλθηκαν από έναν πελάτη.

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 Server

Η χρήση εικονικών αποκρίσεων είναι σχεδόν πάντα αρκετή κατά τη δοκιμή ενός πελάτη υπηρεσίας ιστού. Όταν υλοποιείτε προσαρμοσμένους χειριστές HTTP, θα πρέπει να πρέπει να στέλνετε πραγματικά αιτήματα HTTP προκειμένου να ελέγξετε επαρκώς τον χειριστή. Ωστόσο, μια βέλτιστη πρακτική είναι να επικοινωνείτε με έναν τοπικό διακομιστή ιστού και όχι με έναν διακομιστή μέσω του διαδικτύου.

  • Οι δοκιμές είναι πιο αξιόπιστες
  • Οι δοκιμές δεν απαιτούν σύνδεση δικτύου
  • Οι δοκιμές δεν έχουν εξωτερικές εξαρτήσεις

Χρήση του δοκιμαστικού διακομιστή

Προειδοποίηση

Η ακόλουθη λειτουργικότητα παρέχεται για να βοηθήσει τους προγραμματιστές του Guzzle να αναπτύξουν χειριστές HTTP. Δεν υπάρχει καμία υπόσχεση συμβατότητας προς τα πίσω όταν πρόκειται για τον δοκιμαστικό διακομιστή node.js ή τον GuzzleHttp\Tests\Server class. Εάν χρησιμοποιείτε τον διακομιστή δοκιμών ή την κλάση Server εκτός του guzzlehttp/guzzle, τότε θα πρέπει να ρυθμίσετε τις παραμέτρους autoloading και να διασφαλίσετε ότι ο διακομιστής ιστού εκκινείται χειροκίνητα.

Υπόδειξη

Σχεδόν ποτέ δεν χρειάζεται να χρησιμοποιήσετε αυτόν τον δοκιμαστικό διακομιστή ιστού. Θα πρέπει να χρησιμοποιείτε μόνο σκεφτείτε να τον χρησιμοποιήσετε όταν αναπτύσσετε χειριστές HTTP. Ο δοκιμαστικός διακομιστής ιστού δεν είναι απαραίτητος για την προσομοίωση αιτήσεων. Για αυτό, χρησιμοποιήστε τον Mock handler και το ενδιάμεσο λογισμικό ιστορικού.

Το Guzzle συνοδεύεται από έναν δοκιμαστικό διακομιστή node.js που λαμβάνει αιτήσεις και επιστρέφει απαντήσεις από μια ουρά. Ο δοκιμαστικός διακομιστής εκθέτει ένα απλό API που χρησιμοποιείται για να αναμονή των απαντήσεων και την επιθεώρηση των αιτήσεων που έχει λάβει.

Οποιαδήποτε λειτουργία στο αντικείμενο Server θα διασφαλίζει ότι ότι ο διακομιστής εκτελείται και θα περιμένει μέχρι να είναι σε θέση να λάβει αιτήσεις πριν να επιστρέψει.

GuzzleHttp\Tests\Server παρέχει μια στατική διασύνδεση με τον διακομιστή δοκιμών. Εσείς μπορείτε να βάλετε σε ουρά μια απάντηση HTTP ή μια σειρά απαντήσεων καλώντας τον Server::enqueue(). Αυτή η μέθοδος δέχεται έναν πίνακα από Psr\Http\Message\ResponseInterface και Exception αντικειμένων.

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

Όταν μια απάντηση μπαίνει στην ουρά του διακομιστή δοκιμών, ο διακομιστής δοκιμών θα αφαιρέσει κάθε προηγούμενες απαντήσεις στην ουρά. Καθώς ο διακομιστής λαμβάνει αιτήματα, οι απαντήσεις στην ουρά αποσύρονται από την ουρά και επιστρέφονται στην αίτηση. Όταν η ουρά είναι άδεια, ο διακομιστής θα επιστρέψει μια απάντηση 500.

Μπορείτε να επιθεωρήσετε τις αιτήσεις που έχει ανακτήσει ο διακομιστής καλώντας Server::received().

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

Μπορείτε να διαγράψετε τη λίστα των ληφθέντων αιτήσεων από το διακομιστή ιστού χρησιμοποιώντας τη μέθοδο Server::flush().

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