介面自動化測試之rest-assured實戰
1.準備工作:
IntelliJ IDEA JDK 1.8.0 i)ii)
Json格式化工具:JSONHandler
Java+maven+TestNG+junit+rest-assured
抓包:charles
請求工具:postman
2.為什麼要進行介面測試?
介面測試主要用於檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換,傳遞和控制管理過程,以及系統間的相互邏輯依賴關係等介面測試相對容易實現自動化持續集成,且相對UI自動化也比較穩定,可以減少人工回歸測試人力成本與時間,縮短測試周期,支持後端快速發版需求。
3.測試流程:
a.需求分析
b.根據需求梳理介面測試點(評估測試周期)
c.檢查服務端介面入參和實參是否缺少參數(如果不正確需要服務端矯正)
d.進行介面測試(實際驗證點1.介面的業務邏輯json解析,2.欄位類型 )
e.介面測試報告輸出)
4.介面自動化目前試用的場景
(1)測試前置、開發自測:一個新的自動化介面測試案例開發完成後,直接發給介面對應的開發,安排在開發本地環境執行,一旦開發確認完成介面開發,就開始執行介面測試案例,基本上可以實時拿到測試結果,方便開發快速做出判斷
(2)回歸測試:開發本地測試通過後,或整個需求手工測試通過後,把自動化的介面測試案例做分類整理,挑選出需要納入到回歸測試中的案例,在持續集成環境重新準備測試數據,並把案例納入到持續集成的job中來,這些用於回歸的介面測試案例需要配置到持續集成平台自動運行tesNGt報告已釘釘方式通知。
5.maven環境變數配置
去官網下載maven安裝包後解壓縮即可。
MAVEN_HOME
F:SoftsJavaapache-maven-3.5.0
Path
%MAVEN_HOME%in;
6.搭建環境:
1首先安裝JDK 1.6以上,intellijIDEA,創建Maven工程New->NewProject->Maven->
勾選create from archetype
輸入項目名稱下一步下一步完成如下圖所示,一個完整的maven項目如圖所示目錄結構!
接下需要project配置File->projectStructure
Modeules導入項目模塊:importmodeules-選擇項目pom.xml
c.使用rest-assured之前必須pom.xml中引入jar包
<!--Restassured依賴包-->
<dependency> <groupId>io.rest-assured</groupId> <artifactId>json-schema-validator</artifactId> <version>3.0.1</version></dependency><dependency> <groupId>io.rest-assured</groupId> <artifactId>spring-mock-mvc</artifactId> <version>3.0.1</version></dependency><dependency> <groupId>com.jayway.restassured</groupId> <artifactId>rest-assured</artifactId> <version>2.3.3</version> <scope>test</scope></dependency>
<!—junitjra包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency>
<!—列印日誌依賴包-->
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency>
<!—生成testng報告依賴包-->
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.8</version> <scope>test</scope></dependency>
<!—默認的jdk版本來進行處理,這樣就容易出現版本不匹配的問題,以至於可能導致編譯不通過的問題.例如代碼中要是使用上了jdk1.7的新特性,但是maven在編譯的時候使用的是jdk1.6的版本,那這一段代碼是完全不可能編譯成.class文件的-->
<plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration></plugin>
<!—dns實現更換測試環境jar-->
<dependency> <groupId>io.leopard</groupId> <artifactId>javahost</artifactId> <version>0.3</version></dependency>
Maven-reimport
6.1在 View 菜單中勾選【Toolbar】、【Tool Buttons】、【Status Bar】、【Navigation Bar】
6.2開啟第一個rest-assuredDemo實現之前我們先了解一下rest-assured方法:
a.response常用方法:
response.asString()--獲取請求返回內容體
response.getContentType()--獲取響應的內容類型
response.getStatusCode()--獲取響應的狀態代碼
response.getHeaders()--獲取所有響應頭信息
response.getHeader(String name)-- 根據指定的header名稱,獲取對應的響應信息
response.getCookie(Stringname)-- 根據指定的cookie名稱,獲取對應cookie的值
response.getCookies()--獲取所有cookies信息
response.getTime()--響應時間(單位:毫秒)
b.獲取節點一些節點驗證方法:
1.response.then().body("returncode",equalTo(0));--returncode是否等於0
2.response.getBody().prettyPrint();//格式化列印JSON數據
3.given().param("p1","0").param("p2","1").get("http://www.baidu.com");-URL參數化(拼接成http://www.baidu.com/p1=0&p2=1);
4.when().get("http://www.baidu.com/p1=0&p2=1").then().time(lessThan(100L),TimeUnit.MILLISECONDS);//判斷響應時間是否少於預期值。
5.assured斷言數據處理:get("/lotto").then().body("lotto.lottoId",equalTo(5)); 這個判斷lotto下面的lotto.lottoId節點是否是5
Assert.assertEquals(bmessage, "寶馬X5經銷商");---預期和實際值是否一致
get("/lotto").then().body("lotto.winners.winnerId",hasItems(23, 54));
/lotto下面lotto.winners.winnerId值是否包含23,54
6.given().param("name","clq").then().statusCode(200).body("id",equalTo(2),"content", containsString("Hello").when().get("/greeting");
(參數name,當我發送get請求之後,那麼你給我返迴響應碼200,並且id=2,content為hello)。
7.rdposturl.startsWith("https://rdx")-確定此字元串實例的開頭是否與指定的字元串匹配.
8.rdposturl.endsWith(".jpg")-確定此字元串實例的末尾是否是.jpg圖片
9.JsonPath yloan =get(yurl).getBody().jsonPath().setRoot("result");-獲取整個節點的數據
10.response.getBody().jsonPath().getString("returncode")--獲取某一個節點的值(如:return code)
11.get(url).then().assertThat().statusCode(200);--判斷url返回的code碼是否為200等等
12. Assert.assertNotNull(res.getBody().jsonPath().getString("result.orderguid"));Assert.assertNotNull(res.getBody().jsonPath().get("result.orderno"));
(/以上兩個是判斷斷言下面值不能為空)
13.privateLogger logger =LoggerFactory.getLogger(AskDealersPricePvid.class);--列印錯誤log日誌方法
14.List<String>titles = jsonPath.getList("topics.title")-獲取所有列表標題信息;
Get方法:@Testpublic void test() throws IOException { String url = "https://www.event.com/Info/Supplier.do"; ValidatableResponse response = get(url).then(); response.assertThat().body(matchesJsonSchemaInClasspath("yBn.json"));;}
post方法:
@Testpublic void testLogin() throws Exception { ValidatableResponse res = given().queryParam("loginSource", "4") .queryParam("username", "123456") .queryParam("password", "111000").when().post("https://www.vent.com/login.do").then();res.assertThat().statusCode(200);
推薦閱讀:
※Appium Android Ui自動化環境搭建及使用實戰
※如何來快速定位啟動時間中的異常方法(Android版)
TAG:android自動化測試 | 自動化測試 | 軟體測試和開發 |