我已经为我的Ruby代码编写了一段时间的测试,但作为一个前端开发人员,我显然有兴趣将它带入我为前端代码编写的代码中。我一直在玩很多不同的选择:
人们用于测试的是什么?还有人们测试的是什么?只是JavaScript?链接?形式?硬编码内容?
任何想法都会非常感激。
答案 0 :(得分:82)
几个月前我遇到了同样的问题,在与许多开发人员交谈并做了大量研究之后,这就是我发现的。您应该对JavaScript进行单元测试,编写一小组UI集成测试并避免使用记录和回放测试工具。让我更详细地解释一下。
首先,考虑一下test pyramid。这是Mike Cohn创建的一个有趣的类比,它将帮助您决定应该进行哪种测试。在金字塔的底部是单元测试,它们是坚固的并提供快速反馈。这些应该是您的测试策略的基础,因此占据金字塔的最大部分。在顶部,您有UI测试。这些是直接与您的UI交互的测试,例如Selenium。虽然这些测试可能会帮助您找到错误,但它们更昂贵且反馈速度非常慢。此外,根据您使用的工具,它们会变得非常脆弱,您最终会花费更多时间来维护这些测试,而不是编写实际的生产代码。中间的服务层包括不需要UI的集成测试。例如,在Rails中,您将直接测试REST接口,而不是与DOM元素进行交互。
现在,回到你的问题。我发现我可以大大减少我的项目中的错误数量,这是一个使用大量JavaScript编写的Spring Roo(Java)Web应用程序,只需为JS编写足够的单元测试。在我的应用程序中,有很多用JS编写的逻辑,这就是我在这里测试的那种东西。我不关心页面的实际外观或动画是否按照应有的方式播放。我测试我在JS中编写的模块是否会执行预期的逻辑,如果元素类被正确分配并且错误条件得到妥善处理。对于这些测试,我一直在使用Jasmine。这是一个很棒的工具。它非常容易学习并具有很好的模拟功能,称为间谍。如果您使用jQuery,Jasmine-jQuery会添加更多功能。特别是,它允许您指定夹具,它们是HTML代码的片段,因此您不必手动模拟DOM。我已将此工具与maven集成,这些测试是我的CI策略的一部分。
你必须小心UI测试,特别是如果你依赖像Selenium这样的记录/回放工具。由于UI经常变化,这些测试会不断发生,您将花费大量时间查明测试是否真的失败或者它们是否刚刚过时。此外,它们不会增加单元测试的价值。由于他们需要一个集成的环境来运行,所以你最常喜欢在完成开发之后运行它们,而修复事物的成本更高。
然而,对于烟雾/回归测试,UI测试非常有用。如果你需要自动化这些,那么你应该注意一些危险。 编写测试,不记录。记录的测试通常依赖于自动生成的xpath,这些xpath会因您对代码所做的每一点改动而中断。我相信Cucumber是编写这些测试的好框架,您可以将它与WebDriver一起使用来自动化浏览器交互。 代码考虑测试。在UI测试中,您必须使元素更容易找到,因此您不必依赖复杂的xpath。添加class和id元素通常不会频繁出现。 不要为每个小角落案例编写测试。这些测试编写成本高,运行时间太长。您应该专注于探索大部分功能的案例。如果你在这个级别编写太多测试,你可能会测试你之前在单元测试中测试的相同功能(假设你已经编写过)。
在我目前的项目中,我使用Spock和Geb编写UI测试。我发现这些工具很棒。它们是用Groovy编写的,它更适合我的Java项目。
答案 1 :(得分:4)
有很多选项和工具可供选择。但他们的选择取决于您是否拥有网络用户界面或桌面应用程序?
假设您提到的工具是Web UI。我建议Selenium(又名WebDriver):http://seleniumhq.org/docs/
它支持多种语言(Ruby在列表中)。它可以在各种浏览器上运行,广告使用很多教程和提示非常容易。 哦,当然它是免费的:)
答案 2 :(得分:2)
虽然这篇文章得到了很多喜欢,但我会回答我的问题,因为我现在写了很多测试,现在测试前端的方法已经发生了很多变化。
因此,在FE测试方面,我花费了大量时间将karma与Jasmine一起使用,尽管karma可以很好地与其他测试套件一起使用,例如mocha& qunit。虽然这些很棒,但是karma允许您直接与浏览器连接以运行测试。缺点是随着你的测试套件变大,它会变得很慢。
所以最近我已经转移到Jest,速度要快得多,如果你的写作反应应用,使用enzyme进行快照测试可以给你带来非常好的报道。谈到报道Jest已经内置伊斯坦布尔报道,并且设置和模拟非常简单易用。它的缺点是它没有在浏览器中测试,它使用了一个名为jsdom的东西,速度很快,但确实有一些麻烦。我个人认为这不是什么大问题,特别是当我通过webpack / babel编译我的代码时,这意味着跨浏览器的错误相当少,所以如果你手动测试通常不是问题(并且你应该这样做) )。
就在rails堆栈中工作而言,现在webpacker gem现在可用并且使用npm和节点通常更加简单。我建议使用nvm来管理您的节点版本
虽然这不是严格测试,但我还建议使用linting,因为这也会在代码中引发很多问题。对于JS我使用eslint和prettier以及scss / css我使用stylelint
就测试内容而言,我认为卡洛斯谈论测试金字塔仍然是相关的,毕竟理论没有改变,只是工具。我还会增加对测试的实用性,我会一直测试,但是到什么级别和覆盖范围将取决于项目。管理您的时间并花费数小时/天测试短生命周期项目非常重要。更大/更长期的项目更大的测试套件的好处显然更大。
无论如何,我希望能帮助那些关注这个问题的人。