L'unica vera logica è nella sintassi della query per l'API esterna. Non voglio testare se interroga l'API, voglio testare che lo interroga in modo tale da restituire 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 inventata:
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 i dati identificati da, id
ma di trovare un sottoinsieme di altri dati basati su una relazione fuzzy con i dati identificati id
che soddisfano anche alcuni altri requisiti. Gli altri requisiti sono sempre gli stessi, 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 modificare la query per utilizzare anche la gravità per perfezionare i risultati. O forse ci viene in mente 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 corretto di dati. Voglio provare questo in modo che se qualcuno incasina la query in modo tale che non restituisca più i dati corretti in base a id
ciò fallirà, ma voglio anche che le persone siano in grado di modificare la query per perfezionarla senza dover modificare il test.
Opzioni che ho considerato:
Potrei stub l'api, ma sarebbe troppo semplice (controlla che
id
sia presente nella query e quindi restituisca un set di dati previsto se lo è o un set imprevisto in caso contrario), troppo fragile (controlla che la stringa della query sia esattamente ciò che è nella funzione) o troppo complesso (verificare che la query utilizzata sia sintatticamente corretta e risulti nella restituzione dei dati corretti).Potrei inviare la query all'api reale, ma i risultati previsti potrebbero cambiare nel tempo man mano che i dati nel sistema esterno cambiano, al di fuori del controllo del sistema di test.
Potrei guardare alla configurazione di un'installazione di prova dell'api reale al fine di controllare i dati che ha, ma è un grande sforzo.
Mi sto orientando verso il n. 2 e sto rendendo questo più un test di integrazione che non viene eseguito spesso e vedo con che frequenza i cambiamenti nei dati del sistema esterno causano l'interruzione 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. Tutto il consiglio sarebbe apprezzato.