我对Test::Unit
和Rspec
感兴趣。
有人可以解释一下两者之间的主要区别 - 就其运作原则而言。
答案 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拥有更好的测试运行器和出色的文档。