16

我已经为此搜索了一下,并试图实现一个自制的解决方案,但到目前为止还没有发现对它有信心。Ruby on Rails中的JavaScript集成测试

我需要的是在Ruby on Rails中编写集成测试,这些测试与JavaScript进行交互并获取程序化方式来声明某些行为。我使用Test :: Unit作为控制器/模型的一部分,但我正在努力测试我的应用使用的一些jQuery/JavaScript行为。主要包括UI中的ajax调用和交互,它更新一些信息。

我还没有找到一个解决方案,它让我充满信心,它很好地集成了自动测试和整个红绿色的过程,所以现在我的客户端代码的大部分都没有经过测试,这让我很紧张(因为它应该是:P)。

那么,有没有人有关于这个问题的最佳实践的建议? Crockford指出,单元测试JS有点棘手,因为它很大程度上依赖于用户界面的当前状态等等,而且作为AFAIK,即使他还没有找到实现像样测试的好方法......

很快:我需要为取决于Ajax的一些UI行为实施测试,与自动测试或其他CI工具集成,并没有找到一个好的和优雅的方式来做到这一点。

感谢所有关注, 问候

回答

3

2011年4月,为思考的人士updated their quest进行了javascript测试。 Akephalos已经失宠,原因如下:

错误:如前面提到的,有虫子在的HtmlUnit, 特别是与jQuery的生活。尽管所有浏览器实现 都存在缺陷,但如果测试遇到与实际浏览器相同的缺陷,则更为有用。

兼容性:htmlunit没有完全实现 现代浏览器所做的功能集。例如,它不完全处理DOM范围或 Ajax文件上载。

渲染:htmlunit实际上并不渲染页面,所以测试 依赖于CSS可见性或定位将不起作用。

性能:当您的大多数测试使用Javascript时,测试套件将以 htmlunit开始抓取。需要一段时间才能开始与Akephalos的测试,并且一个大型测试套件可以轻松地进行10到15分钟。

因此,他们推出了自己的解决方案,这是开源的 - capybara-webkit。这还是相当新的,但它看起来像现在走的路。

4

据我所知,中Capybara组合之外与Selenium Web-Driver有对的JS代码自动化测试的选项非常少。 我用水豚和selenium网络驱动程序使用黄瓜,并且因为selenium-webdriver实际上启动了firefox或chrome来通过使用ajax调用来测试特定页面,所以运行一组测试需要花费更长的时间。

有一些替代品,但他们不工作,无论是所有的时间或每个情况。 例如:Capybara with envjs

+0

感谢您的链接到水豚envjs!这可以在Rails世界之外使用吗(例如在任何旧的Web应用程序上)? – 2011-01-30 21:16:56

2

这个article推荐Akephalos

+0

这就是我一直在寻找的,将水豚和一个无GUI的HTML单元/ JS解释器结合在一起,谢谢! – victorcampos 2011-02-07 02:08:56

2

我已经用硒和黄瓜和水豚。这非常令人沮丧,因为硒似乎无法看到动态生成的JavaScript,尽管水豚应该等待它。那是在2011年1月。事情现在可能会有所不同。

目前,我正在使用黄瓜和水豚与akephalos。到目前为止,这很困难,因为它是无头的,所以你看不到进展。水豚的“save_and_open”电话在一定程度上有所帮助。 2. jQuery和akephalos似乎并没有很好地一起玩。例如,使用jquery的.change()在单选按钮上触发可以在chrome中正常工作,但不会在akephalos中工作。也许这是故意的,因为后来我听说它在IE中不起作用。我通过使用.click()代替单选按钮的.change()来解决问题,但是由于.change函数被设置为运行一堆问题,我必须专门编写代码才能使其适用于测试。

对我来说,底线是在rails env中进行自动化JavaScript验收测试还不成熟,可能还有更多工作值得。