我遇到了一种我不确定如何测试的情况:算法。具体来说,我正在尝试编写 Adler32 方法并为其创建一个单元测试,但此时我碰壁了。
我的第一次尝试最终成为我方法中相同代码的缩短版本,这似乎是非常错误的做法。我的下一个尝试是创建一个包含预期结果的输入值表,然后将预期结果与实际结果进行比较……这似乎是一个好主意,直到我意识到我知道如何填充此表的唯一方法是运行算法。所以我几乎被困住了。如何在不重用单元测试中的算法(直接或间接)的情况下对算法进行单元测试?
我遇到了一种我不确定如何测试的情况:算法。具体来说,我正在尝试编写 Adler32 方法并为其创建一个单元测试,但此时我碰壁了。
我的第一次尝试最终成为我方法中相同代码的缩短版本,这似乎是非常错误的做法。我的下一个尝试是创建一个包含预期结果的输入值表,然后将预期结果与实际结果进行比较……这似乎是一个好主意,直到我意识到我知道如何填充此表的唯一方法是运行算法。所以我几乎被困住了。如何在不重用单元测试中的算法(直接或间接)的情况下对算法进行单元测试?
如您所述,使用输入和已知输出表。您需要从您知道准确的来源获取相同算法的另一个实现的输出。
如果您正在实施的算法没有现成的输入/输出数据,那么请以另一种方式(例如在 Excel 中)重新实施该算法,并生成您知道准确的数据。我们经常使用报表的统计计算来执行此操作,我们可以在 Excel 中轻松生成数据。
如果我们要讨论单元测试,因为您想为一种方法/类提供测试,您必须提供输入并验证算法的结果。
由于您的算法进行了一些默认情况下您无法信任的计算(这是测试点),您需要根据常量值验证结果。例如,您提供5
并且您的方法返回17
。哪个好或不好-您的测试通过或失败。
在哪里得到17
?使用纸和铅笔,在线计算网站,任何你可以信任的方式。
测试,尤其是单元测试,必须简单且非常轻便。您不应该提供一些替代方法来计算结果并根据生产代码中的结果进行验证。这种方法为您带来了两种不同的实现,您必须维护、重构等。
显然,您可以提供输入和预期输出表,而不仅仅是5
和17
。