<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    使用RSpec編寫具有可讀性的功能測試

     Chris Zetter是FutureLearn產品組的一名開發者,他為我們講述了自己的小組為了使功能測試兼具可維護性與可讀性,在把Cucumber替換為RSpec之后是如何來編寫測試的。
      測試是建立與維護一個大型平臺不可或缺的一部分。每當我們為FutureLearn這個平臺增添新功能時,我們都會編寫自動化的功能測試來記錄這些新功能是如何運作的,并確保他們不運轉時我們也能知曉。
      令人愛恨交加的Cucumber
      Cucumber是一款用來編寫功能測試的常用工具,每當我們開啟項目時它都是我們的不二選擇。它可以讓我們以用戶的視角編寫出高層級的行為驅動測試。
    Feature: Enrolment
    Scenario: Enrolling in a course
    Given there is a course
    And I am logged in as a learner
    When I enrol on a course
    Then the course should appear in 'my courses'
      我們樂于使用Cucumber因為它可以使根據用戶故事編寫測試變得簡單易行,而且寫完的測試通俗易懂。然而使用Cucumber也有些許不足之處。首先,我們已經在項目里使用了RSpec,再引入Cucumber意味著又要多維護一個測試框架;其次,由于兩者的DSLs和測試運行器不同,在他們之間進行腦筋切換又會帶來額外開銷;最后,我們特別不喜歡Cucumber所使用的正則表達式,因為同Ruby的標準方法調用相比,它們使測試變得更加晦澀難懂。
      編寫更好的RSpec features
      那么,我么該如何在不失測試可讀性的前提下停用Cucumber呢?
      我們已經開始使用RSpec features來替代Cucumber,它們通常看起來會是這樣:
    feature 'Enrolment' do
    scenario 'Enrolling in a course' do
    course = FactoryGirl.create(:course)
    learner = FactoryGirl.create(:learner)
    login_as learner
    visit course_path(course)
    find('.join').click
    expect(page).to have_content('Thanks for joining!')
    visit '/'
    expect(page).to have_main_header('My Courses')
    expect(page).to have_content(course.full_title)
    end
    end
      它們總是趨于變得很長,使得難以辨明其究竟在測試些什么。而且難以區分諸如Arrange, Act, Assert(在Cucumber里又被稱為’Given’、’When’和’Then’)這些部分。我們試過在代碼中這些步驟里添加注釋,但它們就和通常那些程序代碼里的注釋一樣不盡如人意:一段時間之后這些注釋就變得與實際代碼不同步了。
      一般來說,如果是在程序里別的地方寫出這么長的方法,我們就會有所警覺,并且通常會采用提取方法的辦法進行重構。何不也這么做呢?讓我們依據Cucumber步驟的風格,把這些代碼也提取成一個個方法吧。
    feature 'Enrolment' do
    scenario 'Enrolling in a course' do
    given_there_is_a_course
    and_i_am_logged_in_as_a_learner
    when_i_enrol_on_a_course
    then_the_course_should_appear_in_my_courses
    end
    def given_there_is_a_course
    @course = FactoryGirl.create(:course)
    end
    def and_i_am_logged_in_as_a_learner
    @learner = FactoryGirl.create(:learner)
    login_as @learner
    end
    def when_i_enrol_on_a_course
    visit course_path(@course)
    find('.join').click
    expect(page).to have_content('Thanks for joining!')
    end
    def then_the_course_should_appear_in_my_courses
    visit '/'
    expect(page).to have_main_header('My Courses')
    expect(page).to have_content(@course.full_title)
    end
    end
      我們有何發現
      我們移除了全部的Cucumber功能測試,并把它們中大部分用新式的RSpec features加以重寫。這樣一來即可保證擁有Cucumber所提供的優秀的可讀性,又使得測試變得更加便于編寫和維護。
      我們做了一個慎重的決定,不把各個features文件里提取的方法進行復用,因為擔心這么做會使得測試難于理解。我們發現在編寫一個feature下的多條scenario時,會不自覺的就想要進行代碼復用。

    posted on 2014-08-29 09:42 順其自然EVO 閱讀(182) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

    <2014年8月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 伊人久久大香线蕉亚洲| 国产大片免费网站不卡美女| 亚洲久悠悠色悠在线播放| 亚洲精品91在线| 亚洲一区二区三区夜色| 国产精品亚洲成在人线| 亚洲国产精品自产在线播放 | 亚洲国产乱码最新视频| 亚洲春黄在线观看| 亚洲mv国产精品mv日本mv| 亚洲自国产拍揄拍| 亚洲а∨精品天堂在线| 精品特级一级毛片免费观看| 免费国产va在线观看| 久久成人18免费网站| 男人的好看免费观看在线视频| 久久免费区一区二区三波多野| 国产免费怕怕免费视频观看| 国产禁女女网站免费看| 午夜亚洲www湿好大| 亚洲成av人片在线天堂无| 午夜网站在线观看免费完整高清观看| 无码人妻精品中文字幕免费东京热| 国产一精品一aⅴ一免费| 亚洲色图黄色小说| 光棍天堂免费手机观看在线观看| 成年女人18级毛片毛片免费观看| 亚洲国产精品无码av| 看免费毛片天天看| 日本特黄特黄刺激大片免费| 亚洲精品午夜视频| 16女性下面无遮挡免费| 亚洲国产精品自在在线观看| a级毛片免费观看在线| 99久久免费精品国产72精品九九| 国产免费看插插插视频| 亚洲人成综合在线播放| 特黄特色大片免费| 最新免费jlzzjlzz在线播放| 亚洲jizzjizz在线播放久| 91免费国产自产地址入|