TDD中的重构细节

3

我已阅读此文章

http://codebetter.com/iancooper/2011/10/06/avoid-testing-implementation-details-test-behaviours/

我对以下内容感到困惑

"在重构的上下文中开发的代码不需要新的测试!"

例如,在重构期间,我决定将一些计算移到一个新类中,该类为我计算阶乘,并且我使用这个类来计算一些特定于用户的细节。在我的要求中,我永远不需要编写此类的功能,因为它仅在重构期间创建。但是我应该何时用测试覆盖此类以保证预期行为?据我所知,我永远不会用测试覆盖此类,或者我错了吗?

1个回答

4

你说得对。

考虑重构有两种方法,它们涵盖了略微不同的技术集合。

第一种是进行幂等更改:在方法内部修复小问题,以便最终结果不会改变。正如文章中所说,这不需要更改。

第二种(我认为更有趣的)涉及创建新类、更改使用的设计模式,有时还要对类(或类)结构进行巨大的更改。这需要随着进行更新测试。

让我提出一个不同的解释:对我来说,您至少需要两个级别的测试:

  • 单元测试,用于方法测试。这些测试将在重构生产代码时更改,以遵循代码修改(甚至可以在更改之前进行测试驱动开发)

  • 验收测试(可能使用集成测试框架,如FITnesseJBehave,或如果没有,则使用普通的JUnit)-这些测试是高水平的验收标准,它们在重构期间不应更改,并且仍然在结束时通过。实际上,它们是您的挽具,成功重构的证明。破坏代码,修改它而不加思考,到了一天结束时,验收测试仍应通过。如果过了,你就可以继续了。如果没有,那意味着您已经破坏了某些东西(或者您的测试一开始就是错误的)。

(还需要另一种级别的测试:系统测试或集成测试,但它们超出了本问题的范围)


我认为,为了进行适当的TDD,我应该编写小型/快速测试。并且经常运行它们。但是我认为验收测试不太快,网站的一堆验收测试将非常慢。我认为在重构期间单元测试中的更改是不可避免的。我没有阅读Kent Beck的TDD,因此我对此有纯粹的看法。 - Maksim Kondratyuk
1
现在我已经阅读了你提供的文章(第一次只是快速浏览),作者选择的方法不是进行细粒度的单元测试,而是基本上只进行验收测试。我对这种方法有点不舒服,我更喜欢在重构期间更改我的测试(特别是因为我严重依赖模拟)- 更改测试可以被视为重构的一部分。 - Guillaume
2
你说得对,验收测试需要更多的编写时间,但它们对于记录系统并将用户需求直接转化为实际代码是非常宝贵的。事实上,我的TDD个人方法是:编写验收测试,与用户验证,然后开始单元TDD(基本的红绿重构循环),最后检查我的验收测试是否通过。如果您喜欢,这是两个嵌套的TDD周期 :) 我原始的验收测试给了我一个很好的方式来知道我完成了正在处理的故事/任务。当你不得不在完成之前将任务交给别人时,也很方便。 - Guillaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接