Единственная реальная логика в синтаксисе запроса для внешнего API. Я не хочу проверять, запрашивает ли он API, я хочу проверить, что он запрашивает его таким образом, что будут возвращены правильные данные. Например, некоторый псевдокод:
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;
}
Более конкретный пример с составленным 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;
}
The query is in a syntax custom to the API and is complex and there are multiple ways to achieve the same or similar results. The purpose of the function is not to get data identified by id
but to find a subset of other data based on a fuzzy relationship to the data identified by id
that also meets a few other requirements. The other requirements are always the same regardless of id
but may change over time as the system is modified. For example, if the example api added support for gravity information, we may want to change the query to also use gravity to refine the results. Or maybe we come up with a more efficient way to check the temp range, but it doesn't change the results.
Что я хочу проверить, так это для данного ввода id
возвращается правильный набор данных. Я хочу проверить это так, чтобы, если кто-то испортил запрос таким образом, что он больше не возвращает правильные данные, основываясь на id
том, что он потерпит неудачу, я также хочу, чтобы люди могли изменять запрос, чтобы уточнить его без необходимости также изменять тест.
Варианты, которые я рассмотрел:
Я мог бы заглушить API, но это было бы слишком просто (проверьте,
id
присутствует ли в запросе, а затем верните ожидаемый набор данных, если он есть, или неожиданный набор, если нет), слишком хрупким (проверьте, что строка запроса то, что находится в функции), или слишком сложный (убедитесь, что используемый запрос синтаксически правильный и приведет к возвращению правильных данных).Я мог бы отправить запрос к реальному API, но ожидаемые результаты могли со временем меняться по мере изменения данных во внешней системе вне контроля тестовой системы.
Я мог бы взглянуть на настройку тестовой установки реального API для управления имеющимися у него данными, но это много усилий.
Я склоняюсь к # 2 и превращаю это в интеграционный тест, который не запускается часто, и наблюдаю, как часто изменения в данных внешней системы вызывают сбой теста. Я думаю, что сейчас это будет проще всего, но мне интересно, есть ли альтернативы, о которых я не думаю, или более эффективные способы решения этой проблемы. Любой совет будет принят во внимание.