Rails测试期间发生了什么?

时间:2011-08-30 08:48:50

标签: ruby-on-rails ruby unit-testing testing

我是Ruby On Rails的新手。我喜欢它,它内置了测试功能。但是,我不能用测试来包裹我的脑袋。这是我关于它的第一个基本问题。

测试期间会发生什么?

我理解开发,我们想要一些结果,我们使用我们拥有的数据或从用户那里获得它以实现我们想要的最终结果。但是,测试的概念似乎有时让我感到困惑。我已经在浏览器中测试了一段时间的应用程序,我们是否用代码复制相同的内容?这是测试的内容吗?使用自动代码复制浏览器测试?在这里启发我。

3 个答案:

答案 0 :(得分:4)

阅读A Guide to Testing Rails Applications将是一个很好的起点。

基本上,您有三种测试:单元功能集成

单元测试正在测试您的模型。在这些测试中,您检查模型的单个方法是否按预期工作,例如,您设置了一个带空格的登录,然后测试是否删除了空格:

class UserTest < ActiveSupport::TestCase
  def test_login_cleaning
    u = User.new
    u.login = "  login_with_spaces  "
    assert_equal "login_with_spaces", u.login
  end
  # ... and other tests
end

功能测试正在测试您的控制器(和视图)。在每个测试中,您使用给定的参数集模拟一个发送到一个控制器的请求,然后确保控制器返回正确的响应。

但请注意,在此测试中,您无法测试页面的呈现,因此严格来说模拟浏览器。要测试您的页面是否看起来很好,您需要手动执行(我几乎可以肯定某些技术存在,但我不知道它们)

功能测试的一个例子:

class UserControllerTest < ActionController::TestCase
  def test_show_renders_admin
    get :show, :id => 1
    assert_response :success
    assert_select "div.user" do
      assert_select "span.name", "Joe Admin"
    end
  end
  def test_show_handles_unknown_id
    get :show, :id => 9999
    assert_response 404
    assert_select "p.warning", "No such user"
  end
end

集成测试正在测试一系列请求 - 类似于场景,用户登录,获取“创建用户”页面,创建用户等等。这些测试检查单个请求(在功能测试中测试)是否能够一起工作。


我看到Simone已经指出了自动化在测试中的重要性,因此指向指南的链接是我答案中唯一的值; - )

您可能会发现应用Test Driven Development的某些规则非常有帮助,尤其是当您的项目成熟时。

我知道通过编写测试启动项目并不容易,因为通常你还不知道一切都会如何工作,但后来当你发现错误时,我强烈建议< strong>从编写失败的测试用例开始修复每个错误。它确实对错误修复阶段和后来确实有帮助 - 确保错误不再出现。


好吧,我注意到我没有直接回答你的问题; - )

当你开始测试程序时,Rails:

  • 删除测试数据库(因此请确保此处没有任何有价值的数据),
  • 使用开发数据库的结构重新创建它(因此,请确保您已经运行了所有迁移),
  • 加载所有灯具(来自test/fixtures/*
  • test/units/*和其他目录
  • 加载所有测试类
  • 调用名称以“test_”开头或由宏test "should something.."创建的每个方法(按字母顺序排列,但您可以认为该顺序是随机的)
  • 在每次调用之前执行一个特殊的setup过程,并在每次调用后执行teardown过程,
  • 在每次调用之前(取决于配置)重新创建数据库数据,再次加载灯具。

您可以在指南中找到更多信息。

答案 1 :(得分:3)

测试期间发生的事情是,您确实运行了一组专门的程序或例程(测试代码),这些程序或例程调用应用程序中的例程(测试中的代码)并验证它们是否产生了预期的结果。测试框架通常有一些机制来确保每个测试例程独立于其他测试。换句话说,一次测试的结果不会影响其他测试的结果。

在Rails中,您可以使用rake test命令行工具运行测试。这将以随机顺序加载和执行每个测试例程,并告诉您每个测试是否成功。

答案 2 :(得分:2)

这个答案不一定适用于Rails本身。当你谈论在Rails中进行测试时,通常意味着自动测试。

自动这个词是意义的本质。这实际上是单元测试和“浏览器”测试之间的最大区别。

通过单元测试,您基本上编写了一个代码,一个例程,它强调代码的特定部分,以确保它按预期工作。与“浏览器”测试相比,单元测试的主要优点是:

  1. 它是自动的,可以通过编程方式运行。
  2. 您的测试套件在开发生命周期中会增加。
  3. 您降低了回归错误的风险,因为当您修改一段代码并运行测试套件时,您实际上正在运行所有测试,而不仅仅是随机检查。
  4. 这是一个基本的,非常简单的例子。拿一个模型,比方说用户模型。您拥有以下属性:first_namelast_name。您希望名为name的方法返回名字和姓氏(如果存在)。

    这是方法

    class User
      def name
        [first_name, last_name].reject(&:blank?).join(" ")
      end
    end
    

    这是相应的单元测试。

    require 'test_helper'
    
    class UserTest < ActiveSupport::TestCase
      def test_name
        assert_equal "John Doe", User.new(:first_name => "John", :last_name => "Doe").name
        assert_equal "John", User.new(:first_name => "John").name
        assert_equal "Doe", User.new(:last_name => "Doe").name
        assert_equal "", User.new().name
      end
    end