L'unica vera logica è nella sintassi della query per l'API esterna. Non voglio testare se interroga l'API, voglio verificare che lo interroghi in modo tale che vengano restituiti i dati corretti. Ad esempio, alcuni pseudo-codice:
function retrieve_related_data(id)
{
query = "[potentially long, syntactically complex query that
uses param id to get some data]";
results = api_wrapper.query(query);
return results;
}
Un esempio più concreto con un'API composta:
function retrieveLifeSupportingObjectsWithinRegion(id)
{
query = "
within region(" + id + ") as r
find objects matching hydration>0 and temp_range has 75
send name, id, relative(position, r)
";
results = astronomicalObjectApiWrapper.query(query);
return results;
}
La query è in una sintassi personalizzata per l'API ed è complessa e ci sono diversi modi per ottenere risultati uguali o simili. Lo scopo della funzione non è quello di ottenere dati identificati da id
ma di trovare un sottoinsieme di altri dati basato su una relazione fuzzy con i dati identificati da id
che soddisfa anche alcuni altri requisiti. Gli altri requisiti sono sempre gli stessi indipendentemente da id
, ma possono cambiare nel tempo man mano che il sistema viene modificato. Ad esempio, se l'API di esempio ha aggiunto il supporto per le informazioni sulla gravità, potremmo voler cambiare la query per utilizzare anche la gravità per perfezionare i risultati. O forse abbiamo un modo più efficiente per controllare l'intervallo di temperatura, ma non cambia i risultati.
Quello che voglio testare è che per un dato input id
viene restituito il set di dati corretto. Voglio testare questo in modo che se qualcuno scombina la query in modo tale che non restituisca più i dati corretti basati su id
che fallirà, ma voglio anche che le persone siano in grado di modificare la query per perfezionarla senza bisogno per modificare anche il test.
Opzioni che ho considerato:
-
Potrei stubare l'api, ma sarebbe troppo semplice (controlla che
id
sia presente nella query e poi restituisca un insieme di dati previsto se lo è o un set imprevisto se non lo è), troppo fragile (controlla che la stringa di query sia esattamente ciò che è nella funzione), o troppo complessa (controlla che la query utilizzata sia sintatticamente corretta e comporterà la restituzione dei dati corretti). -
Potrei inviare la query alla vera API, ma i risultati attesi potrebbero cambiare nel tempo man mano che i dati nel sistema esterno cambiano, fuori dal controllo del sistema di test.
-
Potrei cercare di configurare un'installazione di prova della vera API per controllare i dati che ha, ma questo è un grande sforzo.
Mi sto avvicinando al n. 2 e questo rende più di un test di integrazione che non viene eseguito spesso e osservando con quale frequenza i cambiamenti nei dati del sistema esterno causano la rottura del test. Penso che sarebbe più semplice per ora, ma mi chiedo se ci sono alternative a cui non sto pensando o modi migliori per affrontare questo problema. Qualsiasi consiglio sarebbe apprezzato.