4、接口測試自動化
接口自動化概述

HttpClient
HttpClient開發過程
創建Java工程
新建libs庫目錄
HttpClient 工具下載及引入
- https://hc.apache.org/index.html
- 工程中引入jar包
Get請求
HttpGet方法---發起Get請求
創建HttpClient對象
- ??? CloseableHttpClient httpclient = HttpClients.createDefault();
創建帶請求地址的HttpGet對象
- HttpGet httpGet = new HttpGet("http://xxxxxx");
- //ClassicHttpRequest get = ClassicRequestBuilder.get(url).build();
執行HttpGet請求,獲得響應
- client.execute(get, response -> {})
獲取響應實體
- HttpEntity entity = response.getEntity();
獲取響應內容
- EntityUtils.toString(entity);
斷開連接
- response.close();
- httpclient.close();
請求Header類型:Content-Type=application/json
skulist-1測試用例詳解
用例:獲取所有商品的sku列表成功
skulist-2測試用例詳解
用例:獲取goodsId=1的商品sku信息成功
skulist-3測試用例詳解
用例:獲取goodsId=2147483648的商品sku信息失敗
HttpGet用法總結
注意事項:
- 請求地址中有多個參數用&符號連接,例如http://aaaaa?id=1&name=tom
- 請求參數如包含非英文字符,需要encode轉碼
例如:
- URLEncoder.encode("{\"pId\":\"123456\"}", "UTF-8");
- String url3 = "http://localhost:8899/common/getTransportFee?id=1&addressDetail=";
- String ulr3Param = URLEncoder.encode("浙江省_杭州市_濱江區", "UTF-8");
POST
HTTP請求格式-POST方法
請求(Request)
請求行 | POST?/xinhu/index.php?a=check&m=login HTTP/1.1 |
請求頭 | Accept:text/html,application/xhtml+xml Accept-Encoding:?gzip,?deflate Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Connection:keep-alive Host:localhost:8032 |
請求正文 | adminuser=YWRtaW4%3A&=123456&rempass=0&button=&jmpass=false&device=1517376146707&adminpass=MTIzNDU2 |
響應(Response)
狀態行 | HTTP1.1?200?OK |
響應頭 | Connection:Keep-Alive Content-Encoding:gzip Content-Length:1234 Content-Type:text/html;charset=utf-8 Date:Mon,?05?Feb?2018?02:43:40?GMT |
響應正文 | {"success":true,"face":"http:\/\/localhost:8032\/xinhu\/upload\/face\/1.jpg"}?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? |
創建HttpClient對象
- ??? CloseableHttpClient? httpclient = HttpClients.createDefault();
創建帶請求地址的HttpPost 對象
- ??????? HttpPost httpPost = new HttpPost("https://www.xxx.com");
設置HttpPost對象Header屬性?? ?
- ???? httpPost.setHeader("Content-Type","application/json");
設置HttpPost 參數
- ??? StringEntity entity = new StringEntity("para","utf-8");
- ??? httpPost.setEntity(entity);
執行HttpPost請求,獲取post請求的響應
- ???? httpclient.execute(httpPost,resp ->{});
獲取響應實體
- ??? HttpEntity entity = response.getEntity();
獲取響應內容
- ??? EntityUtils.toString(entity);
斷開連接
- ??? response.close();
- ??? httpclient.close();
請求Header類型:Content-Type=application/json
login-1測試用例詳解
響應結果
{"message":"success","code":200}
HttpClient登錄模擬總結
注意事項:
- 根據具體登錄請求選擇HttpEntity具體類型(HttpEntity? ?的兩個實現類:?StringEntity和 UrlEncodedFormEntity)
- 登錄請求的Content-Type需要正確設置
- 如果不想使用同一個HttpClient對象傳遞登錄信息,可以考慮對需要登錄信息請求分別設置Cookie:
httpPost.setHeader("Cookie"," mindsparktb_232530392=true; mindsparktbsupport_232530392=true");
HttpClient設置代理
- HttpHost proxy = new HttpHost("127.0.0.1", 8888);
- CloseableHttpClient client = HttpClients.custom().setProxy(proxy).build();
引入測試框架
測試框架:TestNG
測試驗證點、用例集的組織、測試報告
TestNG簡介
- The next generation of unit testing
- Cedric Beust
- http://testng.org/doc/
- 基于Junit、Nunit并支持注解、數據驅動、多線程執行等特性的Java測試框架
TestNG基礎:注解(Annotation)
JDK5引入注解,TestNG用以方便的標注測試方法和組件
- @Test 標注測試方法
- @BeforeTest 標注全部測試方法執行前需要執行的方法
- @AfterClass 標注測試類全部方法執行之后需執行的方法
- @DataProvider 數據驅動
注意:TestNG執行測試方法之前,都會重新實例化測試類
TestNG基礎:斷言(Assert)
org.testng.Assert
- fail 直接失敗測試用例
- assertTrue??? 判斷是否為true
- assertNull??? 判斷是否為null
- assertEquals??? 判斷是否相等
TestNG基礎:Test屬性使用
TestNG基礎:@DataProvider
TestNG基礎:DataProvider屬性使用
- 使用數據驅動,復用測試方法
TestNG基礎:testng.xml用例集
- 指定測試類
TestNG自帶測試報告
TestNG+ReportNG報告
Allure--自動化測試報告生成
TestNG+FreeMarker測試報告
接口測試結果驗證
如何驗證
Java中解析常用的類庫有FastJson、JSON-Java、Gson等
解析JSON數據
- fastjson2-2.0.39.jar
驗證JSON數據正確
- TestNG、Assert
解析JSON
面向場景的接口自動化測試
用例回顧
用例步驟--登錄成功
用例步驟-查詢收貨地址
用例步驟-計算運費
用例步驟-提交訂單
場景測試總結
注意事項:
- 使用TestNG的BeforeClass和AfterClass去初始化和關閉HttpClient對象
- 使用dependsOnMethods屬性關聯場景的接口
注意事項:
- 根據具體場景分析關聯的接口,使用TestNG功能來安排用例執行順序
- 使用成員變量來傳遞接口返回數據
- 在不同的HttpClient中間顯示傳遞Cookie
返回Cookie
CookieStore cookie =new BasicCookieStore();
httpClient =HttpClients.custom().
setDefaultCookieStore(cookie).build();
設置Cookie
httpClient =HttpClients.custom().
setDefaultCookieStore(cookie).build();