你有没有加入单元测试,在事后,对遗留代码? 多么复杂的代码,以及如何困难存根和模拟一切? 是最终的结果值得吗?
Answer 1:
最好的办法,我发现,是逐步增加的单元测试,不只是跳,说我们现在将单元测试应用程序。
所以,如果你要碰代码,bug修复或重构,则先写单元测试。 对于错误的单元测试将有助于证明问题出在哪里,你可以复制它。
如果重构,你将要编写单元测试,但你会发现,测试是不可能写出,所以你可能需要找到一个高层次,调用将被重构功能和单元测试的一部分。 然后,当你重构进攻功能,写你的测试,这样可以确保它正在运行,因为它应该。
有没有简单的方法来做到这一点。
这个问题可以帮助更多的建议。 你如何引入单元测试投入大,传统的(C / C ++)的代码库?
Answer 2:
“修改代码的工作”迈克尔羽毛本书涵盖这个话题一整本书。 迈克尔说,它往往是太难以引进试验遗留代码,因为它不是用来被测试。 我拿出书的最多的是一对夫妇的名为“萌芽功能”和“萌芽班”模式。 萌芽函数是一个封装了,你需要在代码中进行更改。 然后,您只单元测试这些功能。 芽类是除了新功能相同的想法被包含在一个类中。
Answer 3:
是的,这是一般痛苦。 我常常最后不得不编写集成测试来代替。
该书单元测试的艺术有这方面的一些好的建议。 它还建议书修改代码的工作 ; 我没有看过后还,但它在我的筹码。
编辑:但是,是的,即使是最小的代码覆盖率是值得的。 这给了我信心和安全网重构代码。
编辑:我看过修改代码的工作,这是非常好的。
Answer 4:
也看看旧代码进行单元测试领域的新方法- 阿齐兹的项目 ,它的灵感来源于ApprovalTests项目,并分享其关键概念。
如前所述约在ApprovalTests办法这篇文章 :
通常你有你在哪里都没有测试一个巨大的遗留代码项目,但你必须改变代码来实现新的功能,或者重构。 有关遗留代码有趣的是 - 它的工作原理! 它的工作原理多年来,不管它是怎么写的。 这是该代码的一个很大的优势。 使用审批,只有一个测试,你可以得到所有可能的输出(HTML,XML,JSON,SQL或任何其输出可能会)批准,因为你知道 - 它的作品! 你必须完成这样的测试和批准的结果后,你真是一个重构安全得多,因为现在你“锁定”现有的所有行为。
阿齐兹工具正是通过关于创建和运行自动表征测试mantaining遗留代码。
如需进一步信息看
- 详细自述在项目的GitHub库
- 在讨论黑客新闻
- 在讨论reddit.com/r/php
- 在讨论reddit.com/r/programming
Answer 5:
一种可以替代的单元测试,在修改代码的工作还推出了为表征测试 。 我有这样的测试有趣的结果。 他们更容易为你点比测试可以测试(称为缝),以建立比单元测试。 其缺点是,当一个测试失败,你对这个问题的位置不太提示,被测面积可能比单元测试大得多。 记录在这里帮助。
单元测试框架的那些xUnit家族的此类可用于写特性测试。
在这样的测试中,事实写入后,断言验证码的当前行为。 不同于单元测试,他们不证明代码是正确的,他们只是牵制(特征)代码的当前行为。
该过程是作为一个TDD类似,:
- 写一个测试的代码的一部分
- 执行它 - 失败
- 从代码的观察到的行为确定测试
- 执行它 - 通过
- 重复
如果您修改代码的外部行为的测试将失败。 代码的外部行为? 听起来很熟悉 ? 的确是这样,我们在这里。 现在,您可以重构代码。
显然,风险取决于表征测试的覆盖范围。
Answer 6:
看看免费的,开源的单元测试工具库, ApprovalTests 。 如果你是一个.NET开发人员,创建者,卢埃林法尔科,取得了一系列的视频显示他如何使用ApprovalTests改善为新的和旧的代码进行单元测试。
Answer 7:
如果您在重构遗留代码然后创建这些单元测试计划是必须的。 不要担心嘲讽或钳 - 担心测试系统的输入和输出,使您的改变或重构努力不会打破当前的功能。
我不会骗你,改造单元测试遗留代码是困难的 - 但它是值得的。
Answer 8:
我一直在讲,前一段时间关于反测试金字塔遗留代码的主意XPDays http://xpdays.com.ua/archive/xp-days-ukraine-2012/materials/legacy-code/
此演示文稿应该回答这个问题,为什么它是如此重要,有时与旧代码工作时开始集成/功能性,甚至高级别验收测试。 然后慢慢地,一步一步引入的单元测试。 有没有代码的例子 - 抱歉,但你可以找到迈克尔羽毛册上的一堆“修改代码的工作”。
您还可以检查遗留代码务虚http://www.jbrains.ca/legacy-code-retreat并查找您所在地区的会议。