轉載:http://www.jianshu.com/p/6249f9a9e9c4html
什麼是Cucumber?什麼是BDD?這裏不細講,不懂的直接查看官方:https://cucumber.io/
什麼是Rest Assured?傳送門:https://github.com/rest-assured/rest-assuredjava
如下以java爲開發語言,快速搭建一個cucumber+Rest Assured的api自動化測試平臺。
1. 用IDEA 新建一個Maven工程,並pom文件添加以下配置:git
<!--ccucumber 相關依賴--> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-java8</artifactId> <version>1.2.4</version> <scope>test</scope> </dependency> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-java</artifactId> <version>1.2.4</version> </dependency> <!-- https://mvnrepository.com/artifact/info.cukes/cucumber-html --> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-html</artifactId> <version>0.2.3</version> </dependency> <!--rest-assured 接口測試框架--> <!-- https://mvnrepository.com/artifact/com.jayway.restassured/rest-assured --> <dependency> <groupId>com.jayway.restassured</groupId> <artifactId>rest-assured</artifactId> <version>2.9.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.testng/testng --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.9.10</version> </dependency> <!--log 引入--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> <scope>provided</scope> </dependency> <!--compare jsoon--> <dependency> <groupId>net.javacrumbs.json-unit</groupId> <artifactId>json-unit</artifactId> <version>1.13.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.1</version> </dependency>
新建個ApiTools類,並對Rest Assured進程二次封裝,主要是Post 和 Get請求的基礎封裝和對返回json解析的封裝,具體代碼以下:github
/** * 帶json的post請求 * * @param apiPath api地址 * @param json 請求json * @return api返回的Response */ public static Response post(String apiPath, String json) { // 開始發起post 請求 String path = Parameters.BOSEHOST + apiPath; Response response = given(). contentType("application/json;charset=UTF-8"). headers("header1", "value1"). cookies("cookies1", "value1"). body(json). when().log().all().post(path.trim()); log.info(response.statusCode()); log.info("reponse:"); response.getBody().prettyPrint(); return response; } /** * get 請求 * * @param apiPath api路徑 * @return api的response */ public static Response get(String apiPath) { // 開始發起GET 請求 String path = Parameters.BOSEHOST + apiPath; Response response = given(). contentType("application/json;charset=UTF-8"). headers("headers1", "value1"). cookie("cookie1", "value1"). when().log().all().get(path.trim()); log.info(response.statusCode()); log.info("reponse:"); response.getBody().prettyPrint(); return response; } /** * 獲取json中某個key值 * @param response 接口返回 * @param jsonPath jsonpath, 例如 a.b.c a.b[1].c a * @return */ public static String getJsonPathValue(Response response, String jsonPath) { String reponseJson = String.valueOf(response.jsonPath().get(jsonPath)); // String jsonValue = String.valueOf(from(reponseJson).get(jsonPath)); return reponseJson; }
3.新建個Steps 類,完成經常使用step的封裝,具體代碼以下:chrome
import com.jayway.restassured.response.Response; import com.tools.apitools.ApiTools; import com.tools.apitools.MyAssert; import com.tools.filetools.ReadTxtFile; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; /** * Created by MeYoung on 8/1/2016. * <p> * Steps 集合 */ public class Steps { Response response = null; @When("^I send a GET request to \"(.*?)\"$") public void getRequest(String path) { response = ApiTools.get(path); } @When("^I send a POST request to \"(.*?)\"$") public void postRequest(String apiPath) throws Throwable { response = ApiTools.post(apiPath); } @When("^I send a POST request to \"(.*?)\" and request json:$") public void postRequestWithJson(String apiPath, String json) { response = ApiTools.post(apiPath, json); } @When("^I use a \"(.*?)\" file to send a POST request to \"(.*?)\"$") public void postRequestWihtFile(String fileName, String path) { String json = ReadTxtFile.readTxtFile(fileName); response = ApiTools.post(path, json); } @Then("^the JSON response equals$") public void assertResponseJson(String expected) { String responseJson = response.body().asString(); assertJsonEquals(responseJson, expected); } @Then("^the JSON response equals json file \"(.*?)\"$") public void theJSONResponseEqualsJsonFile(String fileName) { String responseJson = response.body().asString(); String fileJson = ReadTxtFile.readTxtFile(fileName); assertJsonEquals(responseJson, fileJson); } @Then("^the response status should be \"(\\d{3})\"$") public void assertStatusCode(int statusCode) { Object jsonResponse = response.getStatusCode(); MyAssert.assertEquals(jsonResponse, statusCode); } @Then("^the JSON response \"(.*?)\" equals \"(.*?)\"$") public void assertEquals(String str, String expected) { String jsonValue = ApiTools.getJsonPathValue(response, str); MyAssert.assertEquals(jsonValue, expected); } @Then("^the JSON response \"(.*?)\" type should be \"(.*?)\"$") public void assertMatch(String str, String match) { String jsonValue = ApiTools.getJsonPathValue(response, str); MyAssert.assertMatch(jsonValue, match); } @Then("^the JSON response \"(.*?)\" should be not null$") public void assertNotNull(String str) { String jsonValue = ApiTools.getJsonPathValue(response, str); MyAssert.assertNotNull(jsonValue); } @Then("^the JSON response \"(.*?)\" start with \"(.*?)\"$") public void assertStartWith(String str, String start) { String jsonValue = ApiTools.getJsonPathValue(response, str); MyAssert.assertStartWith(jsonValue, start); } @Then("^the JSON response \"(.*?)\" end with \"(.*?)\"$") public void assertEndWith(String str, String end) { String jsonValue = ApiTools.getJsonPathValue(response, str); MyAssert.assertEndWith(jsonValue, end); } @Then("^the JSON response \"(.*?)\" include \"(.*?)\"$") public void assertInclude(String str, String include) { String jsonValue = ApiTools.getJsonPathValue(response, str); MyAssert.assertInclude(jsonValue, include); } }
固然上面代碼還涉及到一些Asssert的封裝,這裏就不列出來,我的喜愛不一樣,更具本身熟悉的狀況去引入本身熟悉的jar包。apache
ok,最後咱們愉快的寫兩個case,看看效果:json
@get Scenario Outline: use examples When I send a GET request to "apiurl" Then the response status should be "200" Then the JSON response "<jsonPath>" equals "<value>" Examples: | jsonPath | value | | genericPlan | false | | ehiCarrierId | 90121100 | | carrierName | Anthem Blue Cross | @post Scenario: test post request When I send a POST request to "apiurl" Then the response status should be "200" And the JSON response "message" equals "success" # 校驗放回值是不是某種類型 And the JSON response "sessionId" type should be "^\d{6}$" # 校驗返回值不爲空 And the JSON response "url" should be not null # 校驗是否以XX開頭 Then the JSON response "message" start with "su" # 校驗是否以XX開頭 Then the JSON response "message" end with "ss" # 校驗是否以XX開頭 Then the JSON response "message" include "ss" # 校驗返回json是否爲XXX,對整個返回json的校驗 Then the JSON response equals """ { "result":"success" } """
在Pom.xml 文件添加junit相關包:api
<dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-junit</artifactId> <version>1.2.4</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions( strict = true, monochrome = true, plugin = {"pretty", "html:target/cucumber", "json:target/cucumber.json"}, features = {"src/test/java/bosev2"}, glue = {"com.bose.step"}, tags = {"~@unimplemented"}) public class RunnerBoseTest { }
@RunWith(Cucumber.class) : 註解表示經過Cucumber的Junit 方式運行腳本
@CucumberOptions () :註解用於配置運行信息,其中代碼中的plugin 表示測試報告輸出的路徑和格式, feature 表示被運行的feature文件的包路徑, glue中配置steps的包路徑地址,tags中配置要運行的用例的tags名,其實~符號表示除了這個tags的全部tags.cookie
在Pom.xml 文件裏面添加運行插件,以下:session
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <inherited>true</inherited> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <reuseForks>false</reuseForks> </configuration> </plugin> </plugins> </build>
Cucumber-JVM reports 提供了很是漂亮的report,以下: