2010-06-28 16 views
48

Sono al punto in cui ho bisogno di scrivere test unitari per un'API REST scritta usando CakePHP 1.3. L'API supporta le richieste GET, POST e PUT per l'interrogazione e la manipolazione dei dati.Come testare l'unità API?

Esiste un modo stabilito per verificare l'input/output corretto di un'API che simula una richiesta HTTP, utilizzando apparecchi? Non voglio eseguire vere richieste POST/PUT contro il database live (dev). Come posso sfruttare al meglio il sistema per utilizzare modelli temporanei, ma testare il resto dello stack così com'è?


Testare le richieste GET è abbastanza semplice con controller tests. Tuttavia, per la manipolazione dei dati, l'API utilizza le intestazioni HTTP in modo estensivo e analizza anche dati XML e JSON POST/PUT non elaborati. I metodi di test dell'unità di controllo simulano solo i dati POST impostando $this->data nel controller, il che non mi consente di testare correttamente l'API.

+3

Se stai testando quasi l'intero stack contemporaneamente, non è più un test unitario, vero? – wds

+0

@wds Quindi, ancora una volta, non è una richiesta API come una chiamata di funzione per il client? Perché * non dovrei * Lo collaudo nel suo insieme? – deceze

+2

è solo una piccola questione di nomenclatura. Avrei chiamato questo test di integrazione, non un test unitario. – wds

risposta

3

Sembra che si potrebbe essere in grado di testare i dati POST PUT XML grezzo e senza troppi problemi. The CakePHP REST documentation dice questo:

Se una richiesta POST o PUT ha un tipo di contenuto XML, quindi l'ingresso è preso e passato a un'istanza di oggetto XML di torta, che è assegnato alla proprietà $ i dati del controller. Grazie a questa funzionalità, la gestione dei dati XML e POST in parallelo è perfetta: non sono richieste modifiche al controller o al codice del modello. Tutto ciò di cui hai bisogno dovrebbe finire in $ this-> data.

Prova passando attraverso il codice di controllo in modalità di debug per vedere cosa realmente viene attraverso $this->data nel corso di una richiesta XML.

Per quanto riguarda l'eliminazione del database attivo, un database in memoria SQLite sarebbe più semplice?

+0

Non mi interessa davvero quale tipo di database sto usando, voglio utilizzare i dispositivi nelle tabelle di test. Questi sono disponibili solo attraverso oggetti parzialmente derisi, il che mi obbliga a saltare alcune parti di basso livello nell'API. Per testare l'API completa come un client lo vedrebbe, ho bisogno di accedere ai dati POST/PUT non elaborati, perché sono a) fare un controllo della firma sui dati pubblicati eb) anche di testare i dati JSON inviati. Il falso processo con oggetti mock e l'impostazione di '$ this-> data' funziona in parte, ma non mi permette di testare l'intero ciclo di richiesta/risposta dell'API come una singola unità. – deceze

+0

Ho usato i dispositivi di prova in alcuni test, @deceze, e non ricordo di dover prendere in giro qualcosa. Il mocking era necessario per testare i metodi del controller, credo. Sono passati alcuni mesi, quindi potrei aver dimenticato qualche dettaglio. Ho seguito le indicazioni qui: http://book.cakephp.org/view/363/Testing-models –

+0

Se stai provando a testare la parte del ciclo tra la richiesta HTTP e il metodo controller, @deceze, quindi vorrei affrontare separatamente come test di integrazione. Provalo solo una volta perché è tutto gestito dal codice di routing CakePHP. Quindi, per ciascuno dei metodi del controller, è possibile scrivere un test unitario più semplice senza preoccuparsi del routing. –

3

È necessario creare Mock o utilizzare Isolation Framework per simulare l'ambiente API. I test unitari non devono dipendere da risorse quali connessioni Internet, rete, endpoint, ecc.

Se si intende verificare le chiamate API reali, è necessario creare un progetto di test di integrazione e utilizzarlo a tale scopo. Ma sappiate che i test di integrazione non sono per lo più ripetibili e vi darebbero risultati diversi per ogni sessione.