天天看點

Cucumber入門之GherkinGherkin在英語中是腌制的小黃瓜的意思,

1.Gherkin簡介:

Cucumber是一個解釋程式,就像ruby指令執行解釋 .rb檔案裡的Ruby代碼一樣,Cucumber用來執行解釋 .feature檔案裡的Gehrkin代碼。

Gherkin在英語中是腌制的小黃瓜的意思,

用Gherkin語言編寫的測試步驟,就像一個一個腌制的小黃瓜一樣,豎向排列着,case清清楚楚,一目了然。

2. 關鍵字:

當你編寫一個feature檔案的時候,會用到很多Gherkin語言裡特定的關鍵字,主要包括下這面些:

  • Feature

  • Background

  • Scenario

  • Scenario outline

  • Scenarios (or examples)

  • Given

  • When

  • Then

  • And (or but)

  • | (用來定義表格)

  • """ (定義多行字元串)

  • # (注釋) 

  我們可以在關鍵字後面寫任何我們想寫的東西。關鍵字Given, When, Then, And 和 But用來訓示一個場景中的步驟。

     每一個feature檔案必須以關鍵字Feature開始,且緊跟着一個冒号和一個描述。這個描述可以在很多行上,但一般來說比較好的模式是寫一句簡短的概述,緊接着在下一行對此進行一個簡明的描述。比如: 

       Feature: Book flight

              In order to book a flight

              As a user

              I want to find the cheapest flight 

       當然有一點需要指出的是,Cucumber并不關心你在這裡寫了什麼。它隻是簡單的忽略這些代碼直到它碰到關鍵字Background, Scenario 和 Scenario Outline. 我們寫這些的目的僅僅是為了溝通和交流。

3. Scenarios/Steps/The cucumber Command

  1. Scenario:一個feature檔案裡面可以有很多個Scenario,一個Scenario就是一個具體的你想要測試的功能點,一個Scenario又是由很多個步驟(Steps)組成的。Scenario明确的描述我們期望的程式的行為,且友善不同職位的人員進行溝通,因為你隻要看到一個Scenario,很容易就知道它想做什麼。

一個Scenario的第一部分是Scenario關鍵字後面緊跟一個冒号和一個對應該場景的描述。如下:

       Feature: Book flight

              In order to book a flight

              As a user

              I want to find the cheapest flight       

        Scenario: Successful booking flight

  2. Steps:每個Scenario都可以使用任意數量的步驟來描述任何發生在該場景裡的事情,一個步驟通常是一行單獨的文本并且由以下這些關鍵字開頭:Given,When,Then,And and But. 如下:(注意:步驟後面不需要跟冒号)

       Feature: Book flight

              In order to book a flight

              As a user

              I want to find the cheapest flight       

        Scenario: Successful booking flight

               Given I visit a website to book flight

  3. The cucumber Command: 一旦我們寫好了一個feature檔案,我們就可以使用 cucumber 指令來運作它。如果cucumber指令後不跟任何東西的話,那麼它會執行所有的.feature檔案。如果我們隻想運作某一個.feature檔案,我們可以使用指令cucumber featuresfeature_name

4.Given/When/Then/And/But

  a) Given:表示scenario中我們接受/認為是真的東西,它将為後面的when(事件/操作)和Then(輸出)提供背景/上下文;如:Given I visit a website

  b)When:表示scenario中的事件或動作;如:When I click the submit button.; 一般我們喜歡在一個scenario中隻有一個事件或動作,因為這樣容易了解scenario的目的且容易找到錯誤當失敗的時候;

  c) Then:表示預期的輸出;

  d) And/ But: 我們可以使用And 和 But 作為Given/When/Then的同義詞,如:”Given x, And y,” 這裡的And就是Given的意思;再如:”Then x, But not y,” 這裡的But就是Then的意思;

例:

 

Scenario: LSH C2696.1: Ingest 1st party data - full in PELID tenant
    Given I have a LSH source connection to SOURCE_GCS
    And I have a LSH destination connection to "source_bucket" from config "Mutual"
    And a source file named "lsh/1P/full_CL_tenant-2020090703_20200910-170001_2020090703_PEL.csv"
    And a source ok file named "lsh/1P/full_CL_tenant-2020090703_20200910-170001_2020090703_PEL.csv.ok"
    And I use "pel.1p.manual_full_ingestion_td" name for destination file "Ingestion"
    And I use "pel.1p.manual_full_ingestion_td_ok" name for destination ok file "Ingestion"
    When I upload LSH source file into destination
    And  I upload LSH source ok file into destination
    Then I should see that LSH source and uploaded files have the same size
      

  

5. Tags:

  正如前面提到的一個.feature 檔案裡面可以有很多scenario組成。如果我們運作了一個包含有很多個scenario的feature檔案時,它會執行這個檔案裡面所有的scenario;但是有的時候我們可能隻想運作某一個/些特别的scenario時,這時我們可以使用Tags; 

在Cucumber裡Tag看上去和Ruby的執行個體變量比較像。如@wip, @foo…可以在Feature或Scenario關鍵字前給feature或scenario添加任意數量的tags,如: 

  @approved @book_flight

  Feature: Book flight 

          @wip

          Scenario: Book a flight on web

  一個Scenario會繼承指定給Feature的tags,是以在上面的例子中,Scenario有三個tags:@approved @book_flight @wip.  然後我們就可以使用指令:cucumber  --tags tag_name來運作我們想運作的那部分Scenario.如:cucumber –tags @wip 

  此外,--tags還支援複雜的表示示,包括: AND,OR和NOT,如下:

  cucumber –tags @foo,@bar

  #@foo || @bar        運作所有包含@foo OR @bar的scenarios

  cucumber --tags @foo --tags @bar

  # @foo && @bar   運作所有包含@foo AND @bar的scenarios

  cucumber --tags ~@dev

  #!@dev                  運作所有不包含@dev的scenario

  cucumber --tags @foo,~@bar --tags @baz

  # (@foo || !@bar) && @baz