黄瓜是否不需要编写单元测试?

时间:2009-09-19 15:56:42

标签: ruby-on-rails ruby testing

我对Ruby / ROR可用的测试框架数量感到有些困惑。

我最近看了Cucumber Railscasts并发现它们非常有趣。所以我开始玩游戏然后很难从概念上看到我会在哪里进行各种测试。

似乎很有可能在Cucumber中进行单元测试中可以完成的所有事情,所以我是否需要编写单元测试或者我应该编写我的功能定义并专注于提供尽可能好的覆盖范围使用它。

我应该使用Rspec或Test:Unit创建我的单元测试吗?当我测试Ajax功能时,我应该使用Selenium还是Watir?

这里似乎有很多选择我正在努力查看使用哪些工具以及边界的位置。

Cucumber的其他人的经历是什么?在写黄瓜整合测试和测试之间划清界线:基于单元和/或Rspec的单元和功能测试。有没有人意识到关于这个主题的好文章,建议在测试方法和各种工具的优点和缺点之间划清界线。

我理解其中一些是主观的,但欢迎如何解决这个问题的常用方法。

7 个答案:

答案 0 :(得分:20)

使用黄金级别来描述用户应该能够看到和做的事情。使用RSpec,Test:Unit,Shoulda等编写单元测试。直接从the horse's mouth

  

当您决定要添加新功能或修复错误时,请首先编写一个描述该功能应如何工作的新功能或方案。不要写任何代码(<)。

     

...

     

这是您开始编写代码的时候。首先编写几行代码来解决你从Cucumber那里得到的失败。再次运行黄瓜。重复并冲洗,直到您对您的功能感到满意为止。当您了解细节时,请下拉一个抽象级别并使用RSpec或任何Ruby测试框架为您的类编写一些规范/测试。

黄瓜是为了测试你的整个筹码,而不是'单位'。

你需要决定在哪里划线,但很多引擎盖下的东西可能不会被黄瓜测试所覆盖。请注意,在注册时,我会填写一份表单,其中包含我的姓名,电子邮件,电话号码等。单元测试可能会检查新的User是否也会创建新的TelephoneNumber。从用户的角度来看,他们并不真正关心它是否会创建一个新的TelephoneNumber,他们关心的是,一旦他们注册,他们就有了一个帐户,可以看到他们的电话号码。

我没有太多编写黄瓜测试的经验(还没有),但我希望这有点帮助。

答案 1 :(得分:6)

当单元测试失败时(我的意思是使用模拟单独测试方法的真实单元测试),它会告诉您“单元”有什么问题。当验收测试失败时,它会告诉您“功能”有什么问题,而不是问题所在。

答案 2 :(得分:3)

创建rails应用程序时,默认情况下会进行功能,交互和单元测试。黄瓜是一项额外的测试,它也是一种测试用户体验的方法。当他们点击标记为“go”的按钮时,他们应该看到“成功”呈现而不是404.这将确保您不会意外地弄乱用户体验,并且从上到下您的应用程序适用于最常见的你能想到的用例。其他测试旨在确保没有任何问题,并且您已经用显微镜检查过模型和方法。有可能用黄瓜完全复制单元测试,但这会很痛苦(并且执行起来很慢,特别是如果你使用硒)。编写测试的最佳时间是在开发代码时,最快速,最简单的方法是使用内置的rails测试,也许还有一些额外的帮助,比如shoulda,rspec,我也是工厂女孩的巨大粉丝。如果你还没有看过它www.railscasts.com有一个很好的介绍黄瓜,rspec和工厂女孩,...我知道这个问题已经得到解答(这是没有)但这是我的两分钱。祝你好运编码!!

答案 3 :(得分:3)

我一直在思考/挣扎这个问题,这就是我到达的地方。

黄瓜第一,黄瓜最后。黄瓜将提供主要的测试覆盖率。

应该使用rspec / unit测试开发/覆盖执行应用程序实际业务工作的核心模型方法。

为什么单位也要测试?

1)单元测试将更快地测试运行。 2)这个核心业务逻辑可能(可能)以超出当前视图(Cucumber测试通过)的几种方式使用。这些方法应该用所有类型的可能输入和输出敲击,直接在测试中调用方法。

为什么不对其他模型,控制器和视图进行单元测试?

1)黄瓜已经覆盖了一次。 2)我发现views-controller-some-model-methods一起工作以完成任务(认为所有操作都是为了登录);所以我喜欢一起测试它们。

答案 4 :(得分:2)

过去半年左右我一直在练习黄瓜/ RSpec做BDD。

首先,BDD并不容易进入,一开始会觉得不自然。

但是一旦你进入它,没有其他方法可以进行编程。

回答你的问题。要测试Javascript,您需要一个可由Cucumber使用的Capybara使用的javascript驱动程序。

capybara-webkit是所有酷孩子现在使用的东西

有一点需要注意。

集成测试很慢。

单元测试很快,但速度很慢,因此使用正确的数据库清理器并编写具有良好隔离性的良好测试非常重要。

我非常满意的测试设置:

加载spork的警卫 Spork可以加快测试速度 用于集成测试的黄瓜 用于javascript测试的capybara-webkit RSpec用于单元测试

我不做视图测试和控制器测试,因为在我看来这些是多余的,因为对XPATH的良好了解会让你编写卓越的测试,甚至覆盖你的页面布局和结构。

答案 5 :(得分:1)

我个人认为你不应该停止编写单元测试。作为验收测试工具,Cucumber应该替换您的功能测试,如果您编写,则查看测试。

Cucumber功能应该很简单,并且与给定功能的真实用户价值相关联。

答案 6 :(得分:0)

根据我的经验,Cucumber和Rspec有不同的吸引力。从开发人员的角度来看,Rspec对我很有吸引力,因为它易于编写,并在出现问题时提供非常快速的反馈。作为开发人员,Cucumber并不吸引我,因为它的运行速度不如Rspec。但是,Cucumber确实吸引我作为商业利益相关者,因为它提供了对整个功能的全面报道。

帮自己一个忙,继续写单元测试。