重构测试/规范是个好主意吗?

时间:2010-12-08 12:33:35

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

当我在每个控制器中看到我的测试代码规格时这样:

it "#new displays input controls for topic title and keywords" do

  ensure_im_signed_in
  get :new

  assert_response :success
  assert_select "input#topic_title"
  assert_select "input#topic_keywords_input"
  assert assigns :topic
end

我想重构它并替换为像这样的单线:

its_new_action_displays_input_form :topic, %w(input#topic_title input#topic_keywords_input)

和实施:

def its_new_Action_displays_input_form field, inputs
  it "#new displays input controls for #{inputs.join ", "}" do
    ensure_im_signed_in
    get :new
    assert_response :success
    for css in inputs
      assert_select css
    end
    assert assigns field
  end
end

保持详细版本或重构为terser版本有什么好处?

我发现只有重构版本的问题是RSpec没有显示失败测试的回溯。

5 个答案:

答案 0 :(得分:2)

我们经常提出的最大问题是“谁在测试测试?”无论你身在何处,无论在哪个阶段你都应该重构你的单元测试,因为它有助于降低复杂性。降低单元测试中的复杂性将产生与降低代码库中的复杂性相同的好处。我可以看到没有理由不这样做,并且有很多理由去做。

答案 1 :(得分:1)

您可能会发现此视频很有趣。在这段视频中,Gerard Meszaros讨论了重构单元测试,并讨论了这样做的原因。

http://www.youtube.com/watch?v=Pq6LHFM4JvE

Gerard Meszaros是“xUnit测试模式 - 重构测试代码”的作者

答案 2 :(得分:1)

我大学毕业后的第一份工作是更新一套单元测试。他们大约7岁,使用了许多弃用的方法。我花了八个月(他们中有很多人!)我仍然没有完成这项工作。但是,我确实设法将文件大小减小到原始大小的1/3,并通过重构大部分内容大大简化了工作,这有助于加快工作速度。

所以,我肯定会鼓励重构!

答案 3 :(得分:1)

您重构规范是因为您重构其他所有内容的原因相同:它将使您的应用程序 - 无论是生产应用程序还是测试套装 - 运行得更快。

此外,重构一段代码会让你想到你必须编写这样的东西的意图。这可以增加您对问题的理解,并使您更有能力在同一个应用程序中解决其他问题。

但我强烈反对你的重构。你看,当你正在观看一个规范时,你想快速看清楚你在测试什么。如果你把断言移到其他地方,你就是在打自己,因为你需要去找你把它放在哪里。

我建议你永远不要将断言移出你的规范。即使他们被重复。没关系。它表达了意图,所以你永远不会忘记你想要测试的内容。

相反,将重构重点放在锅炉代码上。

例如,您正在测试表单并转到该页面,您需要单击许多链接。第一种方法是将所有内容都放在规范中。很多click_link。

我重构这样的代码将把整串click_link放到before(:each)之后。使用上下文也可以澄清。

像这样:

feature "Course" do
  context "Loged in" do
    before(:each) do
      school = School.make!
      switch_to_subdomain(school)
    end

    context "In the new course form" do
      before(:each) do
        click_link("Asignaturas")
        click_link("Nueva asignatura")
      end

      scenario "New course" do               
        fill_in(:name, :with => "Matematicas")
        click_button("Create Course")
        page.has_content?("Asignatura creada").should == true
        dbSchool = School.find(school.id)         
        dbSchool.courses.count.should == 1
      end
          scenario "New course" do               
        fill_in(:name, :with => "")
        click_button("Create Course")
        page.has_content?("Asignatura creada").should == false
        dbSchool = School.find(school.id)         
        dbSchool.courses.count.should == 0
      end


    end
  end  
end
你知道吗?锅炉代码超出了特定规格。但是请在规范上留出足够的内容,以便在7个月之后就可以了解您正在测试的内容。永远不要带走断言。

所以我的回答:Refactor Spec不仅是一个好主意,而且是必需品。但是不要将重构与隐藏代码混合在一起。

答案 4 :(得分:0)

您确实应该重构测试以删除重复。但是,有可能采取措施保持故障回溯。

不是将所有东西都拉到一个方法,你可能会有一个共享 before(:each)部分用于常见设置,并编写自己的匹配器和/或断言以组合检查。