我想前言本认为这个问题是相似的,但我的问题不涉及随机性,只是挑剔的决定,所以回答“使用已知的种子”并没有真正适用。同样,这个问题是相似的,但是我也不希望算法会失败-我只是不知道哪种方法正确。
这个问题是在测试图形算法时出现的。但绝不仅限于此。某些算法(例如A *)可以有多个正确答案。根据您的确切实现,您可能会得到几个答案中的任何一个,每个答案都是正确的。但是,这会使他们难以测试,因为您不知道它会提前吐出哪一个,并且手工计算答案非常耗时。
在我的特定情况下,我通过修改Floyd-Warshall使其吐出所有可能的最短路径来解决它,并花了一些时间进行测试。它具有本身就是一个好的功能的好处。然后,我可以根据FW已知的正确路径测试其他功能(如果返回的路径是FW为该开始/结束对返回的路径中的任何一条,那是正确的)。当然,由于FW的工作原理,这仅适用于密集图,但它仍然很好。
但是,这对于具有此特征的所有算法可能并不总是可行的。到目前为止,我想出的最佳答案是测试正确答案的特征,而不是正确答案本身。要返回最短路径算法,您可以对照已知的正确成本检查返回路径的成本,并确保路径有效。
此方法可行,但存在更多的正确性标准时,可能冒着无法正确验证所有内容的风险,尤其是在验证本身很复杂的情况下(例如,在存在正确算法的情况下,验证最小生成树是一个已知的难题;可能比构建MST本身),在这种情况下,您现在必须广泛测试测试代码。更糟:大概您必须构造一个MST来测试MST验证算法,因此您现在遇到了一个很好的方案,其中MST测试依赖于MST验证算法的工作,而MST验证算法测试依赖于MST生成代码的工作。
最后,有一种“便宜的方法”,它涉及观察输出,手工验证输出,然后对测试进行硬编码以测试刚刚验证的输出,但这并不是一个好主意,因为您可能每次都要修改测试稍微更改实现(这是自动化测试应该避免的)。
显然,答案取决于您在某种程度上要测试的确切算法,但是我想知道是否有“最佳实践”来验证具有几个确定的,确定性的“正确”输出的算法,但是这些精确的正确输出很难做到提前知道,可能事后甚至很难核实。