精华内容
下载资源
问答
  • 接口自动化代码

    2019-01-29 08:12:41
    接口自动化代码:集成testng,mybatis,redis,用例层使用excel进行记录,涉及多个系统之间的交互。
  • 文件:E:\最全面的Java接口自动化测试实战\project.zip E:\最全面的Java接口自动化测试实战\第10章 项目实战接口开发SpringBoot E:\最全面的Java接口自动化测试实战\第11...E:\最全面的Java接口自动化测试实战\课程代码
  • 主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,需要有一定的JAVA知识(HTTP相关)。
  • 前面说过了,如果你稍微懂得TestNG这个单元测试框架,到目前这个简单的Java接口自动化测试框架主体的骨架部分已经完成设计并实现。这篇,继前篇的基础上,把测试用例中获取响应状态码和响应数据转换成JSON格式这些...

           前面说过了,如果你稍微懂得TestNG这个单元测试框架,到目前这个简单的Java接口自动化测试框架主体的骨架部分已经完成设计并实现。这篇,继前篇的基础上,把测试用例中获取响应状态码和响应数据转换成JSON格式这些经常重复的代码,给提取出来,构造成方法来调用。然后就是给这个框架添加一个日志输出功能,方便得到运行结果和运行出错的情况下的debug。

    1.添加log输出支持

    1.1 maven依赖引入

          这里,我试过apache log4j.jar 和slf4j.jar,由于log4j在maven项目上不能自动识别log4j.properties这个资源文件,最后我还是选择了maven引入slf4j.jar,在maven 配置文件pom.xml添加如下依赖,然后保存。

    <dependency>
    	<groupId>org.slf4j</groupId>
    	<artifactId>slf4j-log4j12</artifactId>
    	<version>1.7.2</version>
    </dependency>

    1.2 新建src/main/config资源包

          在Eclipse上点击当前项目名,右键new -source folder,输出src/main/config,点击确定,然后在src/main/config下新建一个log4j.properties文件,内容如下。

    ### set log levels ###
    log4j.rootLogger = INFO, stdout, file
    
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss SSS} %-5p %c{1}:%L - %m%n
    
    log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.file.File = ./log/apilog.log
    # overwirte the old log file
    log4j.appender.file.Append = false      
    ## 
    log4j.appender.file.Threshold = INFO
    log4j.appender.file.layout = org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss SSS} %-5p %c{1}:%L - %m%n
    
    

    1.3 在项目根目录下新建log文件夹

         新建这个文件夹是上面log4j.properties文件我们设置的日志保存文件路径是在./log文件夹下。大致的项目结构图如下

    2.优化RestClient.java内容

          主要是把在测试断言中经常需要拿到的响应状态码和json解析之前需要把响应内容转换成json格式,这部分内容给提取到方法里。然后我们写上log输出。(完整代码请看文件结尾处百度云链接)

    2.1.RestClient类添加日志输出和代码提取成方法

    package com.qa.restclient;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.http.ParseException;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpDelete;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.HttpPut;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    import org.apache.log4j.Logger;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    
    public class RestClient {
    	
    	final static Logger Log = Logger.getLogger(RestClient.class);
    	
    	/**
    	 * 不带请求头的get方法封装
    	 * @param url
    	 * @return 返回响应对象
    	 * @throws ClientProtocolException
    	 * @throws IOException
    	 */
    	public CloseableHttpResponse get (String url) throws ClientProtocolException, IOException {
    		
    		//创建一个可关闭的HttpClient对象
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		//创建一个HttpGet的请求对象
    		HttpGet httpget = new HttpGet(url);
    		//执行请求,相当于postman上点击发送按钮,然后赋值给HttpResponse对象接收
    		Log.info("开始发送get请求...");
    		CloseableHttpResponse httpResponse = httpclient.execute(httpget);
    		Log.info("发送请求成功!开始得到响应对象。");
    		return httpResponse;
    	}
    	
    	/**
    	 * 带请求头信息的get方法
    	 * @param url
    	 * @param headermap,键值对形式
    	 * @return 返回响应对象
    	 * @throws ClientProtocolException
    	 * @throws IOException
    	 */
    	public CloseableHttpResponse get (String url,HashMap<String,String> headermap) throws ClientProtocolException, IOException {
    			
    		//创建一个可关闭的HttpClient对象
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		//创建一个HttpGet的请求对象
    		HttpGet httpget = new HttpGet(url);
    		//加载请求头到httpget对象
    		for(Map.Entry<String, String> entry : headermap.entrySet()) {
    			httpget.addHeader(entry.getKey(), entry.getValue());
    		}
    		//执行请求,相当于postman上点击发送按钮,然后赋值给HttpResponse对象接收
    		CloseableHttpResponse httpResponse = httpclient.execute(httpget);
    		Log.info("开始发送带请求头的get请求...");	
    		return httpResponse;
    	}
    	
    	/**
    	 * 封装post方法
    	 * @param url
    	 * @param entityString,其实就是设置请求json参数
    	 * @param headermap,带请求头
    	 * @return 返回响应对象
    	 * @throws ClientProtocolException
    	 * @throws IOException
    	 */
    	public CloseableHttpResponse post (String url, String entityString, HashMap<String,String> headermap) throws ClientProtocolException, IOException {
    		//创建一个可关闭的HttpClient对象
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		//创建一个HttpPost的请求对象
    		HttpPost httppost = new HttpPost(url);
    		//设置payload
    		httppost.setEntity(new StringEntity(entityString));
    		
    		//加载请求头到httppost对象
    		for(Map.Entry<String, String> entry : headermap.entrySet()) {
    			httppost.addHeader(entry.getKey(), entry.getValue());
    		}
    		//发送post请求
    		CloseableHttpResponse httpResponse = httpclient.execute(httppost);
    		Log.info("开始发送post请求");
    		return httpResponse;
    	}
    	
    	/**
    	 * 封装 put请求方法,参数和post方法一样
    	 * @param url
    	 * @param entityString,这个主要是设置payload,一般来说就是json串
    	 * @param headerMap,带请求的头信息,格式是键值对,所以这里使用hashmap
    	 * @return 返回响应对象
    	 * @throws ClientProtocolException
    	 * @throws IOException
    	 */
    	public CloseableHttpResponse put (String url, String entityString, HashMap<String,String> headerMap) throws ClientProtocolException, IOException {
    		
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		HttpPut httpput = new HttpPut(url);
    		httpput.setEntity(new StringEntity(entityString));
    	
    		for(Map.Entry<String, String> entry : headerMap.entrySet()) {
    			httpput.addHeader(entry.getKey(), entry.getValue());
    		}
    		//发送put请求
    		CloseableHttpResponse httpResponse = httpclient.execute(httpput);
    		return httpResponse;
    	}
    	
    	/**
    	 * 封装 delete请求方法,参数和get方法一样
    	 * @param url, 接口url完整地址
    	 * @return,返回一个response对象,方便进行得到状态码和json解析动作
    	 * @throws ClientProtocolException
    	 * @throws IOException
    	 */
    	public CloseableHttpResponse delete (String url) throws ClientProtocolException, IOException {
    			
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		HttpDelete httpdel = new HttpDelete(url);
    		
    		//发送delete请求
    		CloseableHttpResponse httpResponse = httpclient.execute(httpdel);
    		return httpResponse;
    	}
    	
    	/**
    	 * 获取响应状态码,常用来和TestBase中定义的状态码常量去测试断言使用
    	 * @param response
    	 * @return 返回int类型状态码
    	 */
    	public int getStatusCode (CloseableHttpResponse response) {
    		
    		int statusCode = response.getStatusLine().getStatusCode();
    		Log.info("解析,得到响应状态码:"+ statusCode);
    		return statusCode;
    		
    	}
    	
    	/**
    	 * 
    	 * @param response, 任何请求返回返回的响应对象
    	 * @return, 返回响应体的json格式对象,方便接下来对JSON对象内容解析
    	 * 接下来,一般会继续调用TestUtil类下的json解析方法得到某一个json对象的值
    	 * @throws ParseException
    	 * @throws IOException
    	 */
    	public JSONObject getResponseJson (CloseableHttpResponse response) throws ParseException, IOException {
    		Log.info("得到响应对象的String格式");
    		String responseString = EntityUtils.toString(response.getEntity(),"UTF-8");
    		JSONObject responseJson = JSON.parseObject(responseString);
    		Log.info("返回响应内容的JSON格式");
    		return responseJson;
    	}
    }
    

    2.2 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.log4j.Logger;
    import org.testng.Assert;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.Test;
    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;
    	
    	final static Logger Log = Logger.getLogger(GetApiTest.class);
    	
    	@BeforeClass
    	public void setUp() {
    		
    		testBase = new TestBase();
    		//Log.info("测试服务器地址为:"+ host.toString());
    		host = prop.getProperty("HOST");
    		//Log.info("当前测试接口的完整地址为:"+url.toString());
    		url = host + "/api/users?page=2";
    		
    	}
    	
    	@Test
    	public void getAPITest() throws ClientProtocolException, IOException {
    		Log.info("开始执行用例...");
    		restClient = new RestClient();
    		closeableHttpResponse = restClient.get(url);
    		
    		//断言状态码是不是200
    		Log.info("测试响应状态码是否是200");
    		int statusCode = restClient.getStatusCode(closeableHttpResponse);
    		Assert.assertEquals(statusCode, RESPNSE_STATUS_CODE_200, "response status code is not 200");
    		
            JSONObject responseJson = restClient.getResponseJson(closeableHttpResponse);
            //System.out.println("respon json from API-->" + responseJson); 
            
            //json内容解析
            String s = TestUtil.getValueByJPath(responseJson,"data[0]/first_name");
            Log.info("执行JSON解析,解析的内容是 " + s);
            //System.out.println(s);
            Log.info("接口内容响应断言");
            Assert.assertEquals(s, "Eve","first name is not Eve");
            Log.info("用例执行结束...");
    	}
    	
    	
    }
    

         这里,我强调下,我在上面BeforeClass部分无法引入Log输出,上面代码我注销了日志打印,如果不注销,这块会报空指针异常,很奇怪,只有在@BeforeClass中报错,在@Test中没有,我花了一些时间,还是搞不懂这块,所以,就放弃在beforeclass部分添加日志输出。

    看看在./log/api.log的日志输出效果

    2018-05-26 17:39:21 864 INFO  TestBase:28 - 正在读取配置文件...
    2018-05-26 17:39:21 926 INFO  TestBase:28 - 正在读取配置文件...
    2018-05-26 17:39:21 943 INFO  GetApiTest:39 - 开始执行用例...
    2018-05-26 17:39:22 463 INFO  RestClient:41 - 开始发送get请求...
    2018-05-26 17:39:23 206 INFO  RestClient:43 - 发送请求成功!开始得到响应对象。
    2018-05-26 17:39:23 206 INFO  GetApiTest:44 - 测试响应状态码是否是200
    2018-05-26 17:39:23 207 INFO  RestClient:146 - 解析,得到响应状态码:200
    2018-05-26 17:39:23 209 INFO  RestClient:160 - 得到响应对象的String格式
    2018-05-26 17:39:23 297 INFO  RestClient:163 - 返回响应内容的JSON格式
    2018-05-26 17:39:23 299 INFO  GetApiTest:53 - 执行JSON解析,解析的内容是 Eve
    2018-05-26 17:39:23 299 INFO  GetApiTest:55 - 接口内容响应断言
    2018-05-26 17:39:23 300 INFO  GetApiTest:57 - 用例执行结束...
    

     

    说明:

     

          这个Java接口自动化测试框架,更适合于接口的单元测试。也就是说,写接口测试用例的人员必须会Java,必须掌握TestNG的基本使用。而且所有的接口测试用例都是以一个个不同TestNG类文件组成。所以,这个框架无法帮助黑盒测试人员完成接口自动化测试,只适合会写单元测试的自动化测试人员,依赖单元测试框架去管理和运行接口测试用例,拿到测试报告。当然,后续可以扩展支持Jenkins持续集成和测试。

          由于个人在大型项目接口自动化方面经验欠缺,只能完成目前这个简单的接口自动化测试框架。所以,这个接口自动化测试框架设计系列文章就先到这里结束。最后,贴出整个项目的完整源码,百度云链接,点击这里

    2018-08-21 更新

             QQ群有朋友,在这个接口自动化框架基础之上,优化了很多内容,有token传参,特别是报告这块,他还特意写了博客文章总结,非常感谢 “池同学”,大家请移步到他博客去看看改良的框架。博客文章地址:https://blog.csdn.net/qq_34693151

     

    展开全文
  • 使用Java编写第一个接口自动化程序

    千次阅读 2019-05-09 17:00:40
    从本质来说,我们通常使用的接口测试工具postman,fiddler或者一些其他的在线接口测试,等等都是由java写的,所以我们当然也可以用java来实现发包的过程 首先,我们可以看一下一个注册的接口(此接口是我部署在本地...

    最近很久没更新了,一直在看接口方面的东西,所以现在开始,准备更新了。

    从本质来说,我们通常使用的接口测试工具postman,fiddler或者一些其他的在线接口测试,等等都是由java写的,所以我们当然也可以用java来实现发包的过程

    首先,我们可以看一下一个注册的接口(此接口是我部署在本地的服务器上,如果你们用的话,可以使用你们公司的接口进行test)

    接口地址格式一般是这样的:http://主机地址:端口号/futuremery/mvc/api/模块/接口名

    http://localhost:8080/futuremery/mvc/api/member/register
    {"status":0,"code":"20103","data":null,"msg":"手机号不能为空"},可以看到如果我们不带请求参数的话,返回的值是显示手机号不能为空的,

    现在我们来用fiddler先测试一下已经被注册过的手机号再次注册返回的是什么

    好,可以看到显示的手机号码已被注册,那么我们现在就来模拟下fiddler发包,并且,拿到响应的数据信息

    这里的话我们提一下,用的是maven来管理项目,所以我们需要先配置下pom.xml,这里面我已经给大家准备好了

    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
    		<dependency>
    			<groupId>org.apache.httpcomponents</groupId>
    			<artifactId>httpclient</artifactId>
    			<version>4.5.2</version>
    		</dependency>

    下面先来看一下我们的代码

    package auto.api.test;
    
    import java.io.IOException;
    
    import org.apache.http.Header;
    import org.apache.http.ProtocolVersion;
    import org.apache.http.StatusLine;
    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;
    import org.apache.http.util.EntityUtils;
    
    
    public class ApiTest {
    		public static void main(String[] args) throws ClientProtocolException, IOException {
    			
    			//1.发包,准备url
    			String url = "http://localhost:8080/futuremery/mvc/api/member/register?mobilephone=13666666666&pwd=123456";
    			//2.设置请求方法
    			HttpGet get = new HttpGet(url);
    			//准备客户端
    			CloseableHttpClient httpClient = HttpClients.createDefault();
    			//发包
    			CloseableHttpResponse response = httpClient.execute(get);
    			//验证响应头信息  HTTP/1.1 200 OK 
    //			ProtocolVersion  httpVer = response.getProtocolVersion();
    			//验证响应头信息  HTTP/1.1 200 OK 
    			StatusLine  stateLine = response.getStatusLine();
    			 //获取协议版本
    			ProtocolVersion httpVersion = stateLine.getProtocolVersion();
    			System.out.println(httpVersion);
    			//获取状态码
    			int stateCode = stateLine.getStatusCode();
    			System.out.println( stateCode);
                            //遍历所有的头部信息
    			Header[]  allheaders =  response.getAllHeaders();
    			for (Header header : allheaders) {
    				System.out.println(header.getName() +":"+ header.getValue());
    			}		
    			System.out.println();
    			//响应体,toString方法可以将响应体转换成字符串
    			String entityStr =  EntityUtils.toString(response.getEntity());
    			System.out.println(entityStr);
    			
    		}
    }

    接着我们来看一下控制台的输出,和fiddler测试的结果一致,好的,这就是最简单的接口自动化测试了

    HTTP/1.1
    200
    Server:Apache-Coyote/1.1
    Content-Type:application/json;charset=UTF-8
    Transfer-Encoding:chunked
    Date:Thu, 09 May 2019 08:58:25 GMT
    
    {"status":0,"code":"20110","data":null,"msg":"手机号码已被注册"}

     

    展开全文
  • 个人觉得这个工具比任何自动化测试框架都好使,使用关键字和数据双驱动,不需要写一行代码,无需维护脚本,只需要维护用例数据。Web元素只需要在Chrome中复制xPath即可,定位非常高效。 工具安全无木马,目的只为...
  • 这个接口自动化测试框架到目前为止,我们已经完成了Get请求的封装和必要的工具类的支持。...所以,这个Java接口自动化测试框架的核心就是Get和POST请求方法的封装过程。 1.POST接口举例浏览器打开https://re...

           这个接口自动化测试框架到目前为止,我们已经完成了Get请求的封装和必要的工具类的支持。接下来这篇,我来介绍如何完成POST请求的封装过程。一般来说,在一个项目中,接口测试很多时候就是测试Get和POST方法,其他的请求方式的接口很少,占的比重几乎不计。所以,这个Java接口自动化测试框架的核心就是Get和POST请求方法的封装过程。

     

    1.POST接口举例

    浏览器打开https://reqres.in/,下拉一屏。点击第一个POST请求,这个接口的介绍信息如下。

          这个接口的作用是创建用户,参数是一个json类型的数据,一个name一个job,两个JSON对象。发送请求之后,返回的JSON数据有name和job和id,以及创建时间这几个数据。

     

    2.Postman手动实现

     

    我们先在本地postman环境,先来手动测试实现下这个post接口的请求过程。

    这个post接口请求还是比较简单,很容易在postman上实现该请求。

     

    3.Java代码自动化实现

     

           我们已经可以正确地在postman上实现创建用户这个接口的手动测试,那么我们想要这个过程自动化实现,如何做呢。下面我在RestClient.java封装了两个方法,一个是带请求头信息的Get请求,一个是带请求头信息的POST请求方法。这篇,了解了POST请求方法,带请求头的Get方法封装就很好理解。

    package com.qa.restclient;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.http.client.ClientProtocolException;
    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.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    
    public class RestClient {
        
        
        //1. Get 请求方法
        public CloseableHttpResponse get(String url) throws ClientProtocolException, IOException {
            
            //创建一个可关闭的HttpClient对象
            CloseableHttpClient httpclient = HttpClients.createDefault();
            //创建一个HttpGet的请求对象
            HttpGet httpget = new HttpGet(url);
            //执行请求,相当于postman上点击发送按钮,然后赋值给HttpResponse对象接收
            CloseableHttpResponse httpResponse = httpclient.execute(httpget);
            
            return httpResponse;
        }
        
        //2. Get 请求方法(带请求头信息)
        public CloseableHttpResponse get(String url,HashMap<String,String> headermap) throws ClientProtocolException, IOException {
                
            //创建一个可关闭的HttpClient对象
            CloseableHttpClient httpclient = HttpClients.createDefault();
            //创建一个HttpGet的请求对象
            HttpGet httpget = new HttpGet(url);
            //加载请求头到httpget对象
            for(Map.Entry<String, String> entry : headermap.entrySet()) {
                httpget.addHeader(entry.getKey(), entry.getValue());
            }
            //执行请求,相当于postman上点击发送按钮,然后赋值给HttpResponse对象接收
            CloseableHttpResponse httpResponse = httpclient.execute(httpget);
                
            return httpResponse;
        }
        
        //3. POST方法
        public CloseableHttpResponse post(String url, String entityString, HashMap<String,String> headermap) throws ClientProtocolException, IOException {
            //创建一个可关闭的HttpClient对象
            CloseableHttpClient httpclient = HttpClients.createDefault();
            //创建一个HttpPost的请求对象
            HttpPost httppost = new HttpPost(url);
            //设置payload
            httppost.setEntity(new StringEntity(entityString));
            
            //加载请求头到httppost对象
            for(Map.Entry<String, String> entry : headermap.entrySet()) {
                httppost.addHeader(entry.getKey(), entry.getValue());
            }
            //发送post请求
            CloseableHttpResponse httpResponse = httpclient.execute(httppost);
            return httpResponse;
        }
        
        
    }
    
    
    

          然后,我们需要写一个TestNG测试用例来测试下这个封装的post方法好不好用。由于我们去前面几篇文章介绍了TestNG测试get方法的代码,这里我们就直接拷贝和修改部分代码就行。

          在写测试用例之前,我们需要提前准备好json数据,一般来说,在Java中JSON数据都是放在JAVA Bean类中,通过JSON把高级对象序列化成JSON对象。

          在src/main/java中新建包:com.qa.data,然后新建一个Users.java,这个命名就参考接口的url单词就行。在postman或者网站该post方法,我们知道,需要name和job这两个json对象。我们新建一个bean类,同alt+shift+s,然后选择生成构造方法和set和get方法。

    package com.qa.data;
    
    public class Users {
    
    	private String name;
    	private String job;
    	
    	public Users() {
    		super();
    	}
    
    	public Users(String name, String job) {
    		super();
    		this.name = name;
    		this.job = job;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getJob() {
    		return job;
    	}
    
    	public void setJob(String job) {
    		this.job = job;
    	}
    	
    }
    

         好了,在src/test/java下的com.qa.tests我们新建一个POST测试用例,现在我们的TestNG测试类代码如下:

    package com.qa.tests;
    
    import java.io.IOException;
    import java.util.HashMap;
    
    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.data.Users;
    import com.qa.restclient.RestClient;
    import com.qa.util.TestUtil;
    
    public class PostApiTest 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 postApiTest() throws ClientProtocolException, IOException {
    		restClient = new RestClient();
    		//准备请求头信息
    		HashMap<String,String> headermap = new HashMap<String,String>();
    		headermap.put("Content-Type", "application/json"); //这个在postman中可以查询到
    		
    		//对象转换成Json字符串
    		Users user = new Users("Anthony","tester");
    		String userJsonString = JSON.toJSONString(user);
    		//System.out.println(userJsonString);
    		
    		closeableHttpResponse = restClient.post(url, userJsonString, headermap);
    		
    		//验证状态码是不是200
    		int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();
    		Assert.assertEquals(statusCode, RESPNSE_STATUS_CODE_201,"status code is not 201");
    		
    		//断言响应json内容中name和job是不是期待结果
    		String responseString = EntityUtils.toString(closeableHttpResponse.getEntity());
    		JSONObject responseJson = JSON.parseObject(responseString);
    		//System.out.println(responseString);
    		String name = TestUtil.getValueByJPath(responseJson, "name");
    		String job = TestUtil.getValueByJPath(responseJson, "job");
    		Assert.assertEquals(name, "Anthony","name is not same");
    		Assert.assertEquals(job, "tester","job is not same");
    		
    	}
    
    }
    

          建议,在写测试用例过程中,需要和postman上的请求结果参考,特别是Headers这里的键值对。这里留一个作业,上面我写了一个Get带请求头的封装方法,你可以对照postman中的请求头去写一个单元测试用例去测试下这个带headers的Get方法。

           目前,Java接口自动化测试框架的核心部分,http请求方法的封装已经完成。接下里还有测试日志,测试报告,或者其他需要抽取优化的模块去完成。




    展开全文
  • 凯撒加密解密程序 1个目标文件 1、程序结构,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...
  • Java接口自动化测试框架设计-2-Get请求方法和测试

    万次阅读 多人点赞 2018-05-22 00:11:42
    这篇开始,我来介绍通过代码逐步实现接口自动化测试框架的设计过程。先不要着急,框架设计我们只是介绍基本的组件,而且框架设计没有想象那么难,一步一步跟着做就会了。这篇我们来演示,如果通过Java代码来实现一个...

          这篇开始,我来介绍通过代码逐步实现接口自动化测试框架的设计过程。先不要着急,框架设计我们只是介绍基本的组件,而且框架设计没有想象那么难,一步一步跟着做就会了。这篇我们来演示,如果通过Java代码来实现一个用纯代码实现Http中的Get请求过程。

     

    1.Get请求API举例

          浏览器打开网址https://reqres.in,然后下拉一屏,我们就可以看到这个网站的API举例,我们来看看显示用户的get接口。


    通过这个图,我们能够获取这些信息

    1)网站host地址:https://reqres.in/

    2)用户展示请求方式是: Get

    3)接口的url 是: /api/users

    4)接口的响应状态码是200,还可以看到响应body的JSON内容。

     

           获取上面这些接口信息之后,我们在本地postman上来测试一下,如果没有postman请安装一个和postman差不多的能做接口手工测试的图形化界面工具,例如jmeter等。


          这个接口,我们通过postman手动测试,发现和网站提供的是一样结果,说明这get请求的接口测试通过。那么如果我们想通过Java代码实现,需要怎么做呢?接下来,才是本篇的重点内容。

     

    2.代码过程

          前面一篇文章,我们介绍了基础环境的搭建过程,这里,接着前面的环境来逐步完成一个Get请求的设计和测试过程。

    2.1 设计配置文件

          我们这个序列是要教会大家设计接口自动化测试框架的目的,所以我们一些设计和组织项目结构的方式,需要参考框架的思维。写一个配置文件,很简单,意义就是方便测试多套环境下的接口测试。我们工作中,一个项目,分测试环境,预发布环境和线上生产环境,这三套环境,接口肯定是一样,只不过服务器地址不同,所以,我们框架设计需要支持写一套接口测试用例,在三套环境上可以跑得同。

        在src/main/java下新建一个包:com.qa.config,然后在新包下新建一个config.properties文件,文件内容如下

          然后在src/main/java下新建一个包:com.qa.base,新建一个TestBase.java,这个类作为所有接口请求测试的父类,都需要继承这个父类,目前我们就写一个构造方法,实现加载读取properties文件。

    TestBase.java 代码如下:

    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 TestBase() {
    		
    		try {
    			prop = new Properties();
    			FileInputStream fis = 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();
    		}
    		
    	}
    	
    	
    }
    

          这里来复习下构造函数的作用,上面我们把加载配置文件的代码写在空参构造里,好处就是,每初始化这个类的对象就会执行构造函数的代码,即执行读取配置文件这么一个作用。关于上面配置文件路径是否拼接正确,你可以新建一个main方法的类,执行打印语句:System.out.println(System.getProperty("user.dir"));

    目前,项目结构图如下

    2.2 Get请求方法代码实现

          在src/main/java下新建一个包:com.qa.restclient,然后新建一个RestClient.java文件,下面是具体代码,实现了get请求,和得到相应状态码和响应头信息,以及响应主体的json内容。

    package com.qa.restclient;
    
    import java.io.IOException;
    import java.util.HashMap;
    import org.apache.http.Header;
    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;
    import org.apache.http.util.EntityUtils;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    
    public class RestClient {
    	
    	
    	//1. Get 请求方法
    	public void get(String url) throws ClientProtocolException, IOException {
    		
    		//创建一个可关闭的HttpClient对象
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		//创建一个HttpGet的请求对象
    		HttpGet httpget = new HttpGet(url);
    		//执行请求,相当于postman上点击发送按钮,然后赋值给HttpResponse对象接收
    		CloseableHttpResponse httpResponse = httpclient.execute(httpget);
    		
    		//拿到Http响应状态码,例如和200,404,500去比较
    		int responseStatusCode = httpResponse.getStatusLine().getStatusCode();
    		System.out.println("response status code -->"+responseStatusCode);
    		
    		//把响应内容存储在字符串对象
    		String responseString = EntityUtils.toString(httpResponse.getEntity(),"UTF-8");
    		
    		//创建Json对象,把上面字符串序列化成Json对象
    		JSONObject responseJson = JSON.parseObject(responseString);
    		System.out.println("respon json from API-->" + responseJson);
    		
    		//获取响应头信息,返回是一个数组
    		Header[] headerArray = httpResponse.getAllHeaders();
    		//创建一个hashmap对象,通过postman可以看到请求响应头信息都是Key和value得形式,所以我们想起了HashMap
    		HashMap<String, String> hm = new HashMap<String, String>();
    		//增强for循环遍历headerArray数组,依次把元素添加到hashmap集合
    		for(Header header : headerArray) {
    			hm.put(header.getName(), header.getValue());
    		}
    		
    		//打印hashmap
    		System.out.println("response headers -->"+ hm);
    		
    	}
    
    }
    

          上面的get方法代码写得比较乱,需要认真看注释,不然层次不清晰。这段代码肯定需要以后重构的,我们刚开始,方便我们测试就先这样去写就好。目前,项目结构图如下

    2.3 TestNG用例测试Get方法

          在src/test/java下新建一个包:com.qa.tests,然后新建一个GetApiTest.java类,写一个TestNG的测试用例来测试下我们上面写的Get请求方法。

    package com.qa.tests;
    
    import java.io.IOException;
    
    import org.apache.http.client.ClientProtocolException;
    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;
    	
    	
    	@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();
    		restClient.get(url);
    	}
    }
    

    选择run as testng,运行,输出结果如下:

    [RemoteTestNG] detected TestNG version 6.14.3
    response status code -->200
    respon json from API-->{"per_page":3,"total":12,"data":[{"last_name":"Bluth","id":1,"avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg","first_name":"George"},{"last_name":"Weaver","id":2,"avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg","first_name":"Janet"},{"last_name":"Wong","id":3,"avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg","first_name":"Emma"}],"page":1,"total_pages":4}
    response headers -->{Transfer-Encoding=chunked, Server=cloudflare, CF-RAY=41e822894b39336d-HKG, Access-Control-Allow-Origin=*, ETag=W/"1bb-D+c3sZ5g5u/nmLPQRl1uVo2heAo", Connection=keep-alive, Set-Cookie=__cfduid=d9d93dc43c046707f916670ef491f4c8e1526917157; expires=Tue, 21-May-19 15:39:17 GMT; path=/; domain=.reqres.in; HttpOnly, Date=Mon, 21 May 2018 15:39:17 GMT, Content-Type=application/json; charset=utf-8, X-Powered-By=Express, Expect-CT=max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"}
    PASSED: getAPITest
    

    接下来,我们把响应内容的的bodyjson内容拷贝到一个在线的Josn格式化显示网站(https://www.json.cn/),看看效果如下。

          这个结果和postman上一样,数据都对得上,本篇关于Java代码基于Httpclient开源库实现Get请求的过程就介绍到这里。




    展开全文
  • Java接口自动化测试框架学习(三)

    万次阅读 多人点赞 2018-09-14 16:53:32
    前面项目已创建好,依赖包添加完成,testng也已添加 项目结构如下: 1.设计配置文件 在src/main/java下新建一个包:...然后在src/main/java下新建一个包:com.qa.base,新建一个TestBase.java,这个...
  • 前言:目前Mock技术已经比较成熟,在日常的工作中Mock也可以给我们带来很大的遍历,本篇文章将会使用Moco框架,一步一步搭建一套Mock Server,使得接口自动化测试更加的提前,也能够使得前后端分离。 共识与痛点...
  • 1.pom中引入依赖 <dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>...2.测试代码 import org.apache.c
  • 使用TestNg的Report监听器,不嵌入具体执行代码,仅需在配置文件中新增监听器即可。 报告文件生成路径为test-output/index.html。(可在代码中修改) 一个suite且一个test配置的情况下,会将执行的用例(method)...
  • 这个接口自动化测试框架到目前为止,我们已经完成了Get请求的封装和必要的工具类的支持。...所以,这个Java接口自动化测试框架的核心就是Get和POST请求方法的封装过程。   1.POST接口举例 浏览器打开https://req...
  • 基于java接口自动化框架

    千次阅读 2018-03-07 16:53:11
    框架简介 APIAutoTest是处理API接口的轻量级自动化测试框架,Java语言实现,基于TestNG测试框架,支持持续集成,自动构建与测试。框架介绍数据驱动设计,使用TestNG中的@DataProvider读取Excel中存储的自动化测试...
  • 手把手教你搭建java接口自动化测试框架(三):基础代码填充 手把手教你搭建java接口自动化测试框架(三):基础代码填充 base包下新建TestBase.java package com.qa.base; import java.io.FileInputStream; ...
  • Java+TestNG接口自动化入门详解

    万次阅读 多人点赞 2019-07-16 18:40:11
    Java+TestNG接口自动化入门详解 一、环境准备:(根据自己电脑配置来选择安装版本,我的电脑是64位,所以此处选择64位安装) 1、JDK下载: 官网下载地址:...
  • java接口自动化1——一个get请求

    千次阅读 2018-09-13 19:03:07
    1、前提条件: (1).本机环境安装了maven并配置环境变量,如果是idea不用安装,已经...新建maven项目就不写了,前面ui自动化写过了 2、添加必要的依赖包:httpclient、httpcore、Fastjson、Testng &lt;...
  • 接口自动化思路_JAVA

    万次阅读 多人点赞 2015-05-26 15:24:16
    写在开头: 技术渣做接口自动化,大神们请轻喷!多提提优化方案和问题点。 以前做接口测试一直通过postman 和 soapUI来做,Postman 是Chrome的一个插件Case多了不好管理,同时执行起来麻烦,得一个一个去点击执行,...
  • 最近比较忙,在抽时间写练习的demo及优化,请大家耐心等待 ...不需要写代码自动化框架 自动化测试框架: JMeter + Ant + Jenkins【 windows 版】:https://www.cnblogs.com/UncleYong/p/10739519.html...
  • JUnit是一个开发源代码Java测试框架,用于编写和运行可重复的测试。...此时可以考虑做成自动化(在版本迭代较快,主要功能基本不变化的接口适用)eclipse中使用JUnit(JUnit3)之前本人测试使用JUnit3,
  • 1、服务启动脚本中加入javaagent JACOCO_OPTS=" -javaagent:/jacoco/lib/jacocoagent.jar=includes=com.uinnova.*,output=tcpserver,port=6000,address=192.168.1.1" 如果要累计加入参数: ,append=true nohup ...
  • java实现自动化测试接口访问(一)

    千次阅读 2017-12-25 14:15:57
    一、前置准备: PostMan 访问的网站:Github 访问的接口: ...实现访问:查找2017-11-27到 2017-12-01的100条数据 二、代码实现 1. 使用PostMan输入访问的接口
  • 一般token会在登录接口返回结果中呈现,从代码层面获取token的方式有很多种,我是使用jsonpath这个json路径语言去匹配token所在路径的key值 我将获取jsonpath写成一个静态方法放在testUtil里面,将jsonpath路径写...
  • 手把手教你搭建java接口自动化测试框架(四):get、post方法实现 看完了三篇 各种配置、代码 到这一篇终于可以进行实战了 是骡子是马拉出来溜溜( •̀ ω •́ )✧ 执行get请求 tests包下新建GetTest01.java ...
  • 1.1:Mock模拟一个Post接口 [ { "description":"这是Mock接口,带Header和参数的Demo", "request":{ "uri":"/PostDemo/withHeaders", "method":"post" }, "response":{ "json":...
  • 接着上面一篇,这篇来封装下PUT和Delete方法。...由于弄明白了前面的Get和Post方法封装过程,现在就直接贴出封装方法和测试代码。 1.PUT和Deletet方法 package com.qa.restclient; import java.io.IOExcepti...
  • 接口自动化测试方法

    千次阅读 2019-01-24 23:11:34
    而具有一些经验的测试人员,则会非常慎重的对待UI自动化,他们会更加倾向于接口自动化测试。究其缘由,主要是因为UI自动化通常成本较高,后期维护更加苦不堪言;而接口测试则相对轻量级一些,它是介于UI自动化和单元...
  • java接口的初始

    千次阅读 2018-10-06 12:04:27
    真正不同的地方在于第三点,类的初始执行之前要求父类全部都初始完成了,但接口的初始貌似对父接口的初始不怎么感冒。 也就是说,子接口初始的时候并不要求其父接口也完成初始,只有在真正使用到父接口...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 487,566
精华内容 195,026
关键字:

java接口自动化代码

java 订阅