我一直在尝试为我的应用程序的QnA编写自动化测试代码。今天,在运行测试时,我注意到所有测试都通过了,无论我对QnA进行了错误输入。
当我检查时,我发现QnA Api返回的带有有效头(如身份验证密钥)的响应代码始终为200 Ok,而不管特定QnA的输入是对还是错。因此,自从确认响应代码为200 Ok的步骤始终通过后,我的所有测试均通过了。响应也采用正确的Json格式,因此格式化测试也一直通过。
我知道这是Api不断返回200 Ok状态代码的原因,但是我认为理想情况下,它应该使用响应代码来响应在响应正文中获得的响应。唯一的区别是,当向Api提供无效输入时,“答案”响应正文参数返回一条错误文本消息,例如:“在KB中找不到很好的匹配项”。可以在下面看到。
在有效输入到BOT的情况下,获得以下响应。请注意,唯一的区别是响应正文中“ answer”响应参数的值。
最后,我必须添加验证器以验证返回200 Ok的测试是否也没有在响应正文“ answer”参数中返回错误消息文本。但是现在,如果将来错误响应消息文本发生更改(由服务进行的更改),我的测试也将失败,因为它们已被设置为与特定的错误消息进行比较。
我认为,这只是QnA Apis自动化代码级测试的临时解决方案。无论如何,可以修改这些Apis返回的响应代码以在响应主体中反映实际响应。如果可以做到,那么只要响应代码不匹配,就可以停止测试,从而节省了时间,精力和性能。如果还有其他方法可以改善这项工作,我欢迎您提出建议。
注意:我正在使用POST调用方法来测试Apis。
答案 0 :(得分:2)
HTTP状态代码就是这样。它们为您提供特定于HTTP请求的信息,因此,例如,如果请求无法到达服务器,您可能会期望输入不同的代码。对于您的QnA Maker应用程序,该应用程序的用途是搜索知识库并返回详细的响应,同时知道知识库可能不包含所提出的问题。如果QnA Maker应用程序搜索知识库,但未找到正确的答案,则该应用程序仍能完成其工作并正确执行,因此,如果它能够将无法找到答案的信息发送回去,则没有理由HTTP状态代码表示成功以外的任何内容。这不是错误。
如果要确定未找到匹配项,则不应使用HTTP状态代码来执行此操作。您说响应中的“唯一区别”是您得到的答案为“在KB中找不到很好的匹配项”,但又对该响应进行了另一番考察。只有一个答案,分数为0,但这可能不如您想要的可靠。真正的指标是ID为-1,源为null,问题数组为空,因此您可以轻松地执行以下操作:
if (results.First().Id < 0)
{
// No good match was found
}
您还存在一个误解,即QnA Maker团队可能会通过修改某种共享服务来更改“不匹配”响应。您拥有自己的QnA Maker应用,正在为其调用终结点,并且在此定义消息。如here和here所述,唯一可以更改它的人是您。