如何测试可能无法给出正确答案的方法

时间:2009-07-07 19:15:04

标签: unit-testing

想象一下,您有一个内部控制的供应商列表。现在想象一下,您希望将非结构化字符串与该列表进行匹配。大多数都很容易匹配,但有些可能是合理的不可能。算法将为每个匹配分配置信度,但人类需要确认所有匹配产生。

该算法如何进行单元测试?到目前为止,我唯一的想法是采用人类匹配的样本,并确保算法能够成功匹配那些,省略了我无法合理地期望我们的算法处理的字符串。还有更好的方法吗?

8 个答案:

答案 0 :(得分:3)

我会尝试一些“规范”对,“应该匹配”和“不匹配”对,并且仅在置信度高于(或低于)给定阈值时进行测试。

也许你也可以进行一些排序检查,例如“没有对应该比完全匹配对更有信心”,或者“匹配所有辅音的对应该是> =唯一的元音一”。

答案 1 :(得分:1)

您还可以测试算法无法正常处理的字符串的置信度是否足够低。通过这种方式,您可以查看是否存在可以信任算法的阈值。

答案 2 :(得分:1)

一个有趣的练习是存储纠正算法的人类答案,并尝试查看是否可以改进算法以避免错误。

如果可以,请将新匹配添加到单元测试中。

答案 3 :(得分:0)

我认为没有比你描述的更好的方式;实际上,您只是使用一组预定义数据来测试算法是否符合您的预期。对于任何非常复杂的算法,它具有非常非线性的输入和输出,这是你可以做的最好的;选择一个好的测试集,并确保您对该组已知值正确运行。如果将来需要测试其他值,您可以将它们添加到测试值集中。

答案 4 :(得分:0)

听起来很公平。如果可能(给定时间限制)获得尽可能大的人类匹配样本,您可以了解算法的效果。如果它们在正确性的X%范围内,您可以设计特定的单元测试。

祝你好运。

答案 5 :(得分:0)

我认为这里存在两个问题:您的代码根据算法的行为方式,以及算法成功的方式(即不接受人类后来拒绝的答案,并且不拒绝人类会接受的答案)

问题1是定期测试。问题2我会使用以前的结果集(即将算法的结果与人类结果进行比较)。

答案 6 :(得分:0)

你所描述的是最好的方式,因为它是主观的最佳匹配,只有人才能提出适当的测试用例。

答案 7 :(得分:0)

听起来好像是在描述一种确定性的算法,但是这个算法非常难以对您正确的结果进行最佳的初步猜测,这将是您当前实现为您提供的任何内容(也就是满足模糊要求的确定性实现) )。

对于那些情况,我将使用“Guru Checks Changes”模式。生成输入集合,记录输出,并在随后的单元测试运行中,验证结果与先前结果一致。确保正确实现目标算法并不是那么好,但确保最近的重构没有改变测试空间中的行为是有效的。

这种情况的一个变体 - 可能更适合您的情况,是从相同的初始数据集合开始,而不是每次您预定义一些桶时尝试保留完全相同的结果,并标记任何时间实施更改将测试结果从一个置信桶移动到另一个置信桶。

具有明确正确答案的样本(完全匹配,空匹配,高价值的案例)应该保存在单独的测试中。