单元测试一个大方法

Fin*_*las 7 tdd automated-tests unit-testing

遵循测试驱动开发.

我最近实现了一个需要干净界面的算法(A*).通过干净我想要的是一些属性和一个搜索方法.

我发现很难找到的是测试搜索方法.它包含大约五个步骤但我基本上被迫在一个大的进程中编写这个方法,这使得事情变得困难.

对此有什么建议吗?

编辑

我正在使用C#.不,我目前没有手头的代码.我的问题依赖于一个测试只在实现整个搜索方法后才通过 - 而不是算法中的一个步骤.我自然重构了代码,但它实现了我发现很难.

Fin*_*nNk 13

如果您的步骤足够大(或者它们本身就有意义),您应该考虑将它们委托给其他较小的类并测试您的类与它们之间的交互.例如,如果你有一个解析步骤,然后是一个排序步骤,然后是一个搜索步骤,那么拥有一个解析器类,一个分类器类等是很有意义的.然后你可以在每个上使用TDD.

不知道你正在使用哪种语言,但如果你在.net世界中,你可以将这些类放在内部,然后将它们暴露给你的测试类,其中"内部可见",这将使它们隐藏起来.

如果步骤很小而且没有任何意义,那么tvanfosson的建议是要走的路.


tva*_*son 5

将您的大方法重构为更小的私有方法。使用反射或您的语言中可用的其他机制来独立测试较小的方法。最坏的情况——如果您无法访问反射或朋友,请保护方法并使您的测试类从主类继承,以便它可以访问它们。

更新:我还应该澄清,简单地重构为私有方法并不一定意味着您需要创建特定于这些方法的测试。如果要彻底测试依赖于私有方法的公共方法,则可能不需要直接测试私有方法。这大概是普遍情况。有时,直接测试私有方法确实有意义(比如当它简化或减少公共方法所需的测试用例数量时),但我不会仅仅因为您重构为私有方法就认为这是创建测试的必要条件方法实现。