如何用TDD开发复杂的方法

mat*_*ias 5 tdd

几个星期前,我用TDD开始了我的第一个项目.到目前为止,我只读过一本关于它的书.

我主要担心:如何编写复杂方法/类的测试.我写了一个计算二项分布的类.因此,该类的方法将n,k和p作为输入,并计算resp.可能性.(实际上它做得多一些,这就是为什么我必须自己编写它,但为了方便论证,让我们坚持这个类的描述.)

我测试这个方法的方法是:将我在网络中找到的不同n的一些表复制到我的代码中,随机选择此表中的一个条目,然后输入.n,k和p的值进入我的函数,并查看结果是否接近表中的值.我为每张桌子多次重复这一点.

这一切都运行良好,但在编写测试后,我不得不坦克几个小时来真正编写功能.从阅读本书开始,我的印象是我不应该编写超过几分钟的代码,直到测试显示为绿色.我在这做错了什么?当然,我已经用很多方法打破了这个任务,但它们都是私有的.

一个相关的问题:从表中随机抽取数字是不是一个坏主意?如果出现错误,我将显示此运行使用的随机种子,以便我可以重现该错误.

Vir*_*ras 6

我不同意人们说测试私有代码是可以的,即使你把它们分成不同的类.您应该测试应用程序(或您的库,如果它是您正在编码的库)的入口点.当您测试私有代码时,您将限制您的重新分解可能性(因为重构您的私有类意味着重构您的测试代码,您应该避免这样做).如果你最终在其他地方重新使用这个私有代码,那么确定,创建单独的类并测试它们,但在你做之前,假设你不需要它.

为了回答你的问题,我认为是的,在某些情况下,它不是"直到你走绿色的2分钟"的情况.在这些情况下,我认为测试需要花费很长时间才能实现绿色环保.但大多数情况都是 "直到绿色2分钟"的情况.在你的情况下(我不知道关于二项分布的深蹲),你写道你有3个参数,n,k和p.如果你保持k和p不变,你的函数是否更容易实现?如果是,您应该首先创建始终具有常数k和p的测试.测试通过后,为k引入一个新值,然后为p引入.


S.L*_*ott 3

“我的印象是,在测试再次显示绿色之前,我的编码时间不应超过几分钟。我在这里做错了什么?”

韦斯特法尔在某种程度上是正确的。

有些功能一开始很简单,可以简单地测试和编码。

有些功能一开始并不简单。简单却很难实现。EWD 表示,简单性并不被重视,因为它很难实现。

如果你的函数体很难写,那么它就不简单。这意味着您必须更加努力才能将其简化为简单的事情。

当你最终实现简单之后,你也可以写一本书来展示它是多么简单。

在你实现简单之前,写东西会花费很长时间。

“从桌子上随机选择数字是一个坏主意吗?”

是的。如果您有示例数据,请针对所有示例数据运行测试。使用循环或其他东西,并测试您可能测试的所有内容。

不要选择一行——随机或以其他方式选择所有行。