轉(zhuǎn)載:https://yaowenjie./%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test-part-2
承接上文
??前一篇博客介紹了如何寫一個(gè)簡單的Selenium Test,接下來你將會(huì)了解如何將其轉(zhuǎn)化更符合BDD(行為驅(qū)動(dòng)開發(fā))思想的Cucumber專有語言。
添加依賴
??第一步還是要在 build.gradle 文件內(nèi)的Dependencies內(nèi)添加相應(yīng)的依賴:
compile('info.cukes:cucumber-java8:1.2.4')
compile('info.cukes:cucumber-junit:1.2.4')
??當(dāng)然,如果你用的不是java8,也可以換成對(duì)應(yīng)的其他依賴。然后像之前一樣,執(zhí)行g(shù)radle的build指令,完成添加依賴。
編寫Feature文件
??接下來,你可能就會(huì)想著把上一篇博客提到的步驟轉(zhuǎn)化為Cucumber的語言,也就是feature文件,如下所示:
@base_flow
Feature: This is a simple test using Cucumber.
Scenario:
Given I enter my blog address "https://yaowenjie." 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 這樣的文件。相信即便你不是開發(fā)人員,只要你懂英文,你就明白這段話的意思。除去base_flow的tag,以及上面的四行描述,下面用和自然語言很相似的語言描述了具體的行為。注意,其中的Feature, Scenario, Given, When, And, Then都是Cucumber的feature文件關(guān)鍵字。
編寫具體實(shí)現(xiàn)和測(cè)試
??但是寫好了feature文件,它卻并不能執(zhí)行,所以我們還得依賴java代碼來具體執(zhí)行上述feature文件中的那些步驟。所以需要編寫一個(gè)名為BaseSteps的類,用于表示上述行為的實(shí)現(xiàn):
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表達(dá)式的寫法,并通過正則注入?yún)?shù)。
注意:java版本為1.8.0.71時(shí),這種用法將會(huì)報(bào)這樣的錯(cuò)誤:java.lang.IllegalArgumentException: Wrong type at constant pool index;換成1.8.0.51后問題消失。
??至此,我們這個(gè)簡單的Cucumber Test的實(shí)現(xiàn)部分就完成了,但是要執(zhí)行它們,通常我們需要寫一個(gè)對(duì)應(yīng)的測(cè)試類,比如說BaseFlowTest這個(gè)類:
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文件路徑和對(duì)應(yīng)的feature文件的tag,也就是說執(zhí)行這個(gè)測(cè)試,就會(huì)執(zhí)行對(duì)應(yīng)路徑下tag為base_flow的feature文件內(nèi)容,而這個(gè)feature文件則依賴BaseSteps這個(gè)類來具體實(shí)現(xiàn)它指定的步驟。 ??你可以通過IDE或者使用gradle的task來執(zhí)行這個(gè)測(cè)試(BaseFlowTest),你會(huì)看到和上一篇博客一樣的結(jié)果。不同的是,你維護(hù)的一份更加可讀的文件,這對(duì)于存在大量 可復(fù)用 操作的測(cè)試來說十分便利、有益。
總結(jié)
??本文只是入門級(jí)別的Cucumber編寫指導(dǎo),很多用法并沒有過多涉及。具體代碼可以參考:
|