Testing/TDDing 私有方法

Testing/TDDing Private Methods

还有另一个 post 关于测试私有方法,但我希望这个会与规范有所不同。

人们总是想知道私有方法实际上应该是 public 还是将功能提取到另一个 class 中可以对其进行测试,或者最终做出其他妥协。

很多 programming/scripting 语言都来自 Reflections class,所以考虑到这一点,为什么我们不能自动化一种使我们的私有方法可测试的方法?例如,假设我们有一个 class 和一个我们想要测试的私有方法,这样的事情肯定会起作用:

class ClassWeWantToTest {
    private somePrivateMethod([args, ...]) {
        // Do stuff.
    }
}

class ClassWeWantToTest_TestWrapper extends ClassWeWantToTest {

    public somePrivateMethod_test([args, ...])
    {
        return this->somePrivateMethod([args, ...]);
    }
}

可以使用允许的语言手动和自动创建此类测试层。甚至可以有一个理解语法的第三方工具,它将解析 class 并生成一个层。显然,私有方法只会对测试进行public。在正常使用中,私有方法保持私有。

为什么还没有完成?这真的是个愚蠢的想法吗?我认为这是因为它还没有完成。它肯定会帮助 class-混乱,其中刚刚创建 classes 以帮助提高可测试性。我知道,它会暴露整个 class,但那又怎样?开发人员知道它是如何工作的,现在可以测试他的代码的更多方面,而不必盲目工作。开发人员将能够使用带有或不带有包装器的 class,这将提供更大的灵活性。

Many programming/scripting languages off a Reflections class, so with that in mind, why can't we automate a way of making our private methods testable?

可以,但是你把优先级放错了。

TDD 的重点是改进您的设计。设计的一个重要元素是对测试很重要的部分也 easy/cost-effective 进行测试。

编写我们一直编写的相同的意大利面条代码,但通过测试,错过了这一点。

更广泛地说,如果您的 "private" 方法足够复杂,以至于您在仅测试 public 接口时无法接受风险,那么这是一个很大的暗示你真正拥有的是一个独立于封闭 method/class 的概念。因此,补救措施是重新设计您的解决方案,以便您可以将测试探针放在您想要的地方。

您可能想在 Published methods

上评论 Martin Fowler

There's something to be said for the public-published distinction being more important than the more common public-private distinction.