Unit testing 在自己的单元测试中针对函数输出进行断言?

Unit testing 在自己的单元测试中针对函数输出进行断言?,unit-testing,tdd,Unit Testing,Tdd,如果这个标题没有意义(我期待=),我想问的是: 我有一个名为ParseFile()的函数。它以字符串作为参数,以DataTable作为返回值 我想对这个函数进行单元测试。首先编写函数代码,运行它,获取输出,将其序列化为XML,将其保存为预期输出,然后编写单元测试来调用函数并对反序列化数据进行断言,这是我的错误吗 我意识到这有助于我今后的工作,如果我们获得了以前可能没有见过的新输入,并且必须更改解析函数来处理它,那么运行我的测试现在将断言我没有破坏任何当前正在工作的文件。太棒了 。。但在这种情况下

如果这个标题没有意义(我期待=),我想问的是:

我有一个名为ParseFile()的函数。它以字符串作为参数,以DataTable作为返回值

我想对这个函数进行单元测试。首先编写函数代码,运行它,获取输出,将其序列化为XML,将其保存为预期输出,然后编写单元测试来调用函数并对反序列化数据进行断言,这是我的错误吗

我意识到这有助于我今后的工作,如果我们获得了以前可能没有见过的新输入,并且必须更改解析函数来处理它,那么运行我的测试现在将断言我没有破坏任何当前正在工作的文件。太棒了

。。但在这种情况下,格式永远不会改变,是标准的。那么,做我所说的是完全无用的吗?如果是,那么如何测试这个功能呢

见鬼,如果我说的仍然是个好主意-你会如何做真正的TDD风格并首先编写测试?不必为文件中的每个预期字段冗长地编写Assert calls()?我还没有完全进入TDD‘模式’-但我正试图达到那里。。。在这种情况下,我有时会想,如果预期的输出是一个数据集,那么如何首先为它编写测试呢


谢谢

这取决于您编写测试的原因

从测试驱动开发的角度来看,您描述的过程是错误的。从质量保证的角度来看,它很有意义,因为它为您提供了一个回归测试套件,在您前进的过程中,它可以作为一个安全网

使用TDD开发此类方法的关键是将它们划分为更小的块(单元),并单独测试每个块。如果您能够将其拆分为许多较小的块,那么它通常会生成一个更灵活和可重用的API,而不是使用一个具有一些输入和输出以及该方法后面的大量操作的方法

你如何分解这种方法

开始考虑如何将其组织到私有助手方法中。然后考虑这些辅助方法中的一些(或全部)是否可以想象由对象本身表示。在这个意义上,诸如策略抽象工厂之类的设计模式非常有用


与包含大量内部逻辑的粗粒度API不同,您最终将得到包含大量公共但可组合逻辑的细粒度API。

您不应该在测试时比较对象的序列化形式。它太具体于实现。您应该只测试接口


您应该测试DataTable对象的特定属性,例如,它有四行五列,单元格[1,2]包含字符串“Fish”。

通常,我会尽量避免测试那些“宽泛”的函数。我更喜欢测试更细粒度的函数。我将假设您的ParseFile()方法使用了几个实用方法,这些实用方法本身也使用其他实用方法。这些就是我尝试测试的方法。通常,任何类似的输入都是由几个不同的数据段组成的。与其尝试测试整个文件是否被直接解析,您是否可以查看ParseFile()方法和正在解析的数据,并将其分解为几个较小的测试,当这些测试被合并时,可以给您同样的信心


我个人倾向于使用这种方法的理由是,如果我需要修改任何解析代码,而测试失败,我可以更快地找到失败的根源,而不是“ParseFile()没有返回预期的结果”。)

这看起来更像是黑盒测试,而不是单元测试。但是,如果您确信生成的数据集是正确的,那么我认为您这样做没有问题。您正在确保数据集在将来不会更改,我认为这是一个很好的测试,但不一定是一个单元测试。这没有错,但不是TDD

话虽如此,我还是想警告您关于XML字符串的断言:当XML大小足够大时出现问题时,您最终会手动比较这两个XML字符串,错误是视觉上的

我去过那里,做过那件事。我记得在这种情况下,将XML复制到两个文件中,将其修改为每行有一个属性,并将这两个文件与
diff
进行比较。我说过下次我将尝试使用XPath和/或XQuery对XML进行断言

另外,您的函数不是做了太多的事情:解析字符串和生成XML吗?你可能想考虑把这个分开。 你怎么能做到真正的TDD 首先设计并编写测试


如果您真的想使用TDD并保留一个函数,那么可以从一个测试开始:如果是空字符串,您的XML输出应该是什么样子?这是你的第一次考试。一旦通过,用一个简单元素的字符串重新启动,编写测试,使其通过,并获取一个更复杂的字符串。起泡、冲洗、重复。

我过去曾使用过类似的测试——它们通常非常有用

它们完全不是TDD。我发现,当我有没有TDD:Glue代码构建得更好的代码时,我就编写了这种测试。特别是在数据提取(也称为“查询数据库以获取此(现有)数据,以这种方式对其进行格式化,并将其发送到客户端”)中,您可以使用TDD字段格式化程序或其他实用程序对象,但对于这类代码来说,最重要的是,如果您为给定的(大)输入生成给定的(大)输出。将代码翻过来引入测试接缝是不值得的

您确实从这种测试中获得了单元测试套件最重要的优点:如果您更改了基础功能的共享部分,并且它破坏了功能,那么您的测试将变为红色

有些人会说