Unit :: Test与Rspec之间的区别

时间:2015-11-29 12:13:17

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

我对Test::UnitRspec感兴趣。

有人可以解释一下两者之间的主要区别 - 就其运作原则而言。

1 个答案:

答案 0 :(得分:18)

测试::单元更类似于像JUnit这样的经典TDD工具。测试是作为类编写的(因为这是在Java / C ++中完成的)。

测试::单位更习惯那些习惯于经典测试工具的人。

Test::Unit是内置的Ruby测试库,但被认为是死的(开发已经停止)。它已被Minitest取代。

require_relative "simple_number"
require "test/unit"

class TestSimpleNumber < Test::Unit::TestCase
  def test_add
    assert_equal(4, SimpleNumber.new(2).add(2) )
  end
  def test_multiply
    assert_equal(6, SimpleNumber.new(2).multiply(3) )
  end
end

RSpec 是一种特定于域的语言,它使用ruby语言的灵活性来创建“更具可读性”的测试。

早期版本的RSpec对此有点太过分了,并且monkeypatched核心Ruby类。

RSpec更倾向于行为驱动开发的理念,您可以在其中描述应用程序与TDD中组件的行为,您可以将应用程序切割为最小的组件。

require "spec_helper"
require "lib/simple_number"

describe SimpleNumber do 
  describe "#add" do
    it "adds a value to the sum" do
      expect(SimpleNumber.new(2).add(2)).to eq(4)
    end 
  end
  describe "#multiply" do
    it "multiplies with the value" do
      expect(SimpleNumber.new(2).multiply(3)).to eq(6)
    end 
  end
end

哪个更好?

这是一个意见问题。

Minitest最近有一点复苏,因为它被认为更快更简单。然而,测试可能非常简洁,真正减慢套件的是集成测试和数据库IO。

不幸的是,许多新的转换器编写测试会导致任何Java开发人员在每个测试用例中使用许多断言来畏缩which read like long ramblings

编写良好的RSpec测试套件(或规范套件)更易读,易于导航。当规范失败时,很容易将它与应用程序中实际出错的东西联系起来。当然,有许多套房恰恰相反。

Minitest非常灵活,甚至可以与spec样式语法一起使用。它非常稀疏,不包括丰富的断言库和像RSpec这样的模拟库。虽然您可以插入任何东西,但仍需要让所有可移动部件一起工作。

RSpec拥有更好的测试运行器和出色的文档。