Jedyną prawdziwą logiką jest składnia zapytania dla zewnętrznego interfejsu API. Nie chcę testować, czy wysyła zapytanie do interfejsu API, chcę przetestować, czy wysyła zapytanie w taki sposób, aby zwrócone zostały prawidłowe dane. Na przykład jakiś pseudo-kod:
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;
}
Bardziej konkretny przykład z gotowym interfejsem API:
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;
}
Kwerenda ma niestandardową składnię interfejsu API i jest złożona oraz istnieje wiele sposobów na uzyskanie takich samych lub podobnych wyników. Celem tej funkcji nie jest uzyskanie danych identyfikowanych przez, id
ale znalezienie podzbioru innych danych opartych na rozmytej relacji z danymi identyfikowanymi przez to, id
który spełnia również kilka innych wymagań. Pozostałe wymagania są zawsze takie same niezależnie od, id
ale mogą ulec zmianie w miarę modyfikowania systemu. Na przykład, jeśli przykładowy interfejs API dodał obsługę informacji o grawitacji, możemy chcieć zmienić zapytanie, aby użyć grawitacji również do udoskonalenia wyników. A może wymyślimy bardziej skuteczny sposób sprawdzenia zakresu temperatur, ale to nie zmienia wyników.
Chcę przetestować, że dla danego wejścia id
zwracany jest prawidłowy zestaw danych. Chcę to przetestować, aby jeśli ktoś pomieszał kwerendę w taki sposób, że nie zwraca już poprawnych danych w związku z id
tym, że zakończy się ona niepowodzeniem, ale chcę również, aby ludzie mogli modyfikować zapytanie w celu dopracowania go bez konieczności modyfikacji test.
Opcje, które rozważałem:
Mógłbym usunąć interfejs API, ale byłoby to albo zbyt proste (sprawdź, czy
id
jest ono obecne w zapytaniu, a następnie zwrócił oczekiwany zestaw danych, jeśli jest, lub nieoczekiwany zestaw, jeśli nie jest), zbyt kruche (sprawdź, czy ciąg zapytania jest dokładnie to, co znajduje się w funkcji) lub zbyt skomplikowane (sprawdź, czy użyte zapytanie jest poprawne pod względem składniowym i spowoduje zwrócenie poprawnych danych).Mógłbym przesłać zapytanie do prawdziwego interfejsu API, ale oczekiwane wyniki mogą się zmieniać w czasie wraz ze zmianami danych w systemie zewnętrznym, poza kontrolą systemu testowego.
Mógłbym spojrzeć na konfigurację instalacji prawdziwego interfejsu API w celu kontrolowania posiadanych danych, ale to jest duży wysiłek.
Opieram się na # 2 i robię to raczej test integracyjny, który nie jest uruchamiany często, i widzę, jak często zmiany w danych systemu zewnętrznego powodują przerwanie testu. Myślę, że na razie byłoby to najprostsze, ale zastanawiam się, czy istnieją alternatywy, o których nie myślę, ani lepsze sposoby rozwiązania tego problemu. Wszelkie porady będą mile widziane.