A única lógica real está na sintaxe da consulta para a API externa. Eu não quero testar se ele consulta a API, quero testar se ele a consulta de forma que os dados corretos sejam retornados. Por exemplo, alguns pseudo-códigos:
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;
}
Um exemplo mais concreto com uma 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;
}
A consulta está em uma sintaxe personalizada da API e é complexa e há várias maneiras de obter resultados iguais ou semelhantes. O objetivo da função não é obter dados identificados por, id
mas encontrar um subconjunto de outros dados com base em um relacionamento difuso com os dados identificados por id
que também atende a alguns outros requisitos. Os outros requisitos são sempre os mesmos, independentemente, id
mas podem mudar com o tempo à medida que o sistema é modificado. Por exemplo, se a API de exemplo adicionou suporte para informações de gravidade, podemos alterar a consulta para também usar a gravidade para refinar os resultados. Ou talvez tenhamos uma maneira mais eficiente de verificar o intervalo de temperatura, mas isso não altera os resultados.
O que eu quero testar é que, para uma determinada entrada, id
o conjunto correto de dados seja retornado. Desejo testar isso para que, se alguém atrapalhar a consulta de forma que não retorne mais os dados corretos com base na id
falha, mas também quero que as pessoas possam modificar a consulta para refiná-la sem precisar modificar também o teste.
Opções que eu considerei:
Eu poderia stub a API, mas isso seria muito simples (verifique se
id
está presente na consulta e, em seguida, retorne um conjunto de dados esperado, se for, ou um conjunto inesperado, se não for), muito frágil (verifique se a string de consulta está exatamente o que está na função), ou muito complexa (verificação de que a consulta usada é sintaticamente correto e irá resultar nos dados corretos estão sendo devolvidos).Eu poderia enviar a consulta para a API real, mas os resultados esperados podem mudar com o tempo, à medida que os dados no sistema externo são alterados, fora do controle do sistema de teste.
Eu poderia olhar para configurar uma instalação de teste da API real, a fim de controlar os dados que ela possui, mas isso é muito esforço.
Estou me inclinando para a segunda posição e tornando isso mais um teste de integração que não é executado com frequência e vendo com que frequência as alterações nos dados do sistema externo fazem com que o teste seja interrompido. Eu acho que seria mais simples por enquanto, mas estou me perguntando se existem alternativas nas quais não estou pensando ou melhores maneiras de resolver esse problema. Qualquer conselho seria apreciado.