唯一的逻辑是外部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;
}
该查询采用API的语法自定义方式,非常复杂,并且有多种方法可以实现相同或相似的结果。该功能的目的不是获取由标识的数据,id
而是根据与标识的数据之间的模糊关系找到其他数据的子集,该模糊关系id
也满足其他一些要求。不管其他要求如何,其他要求始终相同,id
但是随着系统的修改,其他要求可能会随时间而变化。例如,如果示例api添加了对重力信息的支持,我们可能希望更改查询以也使用重力来优化结果。或者,也许我们想出了一种更有效的方法来检查温度范围,但它不会改变结果。
我要测试的是,对于给定的输入id
,将返回正确的数据集。我想对此进行测试,以便如果有人将查询弄乱,使其不再基于id
失败而返回正确的数据,但我也希望人们能够修改查询以优化查询,而无需也进行修改考试。
我考虑过的选项:
我可以对api进行存根处理,但这可能太简单了(检查查询中
id
是否存在,然后返回预期的数据集(如果没有)或返回意外的数据集),太脆(检查查询字符串是否正确)。或功能太复杂(检查所使用的查询在语法上是否正确,并会导致返回正确的数据)。我可以将查询提交给真实的api,但是随着外部系统中数据的变化(在测试系统的控制范围之外),预期的结果可能会随着时间而变化。
我可以考虑设置真实api的测试安装以控制其具有的数据,但这是很多工作。
我倾向于#2,将其更多地作为不经常运行的集成测试,并查看外部系统数据的更改导致测试中断的频率。我认为目前这是最简单的方法,但是我想知道是否有我没有想到的替代方法或解决此问题的更好方法。任何意见,将不胜感激。