在规范中使用描述/它优于功能/场景的优势? (除了语法糖)

Posted

技术标签:

【中文标题】在规范中使用描述/它优于功能/场景的优势? (除了语法糖)【英文标题】:Advantage to using describe/it over feature/scenario in specs? (besides syntactic sugar) 【发布时间】:2015-01-02 14:35:07 【问题描述】:

Ruby 1.9.3、Rails 3.1.10、RSpec 2.13.0、Capybara 2.2.1

我正在为 Rails 3 应用程序编写测试——一个供客户(和管理员)配置各种电话设置的 GUI。我已经写了 6 个左右的规范文件,之前写过很多其他的(我用作模板)。以下是规范文件的快照。

# spec/features/admin/administrators_spec.rb
require 'spec_helper'
include AdministratorHelper
include Helpers
feature "Exercise Administrators page"
  include_context "shared admin context"
  background do
    visit administrators_path
  end
  scenario "show index page" do
    title.should == "Administrators"
  end
  # ... other happy path tests
  # SAD PATH TESTS #
  scenario "validation: delete no administrators", js:true do
    click_button "Delete"
    page.driver.accept_js_confirms!
    error_message("Error: You did not select any administrators for deletion.")
  end
end

据我了解,feature/scenario 是 Capybara 独有的......和验收测试。其他合作者表示,我们的“验收测试”会测试所有内容——数据库是否保存条目、视图是否正确呈现等。每个规范都与 GUI 中的页面相关联,而不是模型/控制器。

他让我参加了 edX (CS169.1x) 的课程,他们以不同的方式教授测试——每个模型和控制器都有单独的规范文件。他们还使用describe/context/it 方法编写测试。

    describe/itfeature/scenario 编写测试有什么优势吗? (除了语法糖) 通过使用 Capybara 的feature/scenario,它会减慢测试套件的速度吗? (与使用 RSpec 的关键字相比) 我正在编写的测试到底是什么(如代码块中所述)?验收、单位、组合? 像上面那样编写测试单独会实现更高的覆盖率吗? (我们的下一个目标是 >80%)

感谢您的所有帮助和澄清。

【问题讨论】:

这是一个经过深思熟虑的问题,但它有点宽泛,也受制于意见。测试类型的定义有点模糊。 我试图重新表述我的问题。我希望它不那么主观。我的理由是,也许由于 Capybara 是 RSpec 之上的库,因此处理时间会更长。 (不知道还要多长时间......我们目前在 15 分钟内有 535 个示例) 【参考方案1】:

我觉得这个问题有点笼统,但可以根据我自己的经验用一些建议和意见来回答。

    使用 describe/it 编写测试优于功能/场景有什么优势吗? (除了语法糖)

据我所知没有。但是,您可能会发现一些方便的测试框架功能在一种方案中比在另一种方案中更容易实现。

    通过使用 Capybara 的功能/场景,它会减慢测试套件的速度吗? (与使用 RSpec 的关键字相比)

仅使用关键字不会影响处理速度。你使用什么样的网络驱动和主机模拟会有更大的影响。

    我正在编写的测试到底是什么(如代码块中所述)?验收、单位、组合?

我称之为验收测试。但是,并不总是有明确的分界线,您需要了解测试将如何运行,以及它们将如何在您的开发过程中使用。

一个成熟的开发管道可能有两个或三个用于不同目的的独立测试套件,并且可能使用不同的测试框架实现。例如,您可能希望实现一组非常快速的测试(通常是单元测试)以作为新代码提交的快速自动化测试运行。

    单独编写上述测试能否实现更高的覆盖率? (我们的下一个目标是 >80%)

测试可以执行应用程序的任何用户可访问的功能,并且您自己执行的任何代码都可以被视为已覆盖。如果您没有很多实用程序脚本或其他用户无法访问的代码,您可能会获得高于 80% 的 C0 覆盖率(Ruby 覆盖率工具通常不会提供更深入的细节,例如 C1)。


我怀疑使用特定测试框架的关键字影响很小。但是,使用 Capybara 通过 Web 界面对应用程序进行验收测试将比运行单个模块的低级单元测试要慢得多。

测试速度可以变化几个数量级。对于围绕快速模块的紧凑单元测试,我可能希望每秒运行 100 个示例。在 Web 开发项目中,我通常在单元测试中每秒运行 10-20 个示例,但在验收测试中可能每秒运行 1 个示例(这大致是您在这里得到的大致目标)。当通过浏览器驱动程序在站点的托管副本上使用 Capybara 时,我可能希望在 10 秒内运行一个示例,因此一个包含 100 多个测试的套件必须仅针对关键路径测试运行,例如与发布候选版本。

【讨论】:

非常感谢!您的回答比我预期的要深入得多。我现在只在 Rails 上工作了 3 个月,所以一些概念对我来说仍然是新的。我相信其他合作者,因为我们确实测试了应用程序的所有方面......我问的主要原因是因为在研究 WebMock 期间,任何和所有 RSpec 测试都遵循 describe/it,这让我认为存在更大的差异。 ..再次感谢您

以上是关于在规范中使用描述/它优于功能/场景的优势? (除了语法糖)的主要内容,如果未能解决你的问题,请参考以下文章

在 flex 应用程序中使用 mxml 优于 actionscript 有啥优势?

使用 URLField 优于 TextField 的优势?

在 ASP.NET 中使用 Web API 优于 Web 方法的优势是啥

CFNetwork 在 iOS 和 MacOS 上优于 BSD 套接字和 GCD 的优势?

线程优于可运行的优势[重复]

C ++中std :: thread优于pthread的优势[重复]