QnA Api returns 响应代码 200 OK 无论 KB 中是否匹配

QnA Api returns response code 200 OK irrespective of no match in the KB

我一直在尝试为我的应用程序的 QnA 编写自动化测试。今天,在 运行 测试时,我注意到所有测试都通过了,无论我给几个 QnA 的输入有误。

当我检查时,我发现由 QnA Api 编辑的响应代码 return 与验证密钥一样有效 headers 总是 200 Ok 无论输入是否对于特定的 QnA 是对还是错。因此,自从验证响应代码为 200 Ok 的步骤始终保持通过以来,我的所有测试都通过了。响应也采用正确的 Json 格式,因此格式测试也一直通过。

我知道这就是 Api 保持 returning 200 Ok 状态代码的原因,但我认为理想情况下它应该使用与在响应 body。唯一的区别是,当向 Api 提供无效输入时,'answer' 响应 body 参数 return 编辑了一条错误文本消息,例如:"No good match found in KB." This可以在下面看到。

而如果 BOT 的输入有效,则会获得以下响应。请注意,唯一的区别在于响应 body 中 'answer' 响应参数的值。

最后我不得不添加验证器来验证测试 returning 200 Ok 也没有 return 错误消息文本响应 body 'answer' 参数。但是现在,如果将来错误响应消息文本发生更改(服务所做的更改),我的测试也会失败,因为它们已被设置为与特定错误消息进行比较。

在我看来,这只是 QnA Apis 的自动化代码级别测试的临时解决方案。无论如何,是否可以修改由这些 Api 编辑的响应代码 return,以反映响应 body 中的实际响应。如果可以做到这一点,那么一旦响应代码不匹配,就可以停止测试,从而节省时间、精力并提高性能。如果有任何其他方法可以改进这项工作,我愿意接受建议。

注意:我使用 POST 调用方法来测试我的 Apis。

HTTP 状态代码就是这样。它们为您提供特定于 HTTP 请求的信息,例如,如果请求未能到达服务器,您可能会期待不同的代码。对于您的 QnA Maker 应用程序,该应用程序的目的是搜索知识库和 return 详细的响应,知道知识库可能不包含所提出的问题。如果 QnA Maker 应用程序搜索知识库并没有找到好的答案,那么该应用程序仍然完成了它的工作并正确执行,因此如果它能够发回它无法找到答案的信息,那么就没有理由HTTP 状态代码指示成功以外的任何内容。这不是错误。

如果要确定未找到匹配项,则不应使用 HTTP 状态代码来执行此操作。您说响应中的 "only difference" 是您得到类似 "No good match found in KB," 的答案,但再看一下该响应。只有一个答案,分数为 0,但这可能不如您想要的那么可靠。真正的指标是 ID 为 -1 并且源为空且问题数组为空,因此您可以轻松地执行以下操作:

if (results.First().Id < 0)
{
    // No good match was found
}

您还有一个误解,认为 QnA Maker 团队可能会通过修改某种共享服务来更改您的 "no good match" 响应。你有自己的 QnA Maker 应用程序,你正在为其调用端点,这就是定义消息的地方。正如所解释的那样,唯一可以改变它的人就是你 here and here