近幾年接口自動化變得越來越熱門,相對比於UI自動化,接口自動化有一些優勢
1.運行比UI更穩定,讓BUG更容易定位
2.UI自動化維護成本太高,接口相對低一些
接口測試其實有很多方式,主要有兩種,一個是工具,最常見的有:Postman,SoupUI,Jmeter;另一個就是代碼,Java和Python都可以實現。
工具的好處就是直觀,快速上手,有些工具也做到了半自動化和集成,但是工具還是會有一定的限制,代碼相對與工具來說是更萬能,利用接口測試框架結合TestNG或者Junit,實現接口自動化。這是一篇有關於用Java代碼實現接口自動化的兩個常用框架以及接口返回值處理方式的介紹。
一.REST Assured測試框架
maven坐標
<dependencies> <!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured --> <dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <version>4.0.0</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/io.rest-assured/json-path --> <dependency> <groupId>io.rest-assured</groupId> <artifactId>json-path</artifactId> <version>4.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/io.rest-assured/json-schema-validator --> <dependency> <groupId>io.rest-assured</groupId> <artifactId>json-schema-validator</artifactId> <version>4.0.0</version> </dependency>
</dependencies>
官方文檔中建議靜態導入
import static io.restassured.RestAssured.*; import static io.restassured.matcher.RestAssuredMatchers.*; import static org.hamcrest.Matchers.*;
語法格式
public void testExample() { given() .queryParam("wd","mp3") .when() .get("http://www.baidu.com/s") .then() .log().all() .statusCode(200); }
given() 后面跟一次網絡請求所需要的條件
.cookies() --cookies 是Map形式存儲
.contentType()
.queryParam("key","value") 用於get請求參數
.body(Jsondata) 存放Json格式類型
.body(XMLdata) 存放XML格式類型
.formParam("Key","Value") 表單參數類型
.multipartFile(new File(filePath))
.log().all() 打印所有日志
.relaxedHTTPSValidation() --處理無效SSL證書過期 不對的異常
參考文檔:https://blog.csdn.net/u011541946/article/details/98892042
when() 觸發條件
.get("url")
.post("url")
.post("url/{key1}/{key2}",value1,value2)
then() 斷言
.statusCode(200)
.body("key",hasItems(""))
public Response testDemo(String corpid,String corpsecret ){ Response res = RestAssured.given() .log().all() .when().get("https://baidu.com") .then().extract().response();
return res; }
extract().response() 以response格式獲取響應結果
res.getCookie()
res.getHeader()
res.getStatusCode()
res.path("").toString() 獲取返回中某個節點的值
res.asString() 獲取返回內容體
二.HttpClient
maven坐標
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.5</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.4</version> </dependency>
導入
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.HttpEntity;
簡單實例
public String demoPost(String httpUrl) { String cookie ="JESSIONID=xxxxxxxx";
String params = "JsonData";
StringEntity stringEntity = new StringEntity(params, "UTF-8"); stringEntity.setContentType("application/x-www-form-urlencoded"); HttpPost httpPost = new HttpPost(httpUrl); httpPost.setHeader(cookie,cookie); httpPost.setEntity(stringEntity); HttpClient client = new DefaultHttpClient(); HttpResponse Response = client.execute(httpPost); String result = EntityUtils.toString(Response.getEntity()); }
登錄需要存儲Cookie的方式
CookieStore cookiestore=new BasicCookieStore(); CloseableHttpClient client1=HttpClients.custom().setDefaultCookieStore(cookiestore).build();
List<Cookie> cookies = cookiesstore.getCookies();
如果登錄時頁面有重定向操作,也可以用cookieStore的方式存儲每次重定向時需要用到的cookie
三. 對返回的內容Json化
1.JSON
maven坐標
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180130</version> </dependency>
數組形式response
JSONArray array = new JSONArray(response); JSONObject object = array.getJSONObject(0); String value = object.get("key").toString();
帶頭信息的response
JSONObject object = new JSONObject(response); String value = object.getString("key");
2.gson (推薦)
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> //如果使用更新的版本,JsonParser會被推薦不使用 </dependency>
import com.google.gson.JsonParser;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
數組形式response
JsonPraser parser = new JsonParser();
JsonArray array = parser.parse(response).getAsJsonArray; JsonObject object = array.get(0).getAsJsonObject();
String value = object.get("key").getAsString();
帶頭信息的response
JsonPraser parser = new JsonParser();
JsonObject object = parser.parse(response).getAsJsonOjbect();
JsonObject object_in = object.get("key").getAsJsonObject();
String value = object_in.get("key").getAsString();
getAsString()獲取字符串的值
toString()獲取字符串
參考:
https://blog.csdn.net/niuba123456/article/details/100581376
https://blog.csdn.net/u014253011/article/details/101718137
還可以利用Gson提供的fromJson()方法來實現從Json相關對象到Java實體
import com.google.gson.Gson;
Gson gson = new Gson(); JsonObject object = gson.fromJson(response,JsonObject.class);
上述例子將Json字符串轉化為了JsonObject實體
也可以將Json字符串轉化為自己寫的類
參考文章:
https://www.cnblogs.com/reboost/p/9521711.html
https://blog.csdn.net/chenrenxiang/article/details/80291224
https://www.jb51.net/article/228962.htm
fastJson學習文檔:
https://www.cnblogs.com/ibigboy/p/11124524.html