将测试添加到现有Rails项目的最佳方法?

时间:2008-09-21 16:46:29

标签: ruby-on-rails ruby testing

我有一个Rails项目,我忽略了构建测试(为了羞耻!)并且代码库已经非常大了。我的一个朋友说除非你从一开始就使用它,否则RSpec是一种痛苦。这是真的?是什么让他这么说?

所以,考虑到可用的测试套件以及代码库已经存在的事实,那么让这个东西可测试的最佳方法是什么?它真的与从一开始就做的那么不同吗?

6 个答案:

答案 0 :(得分:23)

RSpec邮件列表上的这个问题came up recently,以及我们通常给出的建议是:

  • 除非你要改变它,否则不要试图将规范改编为现有的,工作的代码 - 除非代码需要改变,否则它会让人感到筋疲力尽。
  • 从现在开始为您所做的任何更改开始编写规范。修复错误是一个特别好的机会。
  • 尝试在触摸代码之前训练自己进入规则,首先编写一个失败的示例(= spec)来驱逐变更。

您可能会发现代码示例或单元测试没有驱动的代码设计使编写测试或规范变得尴尬。这可能是你朋友所暗示的。您几乎肯定需要学习一些关键的重构技术来分解依赖关系,这样您就可以独立于规范来运用每个类。 Michael Feathers的优秀书籍Working Effectively With Legacy Code有一些很棒的材料可以帮助你学习这种微妙的技巧。

我还鼓励您使用内置规范:rcov rake任务来生成代码覆盖率统计信息。当您开始对代码库进行测试时,观看这些数字会非常有意义。

答案 1 :(得分:3)

也许从模特开始?它们应该是孤立的,这应该是它们最低悬的水果。

然后选择一个模型并开始编写测试,说明它的作用。随着你的进展,考虑一下测试代码的其他方法 - 是否存在可能你不确定的边缘情况?编写测试并查看模型的行为方式。在开发测试时,您可能会看到代码中的区域不像它们那样干净和重复数据删除(DRY)。现在你有了测试,你可以重构代码,因为你知道你没有影响行为。在你进行测试之前,尽量不要开始改进设计 - 这种方式就是疯狂。

将模型固定后,向上移动。

这是一种方式。替代方案可能从视图或控制器开始,但您可能会发现更容易从端到端事务测试开始,并随着时间的推移逐渐变成越来越小的部分。

答案 2 :(得分:2)

接受的答案是好的建议 - 虽然在某些情况下不实用。我最近在我的一些应用程序上遇到了这个问题,因为我需要对现有代码进行测试。没有别的办法了。

我开始做所有的单元测试,然后转向功能。

养成为任何新代码编写失败测试的习惯,或者在您要更改系统的一部分时。我发现这有助于我获得更多的测试知识。

使用rcov衡量您的进度。

祝你好运!

答案 3 :(得分:2)

为现有代码编写测试可能会揭示代码中的错误。这些测试将强制您查看现有代码,以便您可以看到需要编写哪些测试才能使其通过,您可能会看到一些可能更好编写的代码,或者现在无用。

另一个提示是在遇到错误时编写测试,以免它再次发生,这称为回归测试。

答案 4 :(得分:1)

改进规格并不是一个坏主意。您可以从工作代码转到具有已知属性的工作代码,这样您就可以了解将来的更改是否会破坏任何内容。目前,如果您需要进行更改,您怎么知道它会产生什么影响?

当人们说很难为现有代码添加测试/规范时,人们的意思是难以测试的代码通常高度耦合,这使得编写低级隔离测试变得困难。

一个想法是从使用类似RSpec故事跑者的全栈测试开始。然后,您可以在“外部”中工作,隔离低级别隔离测试中的内容,逐步解决更难的代码。

答案 5 :(得分:-1)

您可以开始编写“特征测试”。有了这个,你可以尝试一下自命不凡的宝石here

尽管如此,它仍在进行中。