La única lógica real está en la sintaxis de consulta para la API externa. No quiero probar si consulta la API, quiero comprobar que la consulta de tal manera que se devuelvan los datos correctos. Por ejemplo, algunos pseudocódigo:
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 ejemplo más concreto con una API inventada:
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 consulta está en una sintaxis personalizada para la API y es compleja y hay varias formas de lograr los mismos resultados o resultados similares. El propósito de la función no es obtener datos identificados por, id
sino encontrar un subconjunto de otros datos basados en una relación difusa con los datos identificados por id
eso que también cumple con algunos otros requisitos. Los otros requisitos son siempre los mismos independientemente de, id
pero pueden cambiar con el tiempo a medida que se modifica el sistema. Por ejemplo, si la API de ejemplo agrega soporte para información de gravedad, es posible que queramos cambiar la consulta para usar también la gravedad para refinar los resultados. O tal vez se nos ocurra una forma más eficiente de verificar el rango de temperatura, pero no cambia los resultados.
Lo que quiero probar es que para una entrada dada id
se devuelve el conjunto correcto de datos. Quiero probar esto para que si alguien desordena la consulta de modo que ya no devuelva los datos correctos en función de id
que fallará, pero también quiero que las personas puedan modificar la consulta para refinarla sin necesidad de modificar también la prueba.
Opciones que he considerado:
Podría tropezar la API, pero eso sería demasiado simple (verifique que
id
esté presente en la consulta y luego devuelva un conjunto de datos esperado si es así o un conjunto inesperado si no), demasiado frágil (verifique que la cadena de consulta sea exactamente lo que está en la función), o demasiado complejo (verifique que la consulta utilizada sea sintácticamente correcta y dará como resultado la devolución de los datos correctos).Podría enviar la consulta a la API real, pero los resultados esperados podrían cambiar con el tiempo a medida que cambien los datos en el sistema externo, fuera del control del sistema de prueba.
Podría considerar configurar una instalación de prueba de la API real para controlar los datos que tiene, pero eso es un gran esfuerzo.
Me estoy inclinando hacia el n. ° 2 y estoy haciendo esto más como una prueba de integración que no se ejecuta con frecuencia y viendo con qué frecuencia los cambios en los datos del sistema externo hacen que la prueba se rompa. Creo que eso sería más simple por ahora, pero me pregunto si hay alternativas en las que no estoy pensando o mejores formas de abordar este problema. Cualquier consejo sería apreciado.