`

Rails 集成测试写法的变化过程 Rails测试方法合集

阅读更多
http://giantrobots.thoughtbot.com逛的时候看到的,小夜觉得有些东西还是能说明问题的,就抄回来了。
Productivity and happiness.这是Ruby和Rails升起的原因,也是integration testing能够持续变化的原因。当然,原文作者客气的说,这只是个人理解并没有科学证据。

2006

使用如下方法
引用
get, post, follow_redirect!, xml_http_request, status, path, and open_session
通过assert_equal来验证。通常写法如下:

class ExampleTest < ActionController::IntegrationTest
  def test_login
    get "/login"
    assert_equal 200, status

    post "/login",
      :username => people(:jamis).username,
      :password => people(:jamis).password
    follow_redirect!

    assert_equal 200, status
    assert_equal "/home", path
  end
end


2007

RSpec引入所谓行为驱动,就是故事模式如下:

Scenario "Root user" do
  Given "a user named", "admin"
  And "a company named", "Company1"
  And "a company named", "Company2"

  And "the user has the role", "root" do |role|
    @user.update_attribute :role, role
  end
  And "logged in as", "admin"

  When "visiting", "/"

  Then "viewer should see", "main/root_home"
  And  "page should show company named", "Company1" do |name|
    response.should have_text(/#{name}/)
  end
  And  "page should show company named", "Company2"
end


Webrat在这个时候模拟浏览器行为用于测试网页。 DSL通过
引用
click_link, fill_in, and click_button


Webrat可以和 配合使用Nokogiri测试网页,使用XPath 和 CSS selectors来验证HTML的返回。
通常这样写:

def test_sign_up
  visits "/"
  clicks_link "Sign up"
  fills_in "Email", :with => "good@example.com"
  select "Free account"
  clicks_button "Register"
  ...
end


2008


Merb推荐使用request方法。而这也比dispatch_to更容易。通常会用到
引用
be_successful and redirect_to


这时Cucumber取代讲故事的Story Runner模式。如下:
Feature: Addition
  In order to avoid silly mistakes
  As a math idiot 
  I want to be told the sum of two numbers

  Scenario: Add two numbers
    Given I have entered 2 into the calculator
    And I have entered 2 into the calculator
    When I press add
    Then the result should be 4 on the screen


Given /^I signed up with "(.*)\/(.*)"$/ do |email, password|
  user = Factory :user,
    :email                 => email,
    :password              => password,
    :password_confirmation => password
end 

2009

Integration testing 成为主流

Rack::Test通过给测试框架提供一个公用的接口来和Rack应用交互。

引用
Rack::Test pays homage to the frameworks before it, using methods that match the HTTP verbs: get, post, put, and delete, head) and adding request (Merb) and follow_redirect! (Rails). It also handles HTTP authentication and stores requests and responses in last_request and last_response.


示例如下:

class HelloWorldTest < Test::Unit::TestCase
  include Rack::Test::Methods

  def app
    [color=red]Sinatra[/color]::Application
  end

  def test_it_says_hello_world
    get '/'
    assert last_response.ok?
    assert_equal 'Hello World', last_response.body
  end

  def test_it_says_hello_to_a_person
    get '/', :name => 'Simon'
    assert last_response.body.include?('Simon')
  end
end


Cucumber and Webrat 也得到发展


Feature "A Tomatoist does a pomodoro" do
  Story <<-eos
  In order to perform a focused unit of work
  As a Tomatoist
  I want to start a pomodoro
  eos

  Scenario "Starting a pomodoro" do
    When "I go to the home page" do
      executes { visit '/' }

      Then "I should be sent to a new session" do
        current_url.should =~ /\/\w{3,}/
      end

      And "I should see an unstarted timer" do
        response.should have_tag('#timer .countdown_row','00:00')
      end

      When "I click the pomodoro button" do
        executes do
          @session_url = current_url
          click_button 'Pomodoro'
        end

        Then "I should be on my session's page" do
          current_url.should == @session_url
        end

        And "my timer history should show the current pomdoro" do
          response.should have_tag('#history ul li', /Pomodoro/, 1)
        end
      end
    end
  end
end


Coulda同样使用定义语言通过Webrat或者其他库来模拟浏览器行为如下:
Feature "Painfully obvious" do
  in_order_to "demonstrate a simple test"
  as_a "coulda developer"
  i_want_to "provide a straight-forward scenario"

  Scenario "Describing something obvious" do
    Given "something without a value" do
      @no_value = nil
    end

    When "I give it a value" do
      @no_value = true
    end

    Then "it should have a value" do
      assert(@no_value)
    end
  end
end

Given同样
class StackBehavior < Given::TestCase
  Invariant { expect(@stack.depth) >= 0 }
  Invariant { expect(@stack.empty?) == (@stack.depth == 0) }

  def empty_stack
    @stack = Stack.new
  end

  Given(:empty_stack) do
    Then { expect(@stack.depth) == 0 }

    When { @stack.push(:an_item) }
    Then { expect(@stack.depth) == 1 }
    Then { expect(@stack.top) == :an_item }

    When { @stack.pop }
    FailsWith(Stack::UsageError)
    Then { expect(exception.message) =~ /empty/ }
  end
end


引用
I write about 50 lines of horrible hacks. It brings the Given/When/Then DSL to Test::Unit. It relies on Webrat and Rack::Test to simulate the browser and theoretically work for all Rack apps (only tested on Sinatra). I keep the nesting totally flat, as is my style. It looks like this:

Feature 'Shorten URL' do
  Given 'I am on the homepage' do
    visit '/'
  end

  When 'I submit http://example.com' do
    fill_in      'url', :with => 'http://example.com'
    click_button 'shorten'
  end

  Then 'I should see a short link' do
    assert_have_selector 'a#short'
  end

  When 'I follow the short link' do
    click_link 'short'
  end

  Then 'I should be on http://example.com' do
    assert_equal 'http://example.com', current_url
  end
end


原文还有一些解释,没太注意,然而,从这样一个Rails的测试进化过程,还是能够看到一些东西。
0
0
分享到:
评论

相关推荐

    Ruby-APITaster一种快速而简单的方法来可视化测试你的Rails应用API

    这款工具的出现,极大地简化了API测试过程,提高了开发效率,尤其在进行RESTful API开发时,它的价值更为凸显。 首先,让我们深入了解Rails应用API。Rails是Ruby on Rails的简称,是一个开源的Web应用程序框架,...

    使用RSpec 测试Rails 程序.pdf

    将RSpec与Rails相结合可以有效地进行单元测试、集成测试以及端到端测试,从而确保应用程序的质量。 ##### 为什么使用RSpec? - **可读性高**:RSpec提供了清晰易懂的DSL(领域特定语言),使得测试代码更容易理解...

    深入解析Rails测试策略:单元测试与功能测试的区别

    在软件开发中,测试是确保...通过本文的探讨,我们了解到了Rails中单元测试和功能测试的区别,以及如何利用Rails的测试工具来编写高质量的测试代码。掌握这些知识,将有助于开发者在Rails项目中实施有效的测试策略。

    combustion, 简单,优雅的Rails 引擎测试.zip

    combustion, 简单,优雅的Rails 引擎测试 燃烧in是一个以简单有效的方式测试 Rails 引擎的库,而不是在规范或者测试文件夹中创建完整的Rails 应用。它允许你在引擎的上下文中编写你的规格,只使用你需要的Rails 应用...

    Ruby on Rails Guides_ A Guide to Testing Rails Applications.pdf

    该指南不仅覆盖了Rails内置的测试机制,还帮助读者理解Rails测试术语,撰写单元、功能和集成测试,并介绍了流行的测试方法和插件。它假设读者对Rails的基本操作方式有初步了解,但并不教如何编写一个Rails应用,而是...

    Rails项目源代码

    Rails鼓励TDD(测试驱动开发),包括单元测试、集成测试和功能测试。RSpec、Capybara等库可以帮助编写和运行这些测试,确保代码质量。 这个Rails项目提供了学习和研究Web开发的机会,特别是对于Ruby on Rails新手...

    Rails 集成Open Flash Charts

    标题 "Rails 集成Open Flash Charts" 涉及的是在Ruby on Rails框架中集成Open Flash Chart这一图表库的技术细节。Open Flash Chart是一个开源的Flash图表生成器,它允许开发者通过简单的API创建各种复杂的图表,包括...

    RSepc rails 测试框架介绍

    RSepc 是一款基于 Ruby 的行为驱动开发(BDD)测试框架,它被广泛应用于 Rails 应用程序的测试。RSpec 提供了一种清晰且简洁的方式来编写可读性强的测试代码,使得测试用例更像是对软件行为的规范描述,而不是简单的...

    rails2-sample

    这一章节将教授如何使用Rails的测试框架进行单元测试、集成测试和功能测试。同时,也会介绍如何对应用进行基准测试,评估其性能表现。 #### 12. Deployment and Production Use(部署和生产使用) 最后,本书将...

    关于rails 3.1 cucumber-rails 1.2.0

    Cucumber-Rails集成了Cucumber与Rails,使得开发者能够在Rails环境中方便地使用Cucumber进行功能测试。 在 Rails 应用中使用 Cucumber-Rails,开发者可以创建一个名为`features`的目录,里面包含这些Gherkin特性...

    rails指南 中文版

    7. **Testing**:Rails强调测试驱动开发,内置了RSpec、Minitest等测试框架,支持单元测试、集成测试和功能测试,确保代码质量。 8. **Asset Pipeline**:Rails的资产管道处理JavaScript、CSS和图像等静态资源,...

    adminlte-rails, AdminLTE Rails gem 将AdminLTE主题与 Rails 资产管道集成.zip

    adminlte-rails, AdminLTE Rails gem 将AdminLTE主题与 Rails 资产管道集成 AdminLTE Rails gem AdminLTE 是后端的高级 Bootstrap 主题。英镑 AdminLTE Rails gem 与 Rails 资产管道集成了英镑AdminLTE主题。安装将...

    Rails 101 入门电子书

    - 测试安装: 创建一个简单的Rails应用来验证是否成功安装。 #### 五、练习作业0-Hello World - **目标**: - 学习如何创建第一个Rails应用程序。 - **过程**: - 创建新项目。 - 设置数据库配置。 - 创建控制器...

    minitest-rails, Rails的Minitest集成.zip

    minitest-rails, Rails的Minitest集成 minitestRails 5的Minitest集成 安装gem install minitest-rails这将安装以下宝石:minitest配置创建一个新的Rail

    Rails 4 Test Prescriptions

    通过深入分析不同测试方法(如单元测试、集成测试等)之间的优缺点,帮助读者理解何时以及为何应选择特定类型的测试。 2. **Mocking与Stubbing详解**:对于新接触测试驱动开发(TDD)的开发者来说,本书对Mocking和...

    component base rails applications

    - 本书就是通过LeanPub出版过程发布的,体现了作者和出版者利用这种方法快速适应市场变化的能力。 9. 相关作品和本书结构: - 提到了与本书相关的其他作品,这些作品可能是对本书主题的扩展或者有更深的探讨。 -...

    Rails 4 Test Prescriptions.pdf

    - **自动化测试**:利用工具如 RSpec 和 Capybara 自动化测试过程,不仅可以节省时间,还可以减少人为错误。 #### Rails 4 特定的测试技术和工具 - **RSpec**:RSpec 是一个行为驱动开发(BDD)框架,广泛应用于 ...

    好用的rails 2.0 Api 文档

    Rails强调测试驱动开发,内置了Test::Unit和RSpec两种测试框架,便于编写单元测试、集成测试和功能测试,确保代码的质量和稳定性。 **10. 国际化(i18n)** Rails 2.0提供i18n模块,支持多语言应用。通过配置文件,...

    railsAPI

    Rails集成了测试框架如RSpec和MiniTest,允许开发者编写单元测试、集成测试和功能测试,确保代码的稳定性和可靠性。 安全方面,Rails提供了许多安全特性,如CSRF(跨站请求伪造)防护、XSS(跨站脚本)防御、以及...

    使用Aptana+Rails开发Rails Web应用(中文)

    为了运行和测试应用,你需要在命令行中使用Rails服务器。在Aptana中,可以使用内置的终端工具。打开“Terminal”视图,输入`rails server`启动服务器,然后在浏览器中访问`http://localhost:3000`查看你的应用。 在...

Global site tag (gtag.js) - Google Analytics