cucumber做爲BDD(行爲驅動測試)的自動化測試工具,能夠很好的幫助進行功能測試。它將功能拆分爲一個個的場景(能夠理解爲小功能點),每一個場景內能夠獨立的作數據初始,而後再對初始的數據進行測試,檢測是否達到預期的效果。下面將從java的角度,對cucumber的使用進行說明。(爲了方便起見,這邊只對代碼作簡單的說明,完整的代碼在最後以連接的形式提供下載。)java
1、例子說明正則表達式
下面對職員的新增和根據年齡搜索知足條件的職員進行測試,幾個類的代碼以下:api
首先定義的職員的model:jvm
package com.zzq.test.cucumber.staff; import java.io.Serializable; public class Staff implements Serializable { private static final long serialVersionUID = -1617670200520139146L; private String name; private int age; private String address; public Staff(){ } public Staff(String name, int age, String address) { super(); System.out.println("init data,name:"+name+",age:"+age+",address:"+address); this.name = name; this.age = age; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
緊接着寫了個職員的操做類StaffManager,以下:工具
package com.zzq.test.cucumber.staff; import java.util.ArrayList; import java.util.List; public class StaffManger { private List<Staff> staffList = new ArrayList<Staff>(); public void addStaff(Staff staff){ staffList.add(staff); } public List<Staff> findByAge(int min,int max){ List<Staff> retList = new ArrayList<Staff>(); for(Staff staff:staffList){ if(staff.getAge()>=min&&staff.getAge()<=max){ retList.add(staff); } } return retList; } }
接着對StaffManager的測試步驟(方法)進行定義,其中@Given的部分表明爲測試執行的時候會調用初始的,@Then的部分表明測試的時候會用於檢驗數據/邏輯是否正確:測試
package com.zzq.test.cucumber.staff; import java.util.List; import org.junit.Assert; import com.zzq.test.cucumber.staff.Staff; import com.zzq.test.cucumber.staff.StaffManger; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; public class StaffSteps { private StaffManger manager = new StaffManger(); @Given("姓名:(.+),年齡:(\\d+),地址:(.+)") public void addStaff(String name,int age,String address){ Staff staff = new Staff(name,age,address); manager.addStaff(staff); } @Then("年齡在(\\d+)~(\\d+)的職員有(\\d+)個") public void findByAge(int min,int max,int size){ List<Staff> list = manager.findByAge(min, max); Assert.assertEquals(list.size(), size); } }
接下來定義場景Staff.feature,Given的部分與上面步驟定義的@Given對應,經過正則表達式來匹配;Then的部分與上面的@Then部分匹配。:this
Feature:測試職工相關的功能 Scenario:測試根據年齡查找職工 Given 姓名:漫天的沙,年齡:18,地址:廈門市思明區 And 姓名:小明,年齡:30,地址:北京市朝陽區 And 姓名:李雷,年齡:25,地址:漳州漳浦縣 And 姓名:小紅,年齡:20,地址:江西省 Then 年齡在20~30的職員有3個 Then 年齡在23~30的職員有2個
接下來寫一個測試的入口類:lua
package com.zzq.test.cucumber.staff; import org.junit.runner.RunWith; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) public class StaffTest { }
執行類,junit的運行結果以下:spa
控制檯執行結果以下:.net
2、分析
上述的代碼,首先入口類須要聲明@RunWith(Cucumber.class),該類存在於cucumber-junit的jar包內,聲明以後會自動搜索classpath下全部聲明爲@Given和@Then以及場景的文件。以後對搜索到的內容進行處理,根據@Given註解的內容到搜索到的場景文件的內容進行正則匹配,若是匹配到則調用該方法(正常狀況下用於數據初始);若是爲@Then註解,一樣的正則匹配查找,而後根據設置的參數match groups,設置對應的參數,而後傳參進行校驗。須要注意如下幾個事項:
(1)若是feature文件與測試的Steps類不在同個目錄下,須要經過@CucumberOptions註解進行指定,不然會找不到feature文件致使用例沒執行(不會報錯);
(2)feature文件中的Scenario、Given、And和Then均爲關鍵字。其中Scenario表明爲場景的開始,後能夠跟一句話進行描述;接下來定義Given,對數據進行初始化;接着定義Then,Then用於校驗的時候使用。
完整代碼:完整代碼