最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java接口自動(dòng)化測試框架及斷言詳解

 更新時(shí)間:2019年07月04日 16:04:34   作者:huowufenghuang  
這篇文章主要介紹了java接口自動(dòng)化測試框架及斷言詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

上篇文章,我們介紹了Get方法的設(shè)計(jì)過程和測試結(jié)果,現(xiàn)在我們需要對前面代碼進(jìn)行重構(gòu)和修改,本篇需要完成以下目標(biāo)。

  • 1)重構(gòu)Get方法
  • 2)如何進(jìn)行JSON解析
  • 3)使用TestNG方法進(jìn)行測試斷言

1.重構(gòu)Get方法

在前面文章,說過,之前寫的Get方法比較繁瑣,不光寫了如何進(jìn)行Get請求,還寫了獲取http響應(yīng)狀態(tài)碼和JSON轉(zhuǎn)換?,F(xiàn)在我們需要抽取出來,設(shè)計(jì)Get請求方法,就只干一件事情,那就是如何發(fā)送get請求,其他的不要管。

我們知道,請求之后會(huì)返回一個(gè)HTTP的響應(yīng)對象,所以,我們把get方法的返回值類型改成了響應(yīng)對象,并帶上返回語句,重構(gòu)代碼之后,get方法代碼如下。

package com.qa.restclient;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class RestClient {
 //1. Get 請求方法
 public CloseableHttpResponse get(String url) throwsClientProtocolException, IOException {
  //創(chuàng)建一個(gè)可關(guān)閉的HttpClient對象
  CloseableHttpClienthttpclient = HttpClients.createDefault();
  //創(chuàng)建一個(gè)HttpGet的請求對象
  HttpGethttpget = newHttpGet(url);
  //執(zhí)行請求,相當(dāng)于postman上點(diǎn)擊發(fā)送按鈕,然后賦值給HttpResponse對象接收
  CloseableHttpResponsehttpResponse = httpclient.execute(httpget);
  return httpResponse;
 }
}

由于我們不想在代碼里寫死例如像HTTP響應(yīng)狀態(tài)碼200這樣的硬編碼,所以,這里我們在TestBase.java里把狀態(tài)碼給用常量寫出來,方便每一個(gè)TestNG測試用例去調(diào)用去斷言。

package com.qa.base;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class TestBase {
   public Properties prop;
   public int RESPNSE_STATUS_CODE_200 = 200;
   public int RESPNSE_STATUS_CODE_201 = 201;
   public int RESPNSE_STATUS_CODE_404 = 404;
   public int RESPNSE_STATUS_CODE_500 = 500;
   //寫一個(gè)構(gòu)造函數(shù)
   public TestBase() {
     try{
       prop= new Properties();
       FileInputStreamfis = new FileInputStream(System.getProperty("user.dir")+
"/src/main/java/com/qa/config/config.properties");
       prop.load(fis);
     }catch (FileNotFoundException e) {
       e.printStackTrace();
     }catch (IOException e) {
       e.printStackTrace();
     }
   }
}

現(xiàn)在我們的測試類代碼修改之后如下。

package com.qa.tests;
import java.io.IOException;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.methods.CloseableHttpResponse;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.qa.base.TestBase;
import com.qa.restclient.RestClient;
public class GetApiTest extends TestBase{
   TestBase testBase;
   String host;
   String url;
   RestClient restClient;
   CloseableHttpResponse closeableHttpResponse;
   @BeforeClass
   public void setUp() {
    testBase = new TestBase();
    host = prop.getProperty("HOST");
    url = host + "/api/users";   
   }
   @Test
   public void getAPITest() throws ClientProtocolException, IOException {
     restClient = new RestClient();
     closeableHttpResponse= restClient.get(url);
     //斷言狀態(tài)碼是不是200
     int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();
     Assert.assertEquals(statusCode,RESPNSE_STATUS_CODE_200, "response status code is not 200");
   }
}

測試運(yùn)行通過,沒毛病。

2.寫一個(gè)JSON解析的工具類

在上面部分,我們只是寫了執(zhí)行Get請求和狀態(tài)碼是否200的斷言。接下來,我們需要寫有一個(gè)JSON解析工具類,這樣就方便我們?nèi)son內(nèi)容的斷言。

下面這個(gè)JSON數(shù)據(jù)截圖

上面是一個(gè)標(biāo)準(zhǔn)的json的響應(yīng)內(nèi)容截圖,第一個(gè)紅圈”per_page”是一個(gè)json對象,我們可以根據(jù)”per_page”來找到對應(yīng)值是3,而第二個(gè)紅圈“data”是一個(gè)JSON數(shù)組,而不是對象,不能直接去拿到里面值,需要遍歷數(shù)組。

下面,我們寫一個(gè)JSON解析的工具方法類,如果是像第一個(gè)紅圈的JSON對象,我們直接返回對應(yīng)的值,如果是需要解析類似data數(shù)組里面的json對象的值,這里我們構(gòu)造方法默認(rèn)解析數(shù)組第一個(gè)元素的內(nèi)容。

在src/main/java下新建一個(gè)包:com.qa.util,然后在新包下創(chuàng)建一個(gè)TestUtil.java類。

package com.qa.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class TestUtil {
 /**
 *
 * @param responseJson ,這個(gè)變量是拿到響應(yīng)字符串通過json轉(zhuǎn)換成json對象
 * @param jpath,這個(gè)jpath指的是用戶想要查詢json對象的值的路徑寫法
 * jpath寫法舉例:1) per_page 2)data[1]/first_name ,data是一個(gè)json數(shù)組,[1]表示索引
 * /first_name 表示data數(shù)組下某一個(gè)元素下的json對象的名稱為first_name
 * @return,返回first_name這個(gè)json對象名稱對應(yīng)的值
 */
 //1 json解析方法
 public static String getValueByJPath(JSONObject responseJson, String jpath){
  Objectobj = responseJson;
  for(String s : jpath.split("/")) {
  if(!s.isEmpty()) {
   if(!(s.contains("[") || s.contains("]"))) {
    obj = ((JSONObject) obj).get(s);
   }else if(s.contains("[") || s.contains("]")) {
    obj =((JSONArray)((JSONObject)obj).get(s.split("\\[")[0])).get(Integer.parseInt(s.split("\\[")[1].replaceAll("]", "")));
   }
  }
  }
  return obj.toString();
 }
}

簡單解釋下上面的代碼,主要是查詢兩種json對象的的值,第一種最簡單的,這個(gè)json對象在整個(gè)json串的第一層,例如上面截圖中的per_page,這個(gè)per_page就是通過jpath這個(gè)參數(shù)傳入,返回的結(jié)果就是3. 第二種jpath的查詢,例如我想查詢data下第一個(gè)用戶信息里面的first_name的值,這個(gè)時(shí)候jpath的寫法就是data[0]/first_name,查詢結(jié)果應(yīng)該是Eve。

3.TestNG測試用例

下面,我們TestNG測試用例代碼如下

package com.qa.tests;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.qa.base.TestBase;
import com.qa.restclient.RestClient;
import com.qa.util.TestUtil;
public class GetApiTest extends TestBase{
	TestBase testBase;
	String host;
	String url;
	RestClient restClient;
	CloseableHttpResponse closeableHttpResponse;
	@BeforeClass
	public void setUp() {
		testBase = new TestBase();
		host = prop.getProperty("HOST");
		url = host + "/api/users?page=2";
	}
	@Test
	public void getAPITest() throws ClientProtocolException, IOException {
		restClient = new RestClient();
		closeableHttpResponse = restClient.get(url);
		//斷言狀態(tài)碼是不是200
		int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();
		Assert.assertEquals(statusCode, RESPNSE_STATUS_CODE_200, "response status code is not 200");
		//把響應(yīng)內(nèi)容存儲(chǔ)在字符串對象 
  String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(),"UTF-8"); 
  //創(chuàng)建Json對象,把上面字符串序列化成Json對象 
  JSONObject responseJson = JSON.parseObject(responseString); 
  //System.out.println("respon json from API-->" + responseJson); 
  //json內(nèi)容解析
  String s = TestUtil.getValueByJPath(responseJson,"data[0]/first_name");
  System.out.println(s);
	}	
}

運(yùn)行測試結(jié)果:

[RemoteTestNG] detected TestNGversion 6.14.3

Eve

PASSED: getAPITest

你還可以多寫幾個(gè)jpath來測試這個(gè)json解析工具類。

String s = TestUtil.getValueByJPath(responseJson,"data[1]/id");
String s = TestUtil.getValueByJPath(responseJson,"per_page");

4.TestNG自帶的測試斷言方法

這里簡單提一下TestNG的斷言方法,我們一般測試都需要寫斷言的代碼,否則這樣的單元測試代碼就沒有意義。下面,我在statusCode和json解析的first_name進(jìn)行斷言。

package com.qa.tests;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.qa.base.TestBase;
import com.qa.restclient.RestClient;
import com.qa.util.TestUtil;
public class GetApiTest extends TestBase{
	TestBase testBase;
	String host;
	String url;
	RestClient restClient;
	CloseableHttpResponse closeableHttpResponse;
	@BeforeClass
	public void setUp() {
		testBase = new TestBase();
		host = prop.getProperty("HOST");
		url = host + "/api/users?page=2";
	}
	@Test
	public void getAPITest() throws ClientProtocolException, IOException {
		restClient = new RestClient();
		closeableHttpResponse = restClient.get(url);
		//斷言狀態(tài)碼是不是200
		int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();
		Assert.assertEquals(statusCode, RESPNSE_STATUS_CODE_200, "response status code is not 200");
		//把響應(yīng)內(nèi)容存儲(chǔ)在字符串對象 
  String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(),"UTF-8"); 
  //創(chuàng)建Json對象,把上面字符串序列化成Json對象 
  JSONObject responseJson = JSON.parseObject(responseString); 
  //System.out.println("respon json from API-->" + responseJson); 
  //json內(nèi)容解析
  String s = TestUtil.getValueByJPath(responseJson,"data[0]/first_name");
  System.out.println(s);
  Assert.assertEquals(s, "Eve","first name is not Eve");
	}
}

經(jīng)常使用的測試斷言:

Assert.assertEquals(“現(xiàn)實(shí)結(jié)果”, "期待結(jié)果","斷言失敗時(shí)候打印日志消息");

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何用Java模擬XN*2圖靈機(jī)

    如何用Java模擬XN*2圖靈機(jī)

    這篇文章主要介紹了如何用Java模擬XN*2圖靈機(jī)方法,感興趣的朋友可以參考下
    2021-04-04
  • Spring @Transaction 注解執(zhí)行事務(wù)的流程

    Spring @Transaction 注解執(zhí)行事務(wù)的流程

    這篇文章主要介紹了Spring @Transaction 注解執(zhí)行事務(wù)的流程,Spring 是如何開啟事務(wù)的?又是如何進(jìn)行提交事務(wù)和關(guān)閉事務(wù)的,本文給大家詳細(xì)介紹,需要的朋友可以參考下
    2021-06-06
  • Java contains用法示例

    Java contains用法示例

    這篇文章主要介紹了Java contains的用法示例,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • mybatis自定義類型處理器的實(shí)現(xiàn)

    mybatis自定義類型處理器的實(shí)現(xiàn)

    在MyBatis使用中,有時(shí)需要對特定數(shù)據(jù)類型進(jìn)行定制處理,自定義類型處理器(TypeHandler)可以實(shí)現(xiàn)這一需求,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 詳解Spring Cloud Stream使用延遲消息實(shí)現(xiàn)定時(shí)任務(wù)(RabbitMQ)

    詳解Spring Cloud Stream使用延遲消息實(shí)現(xiàn)定時(shí)任務(wù)(RabbitMQ)

    這篇文章主要介紹了詳解Spring Cloud Stream使用延遲消息實(shí)現(xiàn)定時(shí)任務(wù)(RabbitMQ),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • 在Java和Java Web中放置圖片、視頻、音頻、圖像文件的方法

    在Java和Java Web中放置圖片、視頻、音頻、圖像文件的方法

    在Java軟件中放置圖片,通常涉及將圖片文件(如JPEG、PNG等)作為資源包含在我們的項(xiàng)目中,并在代碼中通過適當(dāng)?shù)姆绞揭眠@些資源,這可以通過多種方式實(shí)現(xiàn),但最常見的是在Java桌面應(yīng)用(如Swing或JavaFX)或Web應(yīng)用(如Servlet/JSP)中
    2024-11-11
  • SpringCloud?Feign請求頭刪除修改的操作代碼

    SpringCloud?Feign請求頭刪除修改的操作代碼

    這篇文章主要介紹了SpringCloud?Feign請求頭刪除修改,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Java中防止XSS攻擊的10種方法

    Java中防止XSS攻擊的10種方法

    這篇文章主要給大家介紹了關(guān)于Java中防止XSS攻擊的10種方法,XSS(Cross Site Scripting)攻擊是一種常見的網(wǎng)絡(luò)安全漏洞,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • windows下java環(huán)境變量的設(shè)置方法

    windows下java環(huán)境變量的設(shè)置方法

    在“系統(tǒng)變量”中,設(shè)置3項(xiàng)屬性,JAVA_HOME,PATH,CLASSPATH(大小寫無所謂),若已存在則點(diǎn)擊“編輯”,不存在則點(diǎn)擊“新建”
    2013-09-09
  • Java 將文件轉(zhuǎn)為字節(jié)數(shù)組知識(shí)總結(jié)及實(shí)例詳解

    Java 將文件轉(zhuǎn)為字節(jié)數(shù)組知識(shí)總結(jié)及實(shí)例詳解

    這篇文章主要介紹了Java 將文件轉(zhuǎn)為字節(jié)數(shù)組實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評論

乌苏市| 金沙县| 福鼎市| 紫金县| 金堂县| 山阳县| 兴文县| 吉林省| 大田县| 奉新县| 准格尔旗| 马鞍山市| 徐州市| 丰原市| 保康县| 宁国市| 上林县| 奉化市| 忻州市| 鄢陵县| 湛江市| 永吉县| 永城市| 太湖县| 扎鲁特旗| 洛川县| 青冈县| 洛川县| 格尔木市| 江津市| 图片| 分宜县| 安陆市| 罗田县| 遂平县| 桑植县| 九龙坡区| 固镇县| 通化市| 巴彦淖尔市| 金塔县|