在上一篇中,我們搭建好了Selenium + Cucumber + Java的自動化測試環境,這一篇我們就趕緊開始編寫我們的第一個BDD測試用例。
2.1 創建features
我們在新建的java項目中,新建一個文件夾名為features,然后右鍵點擊該文件夾,新建一個名為test.feature的新文件。
文件建好后,你會看到他呈現出與普通文本文件不同的樣式,並且自帶很多內容:
這些內容實際是cucumber給我們提供的feature模板,我們按照這個模板寫出第一個測試用例。
我們用自然語言,結合Given,When,And,Then這些關鍵字來編寫測試用例:
Feature: Test baidu search for selenium Search for selenium on baidu @tag Scenario: Test Baidu search for selenium Given I navigate to baidu When I send keyword into searchbox And I click search button Then The correct search result is returned
可以看到,這個用例就是用自然表述性語言撰寫的,具有很高的可讀性,不需要懂代碼也都能看明白這個用例測試的內容:就是去到百度,然后搜索關鍵字,判斷搜索是否成功。
2.2 創建runner
這個用例既然是自然語言撰寫的,也就還暫時不能實現自動化執行,我們接下來還要編寫這個用例對應的實際selenium java代碼的實現過程,其實就是用java對我們的用例進行“翻譯”,好讓selenium能讀懂,並進行測試的執行。
首先,在src目錄下新建package名為runner,然后新建一個java class名為cucumberRunner,這個類里面我們寫入如下代碼:
package Runner; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) @CucumberOptions(features=("features"),glue=("stepDefinition")) public class CucumberRunner { }
這個類主要起的作用實際上就是我們cucumber的執行入口,同時他定義了cucumber用例執行時的一些特性,比如CucumberOptions標簽里,features指定用例文件的目錄,glue則指定對應java翻譯代碼的位置。寫好這個類以后,我們可以馬上右鍵對他點擊,運行Run As -> JUnit Test。運行之后,系統輸出了一些日志:
從日志里面我們可以看到,系統提示:我們定義了4個測試步驟,但都沒有實現,下面我們馬上來實現這些步驟。
2.3 實現步驟定義
在src目錄下新建stepDefinitions包,然后在包下新建一個java class名為TestBaidu,這個類里面我們就實現之前的feature里面定義的測試步驟。
我們輸入如下代碼:
package stepDefinitions; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; public class TestBaidu { WebDriver driver; @Given("^I navigate to baidu$") public void i_navigate_to_baidu() throws Throwable { driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.manage().window().maximize(); driver.get("http://www.baidu.com"); } @When("^I send keyword into searchbox$") public void i_send_keyword_into_searchbox() throws Throwable { WebElement searchBox; searchBox = driver.findElement(By.id("kw")); searchBox.sendKeys("selenium"); } @When("^I click search button$") public void i_click_search_button() throws Throwable { WebElement searchButton; searchButton = driver.findElement(By.id("su")); searchButton.click(); } @Then("^The correct search result is returned$") public void the_correct_search_result_is_returned() throws Throwable { WebElement searchResult; searchResult = driver.findElement(By.xpath(".//*[@id='container']/div[2]/div/div[2]/span")); Assert.assertTrue(searchResult.isDisplayed()); Thread.sleep(2000); driver.quit(); } }
寫好以后,再次運行runner類,可以看到測試執行成功了:)
下一篇我們來使用tags對cucumber測試用例進行分組。