如何在C#中对算法进行单元测试?

4
我遇到了一个测试难题:算法。具体来说,我正试图编写Adler32方法并为其创建单元测试,但是在这一点上我卡住了。
我的第一次尝试最终成为我在方法中拥有的同样代码的缩短版本,这似乎非常不正确。我的下一步尝试是使用一张输入值和期望结果的表格,然后将期望结果与实际结果进行比较...这似乎是个好主意,直到我意识到我唯一知道如何填充此表格的方法就是运行算法。所以我基本上被卡住了。如何在不重新使用算法的情况下对算法进行单元测试(直接或间接)?

不确定你在使用已知输入并验证输出是否与已知结果相符方面的问题是什么... 就像“加两个数字”的测试将使用已知输入{2,2}并验证结果为4(而不是在测试中运行2+2)... - Alexei Levenkov
2
@AlexeiLevenkov: 对于这个我没有问题,除了我知道如何生成已知的输入/结果的唯一方法是通过重复使用我尝试测试的相同算法。我怎么知道未经测试的算法的结果是正确的? - myermian
4
已知良好的输入/输出将很好,但正如您所述,您需要计算输出。一种方法是使用已经被证明有效的Adler32实现。或者,您可以将算法分解成可测试的部分来测试。 - Kyro
RFC 1950 包含 Adler-32 的参考实现,可用于生成测试向量。 - dtb
通常情况下,您不会测试算法,而是它们的实现。由于算法是一个数学概念,通常是通过证明而非测试来验证其正确性。这是一个重要的区别,特别是对于已知/命名的算法,因为它们的实现可以根据一组输入和已知的正确输出进行测试,最坏的情况下,这些输出可以从先前已知为正确的实现中推导出来。 - RBarryYoung
显示剩余2条评论
2个回答

6
使用一个输入输出表格,就像你所描述的那样。你需要从另一个已知准确的实现相同算法的来源获取输出。
如果你正在实现一个没有可用的输入/输出数据的算法,那么可以用另一种方式重新实现该算法,比如在Excel中,生成你知道准确的数据。我们经常在报告的统计计算中这样做,因为我们可以在Excel中轻松生成数据。

0

如果我们谈论单元测试,就像您想要为一个方法/类提供测试一样,您必须提供输入并验证算法的结果。

由于您的算法进行了一些计算,您不能默认信任它(这就是测试的重点),因此您需要根据常量值验证结果。例如,您提供5,您的方法返回17。这可能是好的或不好的-您的测试通过或失败。

从哪里获取17?使用纸和笔、在线计算网站,任何您可以信任的方式。

测试,尤其是单元测试,必须非常简单和轻巧。您不应该提供一些替代方法来计算结果,并将其与生产代码中的结果进行验证。这种方法会给您带来两种不同的实现,您需要维护、重构等。

显然,您可以提供输入和预期输出的表格,而不仅仅是517


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接