gpt4 book ai didi

unit-testing - 不变测试可以代替单元测试吗?

转载 作者:行者123 更新时间:2023-12-03 08:49:22 26 4
gpt4 key购买 nike

作为一名程序员,我全心全意地投入TDD哲学,并努力对我编写的任何平凡的代码进行广泛的单元测试。有时候这条路可能很痛苦(行为更改导致级联的多个单元测试更改;需要大量的脚手架),但总的来说,我拒绝编写没有每次更改后都可以运行的测试的程序,并且我的代码像结果。

最近,我一直在玩Haskell,它是常驻测试库QuickCheck。 QuickCheck以与TDD截然不同的方式,着重于测试代码的不变性,即测试某些属性,这些属性保留所有输入(或实质子集)。一个简单的例子:如果我们运行两次,稳定的排序算法应该给出相同的答案,应该具有增加的输出,应该是输入的排列等。然后,QuickCheck生成各种随机数据以测试这些不变量。

在我看来,至少对于纯函数(即没有副作用的函数,如果正确模拟,您可以将脏函数转换为纯函数),那么不变测试可以取代单元测试,成为这些功能的严格超集。每个单元测试都由一个输入和一个输出组成(在命令式编程语言中,“输出”不仅是函数的返回,而且还包括任何已更改的状态,但可以将其封装)。可以想象,可以创建一个随机输入生成器,该生成器足以覆盖您将手动创建的所有单元测试输入(然后是一些,因为它会生成您不会想到的情况)。如果由于某些边界条件而在程序中发现错误,则可以改进随机输入生成器,使其也生成这种情况。

那么,挑战在于是否有可能为每个问题制定有用的不变式。我想说的是:一旦有了答案就可以知道答案是否正确,比起首先计算答案要简单得多。与不变式测试用例相比,对不变式的思考还有助于更好地阐明复杂算法的规范,后者鼓励对问题进行逐案思考。您可以将程序的先前版本用作模型实现,也可以使用另一种语言的程序版本。最终,您可以涵盖所有以前的测试用例,而不必显式地编码输入或输出。

我疯了吗,还是我正在做某事?

最佳答案

一年后,我现在想对这个问题有一个答案:不! 特别地,对于回归测试,单元测试将始终是必需的和有用的,在回归测试中,将测试附加到错误报告中并存在于代码库中,以防止该错误再次出现。

但是,我怀疑任何单元测试都可以用输入是随机生成的测试来代替。即使在命令式代码的情况下,“输入”也是您需要进行的命令式语句的顺序。当然,创建随机数据生成器是否值得,是否可以使随机数据生成器具有正确的分布是另一个问题。单元测试只是简并的情况,随机生成器总是给出相同的结果。

关于unit-testing - 不变测试可以代替单元测试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/766867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com