Java語言搭建介面自動化框架學習八(鑑權)

愛學習的崽崽子發表於2020-12-01

3種常見的鑑權方式

1、cookie
2、session
3、token
3者的原理和區別需要查詢網路資料好好理解下

HttpUtils類修改抽取請求頭和返回響應body

前面的註冊和登入介面都是不需要有鑑權資訊就可以完成的介面測試,但是想充值、投資等需要有對應使用者登入成功前提下才能測試的介面,就需要考慮鑑權的處理。

示例背景以token為例子,token生成在登入響應報文中,以及充值介面請求頭需增加token值
產生2個問題:
1、需要獲取到登入響應報文中的token值
2、充值請求報文中報文頭增加token值

為解決以上2個問題,需要改造HttpUtils類,把請求頭從自定義的get、post方法中抽取出來,並且需要得到把請求的響應報文儲存起來

	// 設定請求頭
		public static void setHeaders(HttpRequest request,Map<String,String> headers)  {
			//得到所有的請求頭鍵值
			Set<String> keys = headers.keySet();
			//迴圈遍歷得到鍵值對應的values值
			for (String key : keys) {
				String value = headers.get(key);
				request.setHeader(key,value);
			}
		

		}

自定義的get、post、call方法修改入參,把請求頭作為入參傳入,並把返回值從void改為String型別,示例為get方法的程式碼修改,post和call方法類似

	// 傳送get請求方法,修改返回值為String和增加入參headers
	public static String get(String url,Map<String,String> headers) throws Exception {
		HttpGet get = new HttpGet(url);
		// 修改程式碼:呼叫新寫的setHeaders方法吧請求頭傳入
		setHeaders(get, headers);
		HttpClient httpClient = HttpClients.createDefault();
		HttpResponse httpResponse = httpClient.execute(get);
		//修改程式碼:獲取響應體作為返回值
		return returnResponseBody(httpResponse);

	}

新建EnvUtils類用來儲存環境變數

可以理解成一樣做介面測試的工具:postman裡的環境變數,設定成鍵值對的形式

public class EnvUtils {
	public static Map<String, String> env = new HashMap<String, String>();
}

case類修改

原有的登入和註冊案例類均需要修改@Test裡的程式碼,以LoginCase為例子

	@Test(dataProvider = "Datas")
	public void test(ApiInfo api, CaseInfo c) {
	//因為post方法中設定請求頭值的方法被抽取出來了,所以根據介面需要的情況設定,以Content-Type為例子
		Map<String, String> headers = new HashedMap<String, String>();
		headers.put("Content-Type", "application/json");
//call方法改造增加了返回值和請求頭入參
		String body = HttpUtils.call(api.getApiUrl(), api.getApiMethod(), c.getParams(), headers);		
		// fastjson裡的jsonpath從響應報文中提取token欄位值
		Object token = JSONPath.read(body, "$.data.token_info.token");
		if (token != null) {
			//如果token不為空,則把token值儲存到環境變數中,環境變數名為token
			EnvUtils.env.put("${token}", token.toString());
			//同時從登入響應報文中獲取充值介面需要的id值,程式碼寫法和token獲取一致省略程式碼
	
			}
		}
	}

新增RechargeCase類

public class RechargeCase {
	
	@Test(dataProvider = "Datas")
	public void test(ApiInfo api,CaseInfo c) {
		Map<String, String> headers = new HashedMap<String, String>();
		headers.put("Content-Type", "application/json");
		//從環境變數中獲取到登入介面儲存的token值
		String token = EnvUtils.env.get("${token}");
		//如果token不為空,則把token值放入請求頭的Authorization
		if(StringUtils.isNotBlank(token)) {
			headers.put("Authorization", "Bearer " + token);
		}		
		String body = HttpUtils.call(api.getApiUrl(),api.getApiMethod(),c.getParams(),headers);		
	}
	
	@DataProvider
	public Object[][] Datas(){
		//充值介面的在介面資訊excel裡的ApiId=3
		Object[][] datas = ExcelUtils.getApiAndCaseByApiId("3");
		return datas;
	}
}

修改excel,新增充值介面測試案例引數後,以testng執行檢查下是否可以充值成功
在這裡插入圖片描述

相關文章