一绅喉、接口的本質
接口就是一個函數(shù),通過將接口部署到web容器(tomcat捣卤,jboss屏箍,weblogic等),發(fā)布服務后嗤军,就可以通過一個url地址去訪問到接口了。而接口文檔里面描述的接口參數(shù)呢其實就是函數(shù)的參數(shù),接口的返回數(shù)據(jù)就是函數(shù)的返回值匙奴。即:接口=函數(shù),接口參數(shù)=函數(shù)參數(shù)妄荔,接口返回值=函數(shù)返回值泼菌。以如下接口項目中的“獲取用戶列表”接口為例,它其實就對應了后臺的一個這樣的一個同名函數(shù):
????/**
?* 獲取用戶列表
?*
?* @return
?*/
@RequestMapping
public@ResponseBodyResult list() {
????Result result =?null;
????try{
????????List<Member> members = memberService.list();
????????result =?newResult(true, Ret.MEMBER_LIST_SUCCESS.code(), members, Ret.MEMBER_LIST_SUCCESS.value());
????}?catch(Exception e) {
????????logger.error(e);
????????result =?newResult(false, Ret.MEMBER_LIST_FAIL.code(), Ret.MEMBER_LIST_FAIL.value());
????}
????returnresult;
}???????
二啦租、接口測試跟ui測試的本質區(qū)別
UI測試更專注于ui頁面哗伯,而不關注系統(tǒng)內部實現(xiàn),一個功能模塊是否有bug篷角,所有的判斷依據(jù)都直接來自于前端頁面反饋焊刹,跟我們的預期對比,一樣就測試通過恳蹲,不一樣就是bug虐块。而接口不一樣,需要借助某些客戶端工具模擬前端頁面發(fā)送接口請求阱缓,測試人員通過判斷接口返回數(shù)據(jù)與預期是否一致非凌,對測試人員的技術要求更高。
接口測試到底是在項目哪個階段去做荆针?
接口測試可以在項目的任意階段做敞嗡,只要接口已經(jīng)開發(fā)出來了,提前介入航背,就能提前發(fā)現(xiàn)問題喉悴,不管系統(tǒng)是不是已經(jīng)將頁面與后臺接口集成了,項目時間充足的前提下都最好對接口進行一輪或者多輪測試玖媚,基于兩點原因:1)某些請求如果繞過前端直接往接口發(fā)送非法數(shù)據(jù)箕肃,而接口也有相應處理措施,那么將最大限度的降低了系統(tǒng)的風險今魔;2)后端控制好了勺像,所有的問題就集中與前端這一塊了障贸。
手工測試接口有哪些工具:Postman,jmeter吟宦,Soapui篮洁,F(xiàn)iddler等主流的工具都能完成。
什么是接口自動化??通過代碼驅動測試而非人工殃姓。
為什么需要做接口自動化??通過機器來替代人工袁波,解放生產(chǎn)力。
如何做接口自動化??通過http技術處理接口調用蜗侈。
三篷牌、接口自動化環(huán)境如何搭建
1.創(chuàng)建maven項目,為什么用maven項目踏幻,最重要最直接的原因是希望maven來管理咱們的項目依賴枷颊,這樣我們就不需要滿世界的找各種jar包去下載了。
2.集成HttpClient叫倍,在maven項目引入HttpClient-4.5.2這個框架的依賴偷卧,這個框架提供了一些http技術可以幫助咱們去發(fā)起接口調用并處理接口返回數(shù)據(jù)豺瘤,以下是依賴描述吆倦。
<dependency>
????<groupId>org.apache.httpcomponents</groupId>
????<artifactId>httpclient</artifactId>
????<version>4.5.2</version>
</dependency>
3.集成testng,利用testng這個測試框架來幫助咱們來更好的管理測試類坐求,以及它提供了豐富的注解蚕泽,方便咱們去實現(xiàn)多場景測試設計。以下是依賴描述桥嗤。
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
<scope>test</scope>
</dependency>
4.至于項目的其他依賴在后面的接口自動化框架實現(xiàn)過程中再給大家補充须妻,本節(jié)只為實現(xiàn)一個最簡單的環(huán)境和一個接口調用案例。
小試牛刀:通過http技術post一次接口請求泛领,完成對于登錄接口(login)的調用荒吏,并得到接口返回數(shù)據(jù)。代碼如下:
packagecom.lemonban;
importjava.io.UnsupportedEncodingException;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.CloseableHttpResponse;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.client.utils.URLEncodedUtils;
importorg.apache.http.impl.client.CloseableHttpClient;
importorg.apache.http.impl.client.HttpClients;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
importorg.testng.annotations.Test;
publicclassHelloWorld {
????@Test
????publicvoidtest(){
????????String restUrl =?"http://116.23.246.159:8380/lmcanon/mvc/member/api/member/login";
????????//1.決定接口提交的方式(post/get)渊鞋,此處以post為例
????????HttpPost httpPost =?newHttpPost(restUrl);
????????//2.準備提交參數(shù)
????????List<NameValuePair> params =?newArrayList<NameValuePair>();
????????BasicNameValuePair basicNameValuePair1 =?newBasicNameValuePair("nickname",?"admin");
????????BasicNameValuePair basicNameValuePair2 =?newBasicNameValuePair("password",?"d5149ce361d6ee80eeccc260795eb1d1");
????????params.add(basicNameValuePair1);
????????params.add(basicNameValuePair2);
????????//3.參數(shù)封裝到請求體當中
????????try{
????????????httpPost.setEntity(newUrlEncodedFormEntity(params));
????????????//4.準備客戶端(HttpClient)
????????????CloseableHttpClient httpClient = HttpClients.createDefault();
????????????//5.提交請求
????????????CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
????????????String name = httpResponse.getFirstHeader("Set-Cookie").getName();
????????????String value = httpResponse.getFirstHeader("Set-Cookie").getValue();
????????????HttpUtils.addHeader(name, value);
????????????System.out.println("name="+name+",value="+value);
????????????//6.解析接口返回數(shù)據(jù)
????????????String result = EntityUtils.toString(httpResponse.getEntity());
????????????System.out.println("*********返回數(shù)據(jù):"+result);
????????}?catch(Exception e) {
????????????// TODO Auto-generated catch block
????????????e.printStackTrace();
????????}
????}
}
四绰更、代碼執(zhí)行結果
五、總結
以上代碼是一個簡單的案例锡宋,離我們的接口自動化框架還差十萬八千里儡湾。我們的最后的測試框架是針對于不同類型接口項目的自動化測試統(tǒng)一解決方案,因此兼容性执俩,復用性都要達到最大化徐钠,而這些都需要好的設計思想去支撐,以下為我們在實現(xiàn)這個測試框架中需要去逐步解決的幾個問題:創(chuàng)建了一個測試交流群役首,如果對軟件測試尝丐、接口測試显拜、自動化測試、面試經(jīng)驗交流感興趣可以加測試交流群:829792258爹袁,還會有同行一起技術交流