Cucumberテストを最初から書きます(二)Cucumber Test

9157 ワード

転載: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')

もちろんjava 8でなければ、対応する他の依存に変えることもできます.その後、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,および上の4行の記述,以下では自然言語によく似た言語で具体的な挙動を記述する.Feature,Scenario,Given,When,And,ThenはいずれもCucumberのfeatureファイルキーワードであることに注意してください.

実装とテストの作成


  ただしfeatureファイルが書かれているが実行できないため、javaコードに依存して上記のfeatureファイルの手順を具体的に実行する必要があります.したがって、上記の動作の実装を表すBaseStepというクラスを作成する必要があります.
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())); } } 

ここではJava 8における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ファイルはBaseStepというクラスに依存して指定したステップを具体的に実現します. IDEまたはgradleのtaskを使用してこのテスト(BaseFlowTest)を実行すると、前のブログと同じ結果が表示されます.異なる点は、より読み取り可能なファイルを維持することです.これは、多重化可能な操作が多数存在するテストにとって便利で有益です.

まとめ


本文は入門レベルのCucumber作成指導にすぎず,多くの用法はあまり関連していない.具体的なコードは次のように参照できます.
  • 本明細書のコード:https://github.com/Yaowenjie/Cucumber-Demo
  • ブログの実際のテスト:https://github.com/Yaowenjie/yaowenjie.github.io/tree/master/cucumber-test