Vale veramente la pena testare unitamente un client API?

33

Questo è qualcosa che mi ha turbato per un po 'di tempo. Vale veramente la pena testare unitamente un client API?

Diciamo che stai creando una piccola classe per astrarre le chiamate a un'API REST di petshop. Il petshop è un'API molto semplice e ha un insieme di metodi di base:

  • listProducts()
  • getProductDetails(ProductID)
  • addProduct(...)
  • removeProduct(ProductID)

Nel test di questo, dovremmo creare un servizio di simulazione o prendere in giro le risposte. Ma sembra eccessivo; Capisco che vogliamo essere sicuri che i nostri metodi non smettano di funzionare con errori di typo / sintassi, ma dal momento che stiamo scrivendo funzioni che chiamano metodi remoti e quindi stiamo creando risposte false da quei metodi remoti, sembra che uno spreco di sforzi e che stiamo testando qualcosa che non può davvero fallire. Peggio ancora, se il metodo remoto cambia i nostri test di unità passeranno mentre l'uso della produzione fallisce.

Sono abbastanza sicuro che mi manchi qualcosa, o ho la parte sbagliata del bastone, o non vedo il legno per gli alberi. Qualcuno può mettermi sulla strada giusta?

    
posta Phillip B Oldham 08.08.2014 - 15:51
fonte

3 risposte

29

Il lavoro di un client API remoto consiste nell'emettere determinate chiamate, né più né meno. Pertanto, il test deve verificare che emetta tali chiamate, né più né meno.

Certo, se il provider API modifica la semantica delle risposte, il sistema non funzionerà correttamente. Ma questa non è colpa della tua classe cliente; è qualcosa che può essere catturato solo nei test di integrazione. Facendo affidamento sul codice non sotto il tuo controllo, hai rinunciato alla possibilità di verificare la correttezza tramite test interni: era un compromesso, e questo è il prezzo.

Detto questo, testare una classe che consiste solo di deleghe in un'altra classe può essere a bassa priorità, perché vi è relativamente poco rischio di errori complessi. Ma ciò vale per qualsiasi classe che consiste solo di one-liner uniformi, non ha nulla a che fare con la chiamata nel codice di un altro fornitore.

    
risposta data 08.08.2014 - 15:59
fonte
9

Risposta breve:

Tutti i metodi dovrebbero essere testati dall'unità.

Risposta lunga:

Sì. Ne vale la pena.

Queste sono alcune cose che i test unitari su quei metodi di chiamata dell'API dovrebbero testare:

  • Che stai trasmettendo parametri ben formati o corretti alle chiamate API.
  • Che stai rispondendo di conseguenza a determinati tipi di dati restituiti dalle API (deriso o meno), ad esempio magari quando l'API restituisce una stringa vuota il tuo metodo dovrebbe restituire un valore predefinito (solo un esempio)
  • Che i metodi del chiamante si comportano correttamente quando le chiamate API producono un errore

Queste sono le cose che il metodo chiamato può essere isolato, prendendo in giro il servizio API e verificandole bene, assicuriamo che gli errori non sono originati da un errore nel codice client che chiama l'API.

    
risposta data 08.08.2014 - 16:01
fonte
5

Questi non sarebbero test unitari perché stai testando l'input e l'output del tuo sistema, più come test di integrazione limitati.

Sii molto prudente quando dici "sembra uno spreco di energie e testiamo qualcosa che non può fallire" - può fallire, fallirà, sarà probabilmente falliscono in modi che non puoi anticipare, i fallimenti saranno peggiori se non hai test in atto.

L'errore che stai facendo qui ha a che fare con l'invenzione delle ruote: effettuare chiamate ai servizi remoti e alle API è uno scenario molto comune, quindi ci sono alcuni buoni strumenti per aiutarti a provarlo. L'ultima volta che stavo lavorando su un'applicazione che si collegava ai servizi remoti ho usato SoapUI che poteva guardare un servizio e effettuare chiamate simulate a quel servizio o comportamento come una copia locale del server che è possibile effettuare chiamate di prova contro e tracciare le richieste e le risposte. Ci sono voluti pochi minuti per la configurazione e allo stesso modo è stato molto rapido da aggiornare se l'interfaccia remota è cambiata. Non l'ho usato in uno scenario REST, ma anche se non funziona bene (o forse qualcuno sta leggendo questa risposta in futuro quando esistono strumenti migliori) dovresti essere in grado di trovare uno strumento che può prendere in giro un servizio per te e quando arriva il momento di implementare il tuo codice, sarai contento di averlo fatto.

    
risposta data 08.08.2014 - 16:01
fonte

Leggi altre domande sui tag