我对Ruby on Rails中的各种测试设备的用途感到困惑。我已经使用该框架大约6个月,但我从来没有理解它的测试部分。我使用的唯一测试是Java中的JUnit3,而且只是简单的。
我读过的所有内容都只显示了测试验证。轨道中的验证不应该起作用吗?看起来更像测试框架而不是测试代码。为什么需要测试验证?
此外,对于代码中的任何更改,测试似乎都非常脆弱。因此,如果您更改模型中的任何内容,则必须更改测试和灯具以匹配。这不违反DRY原则吗?
第三,编写测试代码似乎需要很多时间。这是正常的吗?刷新我的浏览器并看它是否有效会不会更快?我已经不得不玩我的应用程序只是为了看它是否正确流动并确保我的CSS没有爆炸。为什么手动测试不够?
我之前已经问过这些问题而且我没有得到“自动化测试自动化”。我足够聪明,可以找出自动化任务的优势。我的问题是,与好处相比,编写测试的成本似乎非常高。也就是说,任何详细的回复都是受欢迎的,因为我可能错过了一两个好处。
答案 0 :(得分:23)
答案 1 :(得分:2)
测试应验证您的应用程序逻辑。就个人而言,我认为我最重要的测试是我在Selenium中运行的测试。他们检查浏览器中显示的内容实际上是我期望看到的内容。但是,如果这就是我所拥有的,那么我会发现它很难调试 - 它也有助于进行更低级别的测试,集成,功能和单元测试都是有用的工具。通过单元测试,您可以检查模型的行为是否符合您的预期(这意味着每个方法,而不仅仅是validatins)。 Validatins肯定会工作,但只有你做对了。如果你弄错了,他们就会工作,但不是你想象的那样。编写几行测试比以后调试要快。
像http://wiseheartdesign.com/2006/01/16/testing-rails-validations那样的简单示例只检查单元测试中的验证。 O'Reilly在http://www.oreillynet.com/pub/a/ruby/2007/06/07/rails-testing-not-just-for-the-paranoid.html?page=1的文章有点完整(虽然仍然相当基本)。
自动化测试在回归测试中特别有用,在回归测试中,您可以更改某些内容并运行一系列测试来检查您是否没有破坏任何其他内容。
测试是一种重复形式,但它们并不违反DRY,因为它们以不同的方式表达事物。测试说“我做了X所以Y应该发生”。代码说“X发生了,所以现在我需要做Z,这恰好会导致Y发生”。即,测试会刺激原因并检查效果,而代码会对原因做出反应,并产生影响。
答案 2 :(得分:2)
许多测试教程和Rails生成器创建的示例测试都非常蹩脚,恕我直言,可能会给人错误的印象,你应该测试内置的Rails等愚蠢的东西方法等。
由于Rails拥有自己的测试套件,因此编写或运行仅测试内置Rails功能的测试没有意义。您的测试应该运用代码您写作! : - )
至于运行测试与在浏览器中刷新的相对优点。你的应用程序越大,屁股越痛苦,必须手动运行多个场景和边缘情况,以确保没有在你的应用程序已破坏。最终,您将在每次更改后停止测试整个应用程序,并开始“现场测试”您认为应受影响的区域。不可避免的是,你会发现几个月以前曾经工作过的东西现在已经彻底破碎了,而且当它破裂或者哪些变化破坏了你时,你已经不确定了。在那之后发生了足够多次......你会重视自动化测试......: - )
答案 3 :(得分:1)
我还没有真正使用Rails,但我认为这些自动化测试在烟雾测试中非常有用,可以确保您刚才所做的事情不会破坏您上周所做的事情。随着项目的发展,这将变得越来越重要。
此外,在编写代码之前编写测试(使用Test-Driven-Development模型)将帮助您更好,更快地编写代码,因为测试会强制您完全考虑问题。它还可以帮助您了解将复杂方法分解为可以单独测试的较小方法的位置。
你是对的,编写和维护测试需要花费很多时间。有时候比代码本身更多的时间。但是,由于上述原因,它可以节省您修复和重构错误的时间。
答案 4 :(得分:1)
例如: 我在25000+项目上工作(是的,在rails 1.2中),上周一我告诉我,如果他们将“leave_date”属性设置为过去,我可以让除了管理员之外的每个列表中的用户消失。
您可以重写每个列表操作(50+)以放置
@ users.reject {|!U | Date.today> u.leave_date}
或者你可以覆盖“查找”方法(DRY ;-),但只有你有测试(在找到用户的所有东西上!)你才会知道你没有通过覆盖User#find !!来破坏任何东西。 p>
答案 5 :(得分:1)
我读过的所有内容都只显示了测试验证。轨道中的验证不应该起作用吗?看起来更像测试框架而不是测试代码。你为什么需要测试验证?
有一个很好的Railscast显示test controllers的一种方式。