日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Cucumber 入门一

發布時間:2024/4/24 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 Cucumber 入门一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(轉自:http://www.cnblogs.com/jarodzz/archive/2012/07/02/2573014.html)

第一次看到Cucumber和BDD(Behavior Driven Development, 行為驅動開發),是在四年前。那時才開始工作,對軟件測試工具相當著迷。僅僅要是開源的、免費的,我就一定要下載,安裝,試用。有的工具用途單一、好懂(如Jmeter,Watir);有的工具,則涉及到一些軟件領域的獨有概念,不好懂,(如STAF,Cucumber)。好懂的,我上手、試用、推廣,不亦樂乎;不好懂的,就僅僅能丟在一邊,這里面就包含Cucumber。

再次看到Cucumber,已是兩年前。我對軟件開發的理解也深了些,這一看,可真是個好東西。之后我與Cucumber間發生的故事,稍后慢慢向大家交代。這開篇的第一章,我想獻給如當年的我一樣,偶然見到了Cucumber和BDD,卻不明所以將之丟在一邊的家伙們。

初聞Cucumber的人,第一件事一定是來到Cucumber的首頁,第一眼看到的一定是

非常不幸的是,這六張圖不太好懂。由于它們依照BDD的流程來編寫的。為了讓它們好懂些,我們拋開BDD,採用傳統的軟件開發模型(設計->編碼->測試)來看它。傳統流程例如以下:

圖1,這是一個被測系統——用ruby編寫的計算器。



為了便于大家理解,我試著改動了一些。

?

classCalculator

defpush(n)
#記數

@args||=
[]
#初始化空數組

@args<<
n

end

defsum()
#返回全部數字和

sum
=
0

@args.eachdo|i|

sum
+= i

end

@result=
sum

end

defresult

@result

end

end

計算器Calculator提供兩個功能: 記數push;加和sum。push將數字一一記錄在@args數組中;sum則將全部@args數組中的數字累加得和,存入@result中。寫完了被測系統,我們來編寫測試用例。

圖2,這是為了測試上述計算器,使用Cucumber描寫敘述的測試用例。



原圖中的英文描寫敘述,被我翻譯成了中文。:

?

Feature:
計算器

Scenario:
兩數相加

Given
我有一個計算器

And
我向計算器輸入
50

And
我向計算器輸入
70

When
我點擊累加

Then
我應該看到結果
120

支持中、英等自然語言,是Cucumber的特點之中的一個。在Cucumber的幫助文檔里,聲明它支持包含中文簡體、繁體中文、日文、韓文和英文在內的45種語言。

注意:我并未將全部英文都翻譯成中文,而是留下了幾個keyword:

Feature(功能)
Scenario(情景)
Given(給定)
And(和)
When(當)
Then(則)

它們的含義與原有自己主動化測試工具中的概念同樣,類比方下:

Cucumber Unit Test
Feature (功能) test suite (測試用例集)
Scenario(情景) test case (測試用例)
Given(給定) setup(創建測試所需環境)
When(當) test(觸發被測事件)
Then(則) assert(斷言,驗證結果)

Cucumber放棄了原有的keyword,而選擇了左邊五種,僅僅是為了更加流暢地支持自然語言。使用Cucumber的keyword,創建了測試用例,接下來,要怎樣使用Cucumber來執行它呢?

圖3,這是執行Cucumber時的畫面。



在一臺安裝好Cucumber的機器上,執行上述測試用例,便能夠看到下列輸出:

?

Feature:
計算器

Scenario:
兩數相加
#
features/calculator.feature:3

Given
我有一個計算器
#
features/calculator.feature:4

And
我向計算器輸入
50#
features/calculator.feature:5

And
我向計算器輸入
70#
features/calculator.feature:6

When
我點擊累加
#
features/calculator.feature:7

Then
我應該看到結果
120#
features/calculator.feature:8

1scenario
(
1undefined)

5steps
(
5undefined)

0m0.005s

You
can implement step definitions
forundefined
steps with these snippets:

Given
/^我有一個計算器$/
do

pending
#
express the regexp above with the code you wish you had

end

Given
/^我向計算器輸入(d+)$/
do|arg1|

pending
#
express the regexp above with the code you wish you had

end

When
/^我點擊累加$/
do

pending
#
express the regexp above with the code you wish you had

end

Then
/^我應該看到結果(d+)$/
do|arg1|

pending
#
express the regexp above with the code you wish you had

end

Cucumber首先輸出的是測試用例的描寫敘述,然后3行總結性地輸出:本功能(Feature)有1個情景(1 scenario);5個步驟(5 steps),所有5個步驟均沒有定義(undefined);執行耗時0.005秒。這里出現了兩個新名詞:步驟(steps)和步驟定義(step definitions)。在Cucumber中,以keywordGiven, And, When, Then開頭的每一行,為一個步驟。在兩數相加的情景中,一共同擁有5行。因此,結果顯示:5個步驟。

怎樣定義一個步驟,在Cucumber的執行結果中也給出了具體的辦法。在3行總結性輸出后,緊接著便是:You can implement…即:你能夠使用以下的代碼段實現步驟定義,然后是4個小的代碼段。這些代碼段,便是Cucumber按照情境中我們使用的5個步驟,幫助我們生成的步驟定義框架。每一個框架都將內容部分空白出來,等待填充。以下,我們來進行步驟定義。

圖4, 這是一個步驟定義的代碼示范。



我們按照圖2的樣子,向中文步驟中填入代碼,例如以下:

?

Given
/^我有一個計算器$/
do

@c=
Calculator.
new

end

Given
/^我向計算器輸入(d+)$/
do|num|

@c.push(num.to_i)

end

When
/^我點擊累加$/
do

@c.sum

end

Then
/^我應該看到結果(d+)$/
do|result|

@c.result.should
== result.to_i

end

步驟定義的過程,就是向代碼段——步驟定義框架——中填入代碼的過程,即:用代碼來描寫敘述你期望的,該步驟應該運行的動作。完整的步驟定義是一個函數,它:

以正則表達式作為函數名
匹配值作為參數
以測試人員輸入的代碼作為內容

由于有了正則表達式的匹配,5個步驟僅須要4個步驟定義。“我向計算器輸入50、70”兩個步驟,都能夠用“我向計算器輸入(d+)”一個正則表達式來描寫敘述。匹配值被自己主動提取出來作為參數,傳入代碼。注意:全部匹配值,即參數,都是以字符串的形式傳遞,因此,我增加了num.to_i
與 result.to_i,將得到的字符串轉為整形。步驟定義完畢,再次運行Cucumber。屏幕將會顯示一片綠色。

圖5,它是一個運行Cucumber測試用例,并成功通過的畫面。



步驟定義完畢后,再次執行Cucumber。Cucumber會找到步驟定義,并依照其代碼去執行。結果例如以下:

?

Feature:
加法

Scenario:
兩數相加
#
features/calculator.feature:3

Given
我有一個計算器
#
features/step_definitions/a.rb:2

And
我向計算器輸入
50#
features/step_definitions/a.rb:6

And
我向計算器輸入
70#
features/step_definitions/a.rb:6

When
我點擊累加
#
features/step_definitions/a.rb:10

Then
我應該看到結果
120#
features/step_definitions/a.rb:14

1scenario
(
1passed)

5steps
(
5passed)

0m0.003s

步驟定義被我保存在目錄step_definitions下的a.rb其中。步驟定義所在文件與起始行數,被打印在每一個步驟結尾,以方便查找和改動。最后,Cucumber總結性地輸出執行結果:1個情景,5個步驟,所有通過。

圖6, 這是一個運行Cucumber測試用例,但失敗的畫面。



為了讓這個已經十分簡單的計算器產生bug,我僅僅好將它改錯為:

?

classCalculator

defsum()

sum
=
0

@args.eachdo|n|

sum
= n
#此處原為:sum
+= n

end

@result=
sum

end

end

再次執行Cucumber,結果為:

?

Feature:
加法

Scenario:
兩數相加
#
features/calculator.feature:3

Given
我有一個計算器
#
features/step_definitions/a.rb:2

And
我向計算器輸入
50#
features/step_definitions/a.rb:6

And
我向計算器輸入
70#
features/step_definitions/a.rb:6

When
我點擊累加
#
features/step_definitions/a.rb:10

Then
我應該看到結果
120#
features/step_definitions/a.rb:14

expected:
120

got:
70(using
==) (RSpec::Expectations::ExpectationNotMetError)

./features/step_definitions/a.rb:15:in`/^我應該看到結果(d+)$/'

features/calculator.feature:8:in`Then
我應該看到結果
120'

Failing
Scenarios:

cucumber
features/calculator.feature:
3#
Scenario: 兩數相加

1scenario
(
1failed)

5steps
(
1failed,
4passed)

0m0.004s

失敗的步驟是用紅色標示出來的。在最后一個步驟中,Cucumber期待的結果為120,但得到的是70。注意:失敗的情景列表(Failing Scenarios)里列出的是:“兩數相加”這個情景所在的文件與起始行數。這是由于一個功能文件內,可能含有多個情景,這樣的輸出能夠便于找到出錯的情景。

接下來的總結性結果為:1個情景失敗(1 failed),5個步驟中,4個通過,1個失敗。

作為自己主動化測試工具的Cucumber,就介紹到這里。

在繼續之前,我們先回想一下本章內容。

回想:

Cucumber是一個自己主動化測試工具
它提供了自然語言的支持,我們能夠用自然語言描寫敘述、并運行測試用例
它提供了自然語言與代碼的銜接,通過步驟與步驟定義
它提供了自然語言對代碼的調用,當步驟定義結束后,執行Cucumber,它會自己主動調用步驟定義內的代碼執行
它提供了良好的斷言(assert)機制。當運行失敗時,我們能夠看到完畢的測試用例,以及明白的失敗原因。

總結

以上是生活随笔為你收集整理的Cucumber 入门一的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。