我有一个Rails项目,没有为其构建测试(太丢人了!),代码库变得非常庞大。我的一个朋友说,除非从一开始就使用它,否则使用RSpec会很痛苦。这是真的吗?他为什么这么说?
考虑到现有的测试套件和代码库已经存在,针对这个问题,我该采取什么最佳行动方案才能让它可测试?与从一开始做有多大不同?
我有一个Rails项目,没有为其构建测试(太丢人了!),代码库变得非常庞大。我的一个朋友说,除非从一开始就使用它,否则使用RSpec会很痛苦。这是真的吗?他为什么这么说?
考虑到现有的测试套件和代码库已经存在,针对这个问题,我该采取什么最佳行动方案才能让它可测试?与从一开始做有多大不同?
最近在 RSpec 邮件列表上有一个问题提出来了,我们通常给出的建议是:
您可能会发现,没有通过代码示例或单元测试驱动的代码设计使得编写测试或规范变得困难。这也许就是你的朋友所指的。你几乎肯定需要学习一些关键的重构技术,以打破依赖性,以便你可以从你的规范中独立地练习每个类。Michael Feathers 的优秀著作《与遗留代码有效地工作》有一些很棒的材料可以帮助你学习这项微妙的技能。
我还鼓励您使用内置的 spec:rcov rake 任务生成代码覆盖率统计数据。当您开始对代码库进行测试时,看到这些数字上升是非常有成就感的。
编写现有代码的测试可能会揭示代码中的错误。这些测试将迫使您查看现有代码,以便您可以看到需要编写哪些测试才能使其通过,并且您可能会发现一些可能可以更好地编写的代码或现在无用的代码。
另一个提示是在遇到错误时编写测试,以便它永远不会再次出现,这称为回归测试。
改装规格并不一定是一个坏主意。你从工作代码到具有已知属性的工作代码,这使你能够了解任何未来的更改是否会破坏任何东西。目前,如果您需要进行更改,您如何知道它会影响什么?
当人们说很难向现有代码添加测试/规格时,他们的意思是难以测试的代码通常高度耦合,这使得编写低级别隔离测试变得困难。
一个想法是使用类似于RSpec故事运行器的全栈测试开始。然后,您可以从“外部”开始,在低级别隔离测试中隔离您可以的内容,并逐步逐个解开更难的代码。