Come testare questa classe e si tratta di test di integrazione o test unitario?

1

Considera questa classe di esempio che nel crittografare alcuni dati e inviarli ad un altro servizio.

Considera il test per il metodo redirect .

Ecco come si consuma la classe:

<?php
$safeLink = new SafeLink('some_secret_key');
$safeLink->redirect('http://external.service.com/receiver.php', $someData);

e la classe è smt. come:

<?php
class SafeLink
{
    public function encrypt($data)
    {
        return ....
    }

    public function redirect($url, $data)
    {
        $encryptedData = $this->encrypt($data);

        header('HTTP/1.0 302', true, 302);
        header('Location: http://example.com?' . $encryptedData, true);
        exit;
    }
}

Quindi ho due domande:

  1. Come verificherai questa lezione considerando l'intestazione e le direttive di uscita ...

Quello che farei normalmente per testare questo sarebbe l'invio di $url e $data e ottenere l'URL reindirizzato in qualche modo (probabilmente usando una classe wrapper per header ) e verificare se i dati sono crittografati correttamente.

Stavo sperimentando phpecec su questo e non riuscivo a prendere in giro le cose e durante le indagini ho trovato in this article che i test di unità non dovrebbero essere usati per testare stati, sarebbe un test di integrazione in realtà. Questo ha senso per me ora, ma sono un po 'confuso ...

  1. Quindi, se questo è il caso, cosa testeresti per questo metodo di reindirizzamento, l'unica opzione che posso pensare è testare se è callable con $url e $data , è tutto per il test dell'unità?
posta madpoet 15.07.2016 - 18:32
fonte

1 risposta

1

(Non sono molto esperto in PHP, ma questo consiglio dovrebbe superare le barriere linguistiche)

  1. How would you test this class considering the header and the exit directives?

  2. So if that's the case, what would you be testing for this redirect method, the only option I can think of is testing if it's callable with $url and $data, is that all for unit testing?

Poiché entrambi questi punti si riducono a "Come testesti questa lezione?", ecco il mio approccio:

Per quanto posso dire, il metodo di reindirizzamento prevede il seguente contratto:

  • Produrrà un'intestazione di reindirizzamento

  • Reindirizza a un $link

  • specificato
  • Aggiungerà un po 'di% co_de criptato a quel link (quindi il ricevitore può usarlo)

  • Questa crittografia utilizza la chiave fornita al costruttore

  • Uscirà dal programma

Dati questi punti, non dovrebbe essere difficile trovare i valori da verificare:

  • Verifica che l'output contenga un'intestazione di reindirizzamento

  • Verifica che l'output contenga un'intestazione Location che punta a $data

  • Verifica che l'intestazione della posizione abbia qualche parametro aggiunto

  • Verifica che questo parametro corrisponda a% cod_de%

  • crittografato
  • Verifica che l'esecuzione non continui dopo la chiamata

Questi test possono essere ottenuti con più mezzi (ad es. simulazione / aggancio / ... la funzione $link e verifica delle chiamate, acquisizione dell'output generato e analisi delle informazioni necessarie, ...).

Ad esempio:

<?php # test_callee.php
    $testSafeLink = new SafeLink($_GET['key']);
    $testSafeLink->redirect($_GET['link'], $_GET['data']);
    echo "this should not be called";
?>

<?php # test_caller.php
    $data = ...; # fill these in with test parameters
    $link = ...;
    $key = ...;

    $enc_data = new SafeLink($key)->encrypt($data);
    $res = file_get_contents("http://127.0.0.1/path/to/test_callee.php?link=" . urlescape($link) . "&data=" . urlescape($data) . "&key=" . urlescape($key));

    assert(strpos($http_response_header[0], "302") !== false);
    assert(strpos($http_response_header["Location"], $link) !== false);
    assert(strpos($http_response_header["Location"], $enc_data) !== false);
    assert(strpos($res, "this should not be called") === false);
?>

Questo dovrebbe darti qualche idea (a seconda del tuo framework di test, potrebbe esserci qualcosa di meglio che $data , inoltre, potrebbe esserci un confronto delle stringhe migliore di header() di cui non sono a conoscenza).

    
risposta data 15.07.2016 - 22:51
fonte

Leggi altre domande sui tag