對於大多數未做過接口測試的同學來說,可能並不清楚接口到底是什么,甚至你去問很多做過接口測試的同學什么是接口,他們也說不出個所以然,大多數人可能知道接口大概是什么,也知道怎么測,但是不知道如何用專業的術語去描述出來。
接口的本質:接口就是一個函數,通過將接口部署到web容器(tomcat,jboss,weblogic等),發布服務后,就可以通過一個url地址去訪問到接口了。而接口文檔里面描述的接口參數呢其實就是函數的參數,接口的返回數據就是函數的返回值。即:接口=函數,接口參數=函數參數,接口返回值=函數返回值。以如下接口項目中的“獲取用戶列表”接口為例:(http://116.23.246.159:8380/futureloan/mvc/api/member/list),它其實就對應了后台的一個這樣的一個同名函數:
/**
* 獲取用戶列表
*
* @return
*/
@RequestMapping
public @ResponseBody Result list() {
Result result = null;
try {
List<Member> members = memberService.list();
result = new Result(true, Ret.MEMBER_LIST_SUCCESS.code(), members, Ret.MEMBER_LIST_SUCCESS.value());
} catch (Exception e) {
logger.error(e);
result = new Result(false, Ret.MEMBER_LIST_FAIL.code(), Ret.MEMBER_LIST_FAIL.value());
}
return result;
}
接口測試跟ui測試的本質區別:
UI測試更專注於ui頁面,而不關注系統內部實現,一個功能模塊是否有bug,所有的判斷依據都直接來自於前端頁面反饋,跟我們的預期對比,一樣就測試通過,不一樣就是bug。而接口不一樣,需要借助某些客戶端工具模擬前端頁面發送接口請求,測試人員通過判斷接口返回數據與預期是否一致,對測試人員的技術要求更高。
接口測試到底是在項目哪個階段去做?
接口測試可以在項目的任意階段做,只要接口已經開發出來了,提前介入,就能提前發現問題,不管系統是不是已經將頁面與后台接口集成了,項目時間充足的前提下都最好對接口進行一輪或者多輪測試,基於兩點原因:1)某些請求如果繞過前端直接往接口發送非法數據,而接口也有相應處理措施,那么將最大限度的降低了系統的風險;2)后端控制好了,所有的問題就集中與前端這一塊了。
手工測試接口有哪些工具:Postman,jmeter,Soapui,Fiddler等主流的工具都能完成。
什么是接口自動化? 通過代碼驅動測試而非人工。
為什么需要做接口自動化? 通過機器來替代人工,解放生產力。
如何做接口自動化? 通過http技術處理接口調用。
接口自動化環境如何搭建:
1.創建maven項目,為什么用maven項目,最重要最直接的原因是希望maven來管理咱們的項目依賴,這樣我們就不需要滿世界的找各種jar包去下載了。
2.集成HttpClient,在maven項目引入HttpClient-4.5.2這個框架的依賴,這個框架提供了一些http技術可以幫助咱們去發起接口調用並處理接口返回數據,以下是依賴描述。
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
3.集成testng,利用testng這個測試框架來幫助咱們來更好的管理測試類,以及它提供了豐富的注解,方便咱們去實現多場景測試設計。以下是依賴描述。
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
<scope>test</scope>
</dependency>
4.至於項目的其他依賴在后面的接口自動化框架實現過程中再給大家補充,本節只為實現一個最簡單的環境和一個接口調用案例。
小試牛刀:通過http技術post一次接口請求,完成對於登錄接口(login)的調用,並得到接口返回數據。代碼如下:
package com.lemonban;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.Test;
public class HelloWorld {
@Test
public void test(){
String restUrl = "http://116.23.246.159:8380/lmcanon/mvc/member/api/member/login";
//1.決定接口提交的方式(post/get),此處以post為例
HttpPost httpPost = new HttpPost(restUrl);
//2.准備提交參數
List<NameValuePair> params = new ArrayList<NameValuePair>();
BasicNameValuePair basicNameValuePair1 = new BasicNameValuePair("nickname", "admin");
BasicNameValuePair basicNameValuePair2 = new BasicNameValuePair("password", "d5149ce361d6ee80eeccc260795eb1d1");
params.add(basicNameValuePair1);
params.add(basicNameValuePair2);
//3.參數封裝到請求體當中
try {
httpPost.setEntity(new UrlEncodedFormEntity(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.解析接口返回數據
String result = EntityUtils.toString(httpResponse.getEntity());
System.out.println("*********返回數據:"+result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
代碼執行結果:

總結:以上代碼是一個簡單的案例,離我們的接口自動化框架還差十萬八千里。我們的最后的測試框架是針對於不同類型接口項目的自動化測試統一解決方案,因此兼容性,復用性都要達到最大化,而這些都需要好的設計思想去支撐,以下為我們在實現這個測試框架中需要去逐步解決的幾個問題:

下一篇專注於單接口測試到多接口的測試的過渡實現。大家敬請期待。
