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

如何在C#中对算法进行单元测试?,c#,algorithm,unit-testing,C#,Algorithm,Unit Testing,我遇到了一个不确定如何测试的情况:算法。具体来说,我正试图编写Adler32方法并为其创建单元测试,但此时遇到了困难 我的第一次尝试最终是我在方法中使用的相同代码的缩短版本,这似乎是非常错误的。我的下一个尝试是创建一个包含预期结果的输入值表,然后将预期结果与实际结果进行比较。。。这似乎是个好主意,直到我意识到我知道如何填充这个表的唯一方法是运行算法。所以我几乎被卡住了。在单元测试中如何进行单元测试而不重用算法(直接或间接)?使用您描述的输入和已知输出表。您需要从同一算法的另一个实现中,从您知道是

我遇到了一个不确定如何测试的情况:算法。具体来说,我正试图编写Adler32方法并为其创建单元测试,但此时遇到了困难


我的第一次尝试最终是我在方法中使用的相同代码的缩短版本,这似乎是非常错误的。我的下一个尝试是创建一个包含预期结果的输入值表,然后将预期结果与实际结果进行比较。。。这似乎是个好主意,直到我意识到我知道如何填充这个表的唯一方法是运行算法。所以我几乎被卡住了。在单元测试中如何进行单元测试而不重用算法(直接或间接)?

使用您描述的输入和已知输出表。您需要从同一算法的另一个实现中,从您知道是准确的源获取输出


如果您要实现的算法没有现成的输入/输出数据,那么请以另一种方式重新实现该算法,例如在Excel中,并生成您知道准确的数据。我们通常通过统计计算报告来实现这一点,我们可以在Excel中轻松生成数据。

如果我们要讨论单元测试,因为您希望为一个方法/类提供测试,那么您必须提供输入并验证算法的结果

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

在哪里可以获得
17
?使用纸和笔,在线计算网站,任何你可以信任的方式

测试,尤其是单元测试,必须简单且非常轻。您不应该提供一些替代方法来计算结果,并对照生产代码中的结果进行验证。这种方法为您带来了两种不同的实现,您必须对它们进行维护、重构等


显然,您可以提供输入和预期输出表,而不仅仅是
5
17

不确定传递已知输入和验证输出与已知结果匹配有什么问题。。。例如,“添加两个数字”将使用已知输入
{2,2}
进行测试,并验证结果是否为
4
(测试中不运行
2+2
)。@AlexeiLevenkov:我对此没有问题,除了我知道如何生成已知输入/结果的唯一方法是重用我尝试测试的相同算法。对于未经测试的算法,我如何知道结果是正确的?已知良好的输入/输出将很好,但正如您所述,您需要计算输出。一种方法是使用一个已经证明有效的Adler32实现。或者你可以把算法分解成你可以测试的部分。包含可用于生成测试向量的Adler-32的参考实现。我希望大多数已知算法(如您提到的Adler32)都有测试数据。。。对于你发明的新算法,我能想到的唯一选择是让多人独立地用多种语言实现算法,并以这种方式获取测试数据(如果手工计算是不可能的话)。。。