從頭寫一個Cucumber測試(二) Cucumber Test


轉載:https://yaowenjie.github.io/%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test-part-2

承接上文

  前一篇博客介紹了如何寫一個簡單的Selenium Test,接下來你將會了解如何將其轉化更符合BDD(行為驅動開發)思想的Cucumber專有語言。

添加依賴

  第一步還是要在 build.gradle 文件內的Dependencies內添加相應的依賴:

compile('info.cukes:cucumber-java8:1.2.4')
compile('info.cukes:cucumber-junit:1.2.4')

  當然,如果你用的不是java8,也可以換成對應的其他依賴。然后像之前一樣,執行gradle的build指令,完成添加依賴。

編寫Feature文件

  接下來,你可能就會想着把上一篇博客提到的步驟轉化為Cucumber的語言,也就是feature文件,如下所示:

@base_flow
Feature: This is a simple test using Cucumber.

  Scenario:
    Given I enter my blog address "https://yaowenjie.github.io" and go to Home page
    # Search Button Feature:
    When I click the search button
    And I enter "PowerShell" in the input field
    And I click the first result of search
    Then I go to the article page with title containing "PowerShell"

  你可以給它命名為諸如 simple_test.feauture 這樣的文件。相信即便你不是開發人員,只要你懂英文,你就明白這段話的意思。除去base_flow的tag,以及上面的四行描述,下面用和自然語言很相似的語言描述了具體的行為。注意,其中的Feature, Scenario, Given, When, And, Then都是Cucumber的feature文件關鍵字。

編寫具體實現和測試

  但是寫好了feature文件,它卻並不能執行,所以我們還得依賴java代碼來具體執行上述feature文件中的那些步驟。所以需要編寫一個名為BaseSteps的類,用於表示上述行為的實現:

package com.wenjie; import cucumber.api.java8.En; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.MatcherAssert.assertThat; import static org.openqa.selenium.support.PageFactory.initElements; public class BaseSteps implements En { private WebDriver driver = new FirefoxDriver(); private BlogPage blogPage = new BlogPage(); public BaseSteps() { blogPage = initElements(driver, BlogPage.class); Given("^I enter my blog address \"([^\"]*)\" and go to Home page$", (String url) -> { driver.get(url);} ); When("^I click the search button$", () -> { blogPage.clickSearchButton(); }); And("^I enter \"([^\"]*)\" in the input field$", (String keyword) -> { blogPage.inputSearchWording(keyword); }); And("^I click the first result of search$", () -> { blogPage.clickFirstResultOfSearch(); }); Then("^I go to the article page with title containing \"([^\"]*)\"$", (String keyword) -> { assertContainsIngoreCase(blogPage.getArticleTitle(), keyword); }); } public static void assertContainsIngoreCase(String set, String subset) { assertThat(set.toLowerCase(), containsString(subset.toLowerCase())); } } 

  可以看出來,我們這里采用了Java8中Lambda表達式的寫法,並通過正則注入參數。

注意:java版本為1.8.0.71時,這種用法將會報這樣的錯誤:java.lang.IllegalArgumentException: Wrong type at constant pool index;換成1.8.0.51后問題消失。

  至此,我們這個簡單的Cucumber Test的實現部分就完成了,但是要執行它們,通常我們需要寫一個對應的測試類,比如說BaseFlowTest這個類:

package com.wenjie; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions( features = {"src/test/resources/features"}, tags = {"@base_flow"} ) public class BaseFlowTest { } 

  它指定了feature文件路徑和對應的feature文件的tag,也就是說執行這個測試,就會執行對應路徑下tag為base_flow的feature文件內容,而這個feature文件則依賴BaseSteps這個類來具體實現它指定的步驟。
  你可以通過IDE或者使用gradle的task來執行這個測試(BaseFlowTest),你會看到和上一篇博客一樣的結果。不同的是,你維護的一份更加可讀的文件,這對於存在大量 可復用 操作的測試來說十分便利、有益。

總結

  本文只是入門級別的Cucumber編寫指導,很多用法並沒有過多涉及。具體代碼可以參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM