Java+TestNG+HttpClient接口自动化测试框架
目录
- 1.HttpClient作用
- 2.测试框架搭建
-
- (1)JDK环境
- (2)TestNG引入
- (3)HttpClient引入
- 3.发送Get请求和post请求
-
- get请求:
- post请求
- 实际项目展示
- 4.发送post请求
-
- post请求封装
1.HttpClient作用
模拟客户端发送请求
2.测试框架搭建
(1)JDK环境
网上有很多
(2)TestNG引入
接口自动化入门-TestNg
(3)HttpClient引入
在maven项目的pom.xml中引入如下两个依赖
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.10</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version></dependency>
3.发送Get请求和post请求
如果post提交的是json类型数据,需要在pom.xml中添加依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency>
get请求:
// 准备urlString url="http://www.baidu.com";//请求方法
HttpGet get = new HttpGet(url);
//请求头get.setHeader("Authorization",tokenV);//准备一个发送请求的客户端CloseableHttpClient httpClient = HttpClients.createDefault();// 发送请求得到响应报文-java中封装为对象CloseableHttpResponse response = httpClient.execute(get);
post请求
String url="http://www.baidu.com";HttpPost post=new HttpPost(url);//添加请求头post.setHeader("Content-Type","application/json");//准备post参数
// -- 1-json类型JSONObject json = new JSONObject();json.put("username","admin");json.put("password","123456");System.out.println("请求参数:"+json);
// 发送 json 类型数据,通过new StringEntity(),可将Content-Type设置为text/plain类型post.setEntity(new StringEntity(json.toString(),"UTF-8"));//创建发请求的客户端CloseableHttpClient httpClient=HttpClients.createDefault();//获得响应内容CloseableHttpResponse response=httpClient.execute(post);
实际项目展示
import com.alibaba.fastjson.JSONObject;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
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.HttpHead;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
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.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;/* @author zhaomin* @date 2023/4/6 16:34*/
public class CategoriesTest {//URL会变、参数会变、请求头会变// @BeforeMethod@Test(dependsOnMethods = {"getToken"})public void getCategories() throws ClientProtocolException, IOException {// 请求UrlString url = "http://127.0.0.1:8888/api/private/v1/categories?type=1";Single token=Single.INSTANCE;String tokenV=token.getValue();
// 请求方法HttpGet get = new HttpGet(url);get.setHeader("Authorization",tokenV);
// 准备一个发送请求的客户端CloseableHttpClient httpClient = HttpClients.createDefault();
// 发送请求得到响应报文-java中封装为对象CloseableHttpResponse response = httpClient.execute(get);//状态行StatusLine statusLine = response.getStatusLine();
// 加断言-- todoSystem.out.println(statusLine.getReasonPhrase());System.out.println(statusLine.getStatusCode());System.out.println(statusLine.getProtocolVersion());
// 响应头Header[] headers = response.getAllHeaders();for (Header item : headers) {System.out.println(item);}
// 响应体HttpEntity entity = response.getEntity();String entityString = EntityUtils.toString(entity);
// 加断言-- todo
// System.out.println(entity);System.out.println(entityString);}@Testpublic void getToken() throws ClientProtocolException, IOException {String url="http://127.0.0.1:8888/api/private/v1/login";HttpPost post=new HttpPost(url);//添加请求头post.setHeader("Content-Type","application/json");
// post.setHeader("Content-Length","3843");//准备post参数
// -- 1-json类型JSONObject json = new JSONObject();json.put("username","admin");json.put("password","123456");System.out.println("请求参数:"+json);
// 发送 json 类型数据,通过new StringEntity(),可将Content-Type设置为text/plain类型post.setEntity(new StringEntity(json.toString(),"UTF-8"));//--2-准备普通类型参数/*List<NameValuePair> parameters=new ArrayList<NameValuePair>();parameters.add(new BasicNameValuePair("username","admin"));parameters.add(new BasicNameValuePair("password","123456"));HttpEntity requestEntity=new UrlEncodedFormEntity(parameters);post.setEntity(requestEntity);*///创建发请求的客户端CloseableHttpClient httpClient=HttpClients.createDefault();//获得响应内容CloseableHttpResponse response=httpClient.execute(post);StatusLine statusLine = response.getStatusLine();HttpEntity entity=response.getEntity();System.out.println(entity);String entityString=EntityUtils.toString(entity);JSONObject jsonObj=JSONObject.parseObject(entityString);String status=jsonObj.getJSONObject("meta").getString("status");Assert.assertEquals("200",status,"获取token失败");String tokenV=jsonObj.getJSONObject("data").getString("token");// entityString.enSingle token=Single.INSTANCE;token.setKey("token");token.setValue(tokenV);System.out.println(token.getKey());System.out.println(entityString);}}
4.发送post请求
import com.alibaba.fastjson.JSONObject;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
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.HttpHead;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
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.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;/* @author zhaomin* @date 2023/4/6 16:34*/
public class CategoriesTest {//URL会变、参数会变、请求头会变// @BeforeMethod@Test(dependsOnMethods = {"getToken"})public void getCategories() throws ClientProtocolException, IOException {// 请求UrlString url = "http://127.0.0.1:8888/api/private/v1/categories?type=1";Single token=Single.INSTANCE;String tokenV=token.getValue();
// 请求方法HttpGet get = new HttpGet(url);get.setHeader("Authorization",tokenV);
// 准备一个发送请求的客户端CloseableHttpClient httpClient = HttpClients.createDefault();
// 发送请求得到响应报文-java中封装为对象CloseableHttpResponse response = httpClient.execute(get);//状态行StatusLine statusLine = response.getStatusLine();
// 加断言-- todoSystem.out.println(statusLine.getReasonPhrase());System.out.println(statusLine.getStatusCode());System.out.println(statusLine.getProtocolVersion());
// 响应头Header[] headers = response.getAllHeaders();for (Header item : headers) {System.out.println(item);}
// 响应体HttpEntity entity = response.getEntity();String entityString = EntityUtils.toString(entity);
// 加断言-- todo
// System.out.println(entity);System.out.println(entityString);}@Testpublic void getToken() throws ClientProtocolException, IOException {String url="http://127.0.0.1:8888/api/private/v1/login";HttpPost post=new HttpPost(url);//添加请求头post.setHeader("Content-Type","application/json");
// post.setHeader("Content-Length","3843");//准备post参数
// -- 1-json类型JSONObject json = new JSONObject();json.put("username","admin");json.put("password","123456");System.out.println("请求参数:"+json);
// 发送 json 类型数据,通过new StringEntity(),可将Content-Type设置为text/plain类型post.setEntity(new StringEntity(json.toString(),"UTF-8"));//--2-准备普通类型参数/*List<NameValuePair> parameters=new ArrayList<NameValuePair>();parameters.add(new BasicNameValuePair("username","admin"));parameters.add(new BasicNameValuePair("password","123456"));HttpEntity requestEntity=new UrlEncodedFormEntity(parameters);post.setEntity(requestEntity);*///创建发请求的客户端CloseableHttpClient httpClient=HttpClients.createDefault();//获得响应内容CloseableHttpResponse response=httpClient.execute(post);StatusLine statusLine = response.getStatusLine();HttpEntity entity=response.getEntity();System.out.println(entity);String entityString=EntityUtils.toString(entity);JSONObject jsonObj=JSONObject.parseObject(entityString);String status=jsonObj.getJSONObject("meta").getString("status");Assert.assertEquals("200",status,"获取token失败");String tokenV=jsonObj.getJSONObject("data").getString("token");// entityString.enSingle token=Single.INSTANCE;token.setKey("token");token.setValue(tokenV);System.out.println(token.getKey());System.out.println(entityString);}}
post请求封装
如果有多个post请求时,不用每次都写重复。
@Testpublic String post(String url, HashMap<String,String> paramsMap)throws ClientProtocolException, IOException{HttpPost post=new HttpPost(url);//参数Set<String> keySet=paramsMap.keySet();JSONObject json = new JSONObject();for(String item:keySet){json.put(item,paramsMap.get(item));}// 发送 json 类型数据,通过new StringEntity(),可将Content-Type设置为text/plain类型post.setEntity(new StringEntity(json.toString(),"UTF-8"));CloseableHttpClient httpClient=HttpClients.createDefault();CloseableHttpResponse response=httpClient.execute(post);HttpEntity entity=response.getEntity();String entityString = EntityUtils.toString(entity);return entityString;}