qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

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

           Chris Zetter是FutureLearn產(chǎn)品組的一名開發(fā)者,他為我們講述了自己的小組為了使功能測試兼具可維護性與可讀性,在把Cucumber替換為RSpec之后是如何來編寫測試的。
            測試是建立與維護一個大型平臺不可或缺的一部分。每當我們?yōu)镕utureLearn這個平臺增添新功能時,我們都會編寫自動化的功能測試來記錄這些新功能是如何運作的,并確保他們不運轉(zhuǎn)時我們也能知曉。
            令人愛恨交加的Cucumber
            Cucumber是一款用來編寫功能測試的常用工具,每當我們開啟項目時它都是我們的不二選擇。它可以讓我們以用戶的視角編寫出高層級的行為驅(qū)動測試。
          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因為它可以使根據(jù)用戶故事編寫測試變得簡單易行,而且寫完的測試通俗易懂。然而使用Cucumber也有些許不足之處。首先,我們已經(jīng)在項目里使用了RSpec,再引入Cucumber意味著又要多維護一個測試框架;其次,由于兩者的DSLs和測試運行器不同,在他們之間進行腦筋切換又會帶來額外開銷;最后,我們特別不喜歡Cucumber所使用的正則表達式,因為同Ruby的標準方法調(diào)用相比,它們使測試變得更加晦澀難懂。
            編寫更好的RSpec features
            那么,我么該如何在不失測試可讀性的前提下停用Cucumber呢?
            我們已經(jīng)開始使用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
            它們總是趨于變得很長,使得難以辨明其究竟在測試些什么。而且難以區(qū)分諸如Arrange, Act, Assert(在Cucumber里又被稱為’Given’、’When’和’Then’)這些部分。我們試過在代碼中這些步驟里添加注釋,但它們就和通常那些程序代碼里的注釋一樣不盡如人意:一段時間之后這些注釋就變得與實際代碼不同步了。
            一般來說,如果是在程序里別的地方寫出這么長的方法,我們就會有所警覺,并且通常會采用提取方法的辦法進行重構(gòu)。何不也這么做呢?讓我們依據(jù)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
            我們有何發(fā)現(xiàn)
            我們移除了全部的Cucumber功能測試,并把它們中大部分用新式的RSpec features加以重寫。這樣一來即可保證擁有Cucumber所提供的優(yōu)秀的可讀性,又使得測試變得更加便于編寫和維護。
            我們做了一個慎重的決定,不把各個features文件里提取的方法進行復用,因為擔心這么做會使得測試難于理解。我們發(fā)現(xiàn)在編寫一個feature下的多條scenario時,會不自覺的就想要進行代碼復用。

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

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

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宁都县| 东兰县| 班玛县| 福州市| 丰城市| 平利县| 永吉县| 荆州市| 墨脱县| 滨海县| 吉安市| 抚州市| 辰溪县| 田阳县| 凤山县| 凭祥市| 湛江市| 玉环县| 金寨县| 宁武县| 河间市| 策勒县| 曲松县| 渝北区| 东平县| 巴彦淖尔市| 荆门市| 竹山县| 中宁县| 万源市| 连江县| 平乡县| 定结县| 阿鲁科尔沁旗| 奎屯市| 永和县| 西平县| 陆川县| 盐池县| 青铜峡市| 乾安县|