Unit testing 初学者单元测试-测试方法的复杂输入

Unit testing 初学者单元测试-测试方法的复杂输入,unit-testing,Unit Testing,我正在学习单元测试,并努力解决一些可能相当基本的概念。假设我有两种方法 方法A将文件作为输入并返回复杂的对象层次结构 方法B获取对象层次结构并对其进行处理 我了解如何测试方法A(以及它依次调用的各种其他方法)。我对如何最好地测试方法B感到困惑 我可以在我的单元测试中建立一个伪对象继承权作为方法B的输入,但当我这样做时,感觉我的单元测试已经不再是对方法B的测试,而是对我是否正确地手动创建了一个有效的对象继承权的测试 对我来说,测试方法A似乎更符合逻辑,保留输出,然后用它来测试方法B,但我知道每个单

我正在学习单元测试,并努力解决一些可能相当基本的概念。假设我有两种方法

方法A将文件作为输入并返回复杂的对象层次结构

方法B获取对象层次结构并对其进行处理

我了解如何测试方法A(以及它依次调用的各种其他方法)。我对如何最好地测试方法B感到困惑

我可以在我的单元测试中建立一个伪对象继承权作为方法B的输入,但当我这样做时,感觉我的单元测试已经不再是对方法B的测试,而是对我是否正确地手动创建了一个有效的对象继承权的测试

对我来说,测试方法A似乎更符合逻辑,保留输出,然后用它来测试方法B,但我知道每个单元测试只意味着测试一件事情


我(认为)我理解模仿和伪造的概念,但我不确定这是不是答案,因为方法B将使用整个对象继承权,而不仅仅是看它的一小部分。

严格的单元测试将孤立地测试某些东西。因此,如果它是一个单元测试,那么您应该单独进行测试。您还可以进行集成测试,同时测试methodA和methodB。我个人会从一个独立测试的基本单元测试开始,特别是如果methodB是非平凡的或任务关键型的。当你在隔离状态下测试时,你减少了测试本身的某些东西导致通过的可能性,而隔离状态下的测试将显示失败

在某些情况下,单独测试是不切实际的。还有一些情况下,两个方法非常简单,我会一起测试它们,比如setter/getter。但是,这似乎不是其中之一,因为您主要是在抱怨创建测试数据

为了减轻为单元测试创建数据的痛苦,我通常构建一个TestUtil类,其中包含静态(在Java语言中)方法,这些方法返回测试数据,然后测试TestUtil。这样,我只经历过一次繁琐的对象构建的痛苦,我相信这是正确的。在您的例子中,因为您已经测试了文件生成代码,所以我将获取其输出并将其放入其中一个实用程序方法中,然后使用实用程序方法单独测试methodB

最后,如果methodB接受一个复杂的输入,并对整个输入执行其工作,并且它很复杂,那么可能是methodB本身太复杂了,应该分解为更小、更易于管理和可测试的方法

单元/集成测试的主要好处之一是它为应用程序设计提供信息。如果很难测试,它可能太复杂了


编辑——从你的解释来看,方法B听起来相当复杂。明确地测试B单独调用的方法;唯一一次我不会这么做是如果所有的方法都是私有的,并且不能单独测试

方法B不是单一的,它调用各种其他方法,但它仍然是单一的“入口点”方法。你会建议在这种情况下,测试方法B不如测试它调用的其他方法重要吗?+1表示“如果很难测试,它可能太复杂了……”我只想强调,单元测试通常应该只测试单个对象,而不是原始海报中提到的对象层次结构。