精华内容
下载资源
问答
  • 第1章 接口自动化测试整体认知 了解什么是接口和为什么要做接口测试。并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程。 第2章 接口测试的用例设计 了解在接口测试中应该进行哪些测试,接口...

    第1章 接口自动化测试整体认知 了解什么是接口和为什么要做接口测试。并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程。 第2章 接口测试的用例设计 了解在接口测试中应该进行哪些测试,接口测试用例设计的原则,接口测试与功能测试有哪些异同点。 第3章 手工接口测试到自动化框架设计 了解手工接口测试该怎么做以及对接口测试框架有一个初步的、大框架的认知。 第4章 企业级代码管理工具git的应用 多人协同开发自动化测试脚本时,git将会是你代码管理的利器。了解为什么使用git?git仓库应该怎么样进行操作?如何使用git进行代码的版本管理?通过对git命令的学习,掌握如何进行多人协同开发。 第5章 测试框架TestNG 为什么要使用TestNG?TestNG在测试中到底有什么作用?什么是基本注解?基本注解该如何使用。 套件、忽略、异常、依赖、参数化、多线程、超时等测试都应该怎么进行? 第6章 测试报告 测试报告是最终劳动成果的展示,那么一个漂亮的测试报告无疑是一个加分项。那么本章的重点就是如何产出一个优雅漂亮的测试报告。 第7章 Mock接口框架的应用实战 测试工程师不仅仅只能做项目测试,还能做更多对项目有意义的事—Mock平台就是其中比较重要的一项。本章使用moco技术,搭建一个Mock平台,实现完全模拟。 第8章 http协议接口 http协议基础进阶;请求头、响应头字段含义的介绍;cookie与session有哪些区别。 第9章 测试框架HttpClient HttpClient框架的基本使用;如何使用代码获取到配置文件中的信息;结合Mock框架,使用HttpClient对cookies进行操作。 第10章 项目实战接口开发SpringBoot SpringBoot是本章需要学习的技术框架。学会使用SpringBoot开发Get以及Post方法接口,并且是否携带参数、如何返回cookies、如何验证cookies进行实战开发。结合SwaggerUI进行接口文档及测试页面的生成。 第11章 数据持久层框架MyBatis的应用 学会使用SpringBoot加上MyBatis,通过接口调用的方式实现对数据库的CRUD的操作。 第12章 MyBatis+MySQL实现用例管理 模拟用户管理系统场景对接口测试用例数据进行表结构设计; 学会使用TestNG+MySQL+MyBatis实现对用例数据的读取; 代码层次结构设计:cases、config、model、utils以及配置文件如何分工。 第13章 TestNg+MyBatis实现数据校验 开发用户管理系统五类接口(登陆、查看用户信息、获取用户列表、添加用户、更新与删除用户)。 完善自动化测试代码,实现使用HttpClient对接口进行测试,对响应数据及数据库用户数据进行校验。 使用Maven框架结合TestNG进行打包测试,最终产出测试报告。 ... 第14章 持续集成 搭建Jenkins环境,实现程序的自动部署、执行自动化测试。 第15章 课程总结 你是怎么做接口自动化测试的? 自动化测试框架设计详细讲解以及在企业中如何将接口自动化测试落地的执行过程

    下载地址:

    展开全文
  • (简单记录,有问题请指出)直接用java语言对接口进行测试有很多便利的地方,比如说复杂的参数、部署服务、扩展性等 下面我用两种方式简单列举下java直接往http接口发送参数,进行接口测试一、方式一,简单不规范此...

    (简单记录,有问题请指出)直接用java语言对接口进行测试有很多便利的地方,比如说复杂的参数化、部署服务、扩展性等   下面我用两种方式简单列举下java直接往http接口发送参数,进行接口测试

    一、方式一,简单不规范

    此方法比较原始,最开始摸索的时候弄出来的

    原理:

    1.首先使用URL类创建URL对象

    eb7a8dae74ce?from=singlemessage

    创建URL对象

    2.对指定url建立连接

    eb7a8dae74ce?from=singlemessage

    建立连接

    3.设置相关属性,如请求方式、编码、参数类型等   类似http请求头的属性(可以通过F12在浏览器中查看)

    4.创建输出流对象,并写入请求内容

    eb7a8dae74ce?from=singlemessage

    创建流对象

    5.创建输入流对象,并从字符输入流读取文本,缓冲字符

    eb7a8dae74ce?from=singlemessage

    6.再使用in.readLine()方法存储字符内容

    7.此时就得到了服务器响应数据,解析json验证参数即可

    代码截图/详解

    eb7a8dae74ce?from=singlemessage

    代码截图

    url = new URL(URL+"config/store/paymode/list");

    传入url,创建URL对象。上面是域名+路径

    URLConnection connection = url.openConnection();

    创建连接

    connection.setDoOutput(true);

    设置运行输入属性

    connection.setRequestProperty("contentType", "UTF-8");

    设置请求编码格式

    OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");

    创建OutputStreamWriter对象传输字节流。OutputStreamWriter 对象和getOutputStream方法介绍可以查jdk详解

    out.write("mcode="+Mocde()[0]+"&device_en="+Mocde()[1]);

    通过流对象,写入数据。这里参数格式类似web页面上get请求所带的参数

    out.flush(); //刷新流

    out.close();//关闭流

    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));

    创建输入流对象,并从字符输入流读取文本,缓冲字符

    String line = null;

    StringBuffer content= new StringBuffer();

    while((line = in.readLine()) != null)

    {

    //line为返回值,这就可以判断是否成功、

    content.append(line);

    }

    line参数用于临时存放返回的数据,content用于存放返回的全部数据,readLine方法表示读取一行数据。通过while循环读取数据,把一行数据存入line,再累加到content中,构成完整数据

    JSONObject object=(JSONObject) JSONObject.parse(content.toString());

    将返回值转换为JSONObject对象

    object.getIntValue("code")==0

    根据getIntValue方法参数名为code的值,并和做比较

    JSONArray objectArray=object.getJSONArray("data");

    将data节点的数据值转换为JSONArray 数组对象。后面在根据自己项目的业务逻辑判断值即可

    方法二、简单,比较规范

    此方法是在方法一的基础上进行了一些优化,应该也有不足之处,可以优化或者指出

    原理

    和方法一基本一致

    代码截图/详解

    eb7a8dae74ce?from=singlemessage

    图1

    eb7a8dae74ce?from=singlemessage

    图2

    用于存放服务端响应的数据,已转换为String类型的数据

    String result = "";

    //用于存放服务端响应的字节流数据

    BufferedReader reader = null;

    ./创建URL对象

    URL url = new URL(urlPath);

    //openConnection方法创建连接对象

    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

    //设置请求方式

    conn.setRequestMethod("POST");

    //设置为运行输入

    conn.setDoOutput(true);

    //设置为运行输出

    conn.setDoInput(true);

    ..........

    //把String类型的数据转换为byte数组类型

    byte[] writebytes = Json.getBytes();

    // 设置文件长度,避免后面数据写入输出流时内容长度不一致

    conn.setRequestProperty("Content-Length", String.valueOf(writebytes.length));

    //getOutputStream方法获头字段和内容

    OutputStream outwritestream = conn.getOutputStream();

    //将数据写入此输出流

    outwritestream.write(Json.getBytes());

    //判断响应的状态码是否是200,200表示正常响应

    conn.getResponseCode() == 200

    //创建输入流对象,并从字符输入流读取文本,缓冲字符

    reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));

    //获取数据

    reader.readLine();

    然后返回result,校验结果即可

    展开全文
  • GET请求(Maven)一、 src/main/java1、【地址--HOST】创建并设置配置文件(后缀名.properties的文本文件):存放接口请求的host地址2、【地址】TestBase.java类,所有接口请求测试的父类,写一个构造方法,实现加载读取...

    GET请求(Maven)

    一、 src/main/java

    1、【地址--HOST】创建并设置配置文件(后缀名.properties的文本文件):存放接口请求的host地址

    2、【地址】TestBase.java类,所有接口请求测试的父类,写一个构造方法,实现加载读取properties文件,配置文件的代码写在空参构造函数里,好处就是,每初始化这个类的对象就会执行构造函数的代码,即执行读取配置文件这么一个作用

    3、【请求方式】RestClient.java类,实现get请求的代码,和得到相应状态码和响应头信息,以及响应主体的json内容

    二、src/test/java

    1、【报告】测试类:GetApiTest.java类,测试上面的get请求

    其他大佬的实例

    1、前提条件:

    (1).本机环境安装了maven并配置环境变量,如果是idea不用安装,已经集成了

    (2).本机环境安装了idea软件

    (3).本机环境安装了Java jdk 8版本

    (4).本机需要能连接上互联网

    新建maven项目就不写了,前面ui自动化写过了

    2、添加必要的依赖包:httpclient、httpcore、Fastjson、Testng

    org.apache.httpcomponents

    httpclient

    4.5.6

    org.apache.httpcomponents

    httpcore

    4.4.10

    org.testng

    testng

    6.10

    com.alibaba

    fastjson

    1.2.29

    Httpcore主要是网络相关的组件,我们使用Http请求就需要网络相关底层方法。Testng主要是是一个单元测试框架,方便我们编写接口自动化用例。Fastjson是阿里巴巴的一个json的开源的组件,据说是最快的json的组件,主要用来json序列化和反序列操作。

    3、写一个get请求的例子

    (1)打开网站:https://reqres.in/,往下拉看到如图所示:

    06bca7e92661f59bb1b9caf9f3308e85.png

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

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

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

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

    有了这些信息我们可以在Jmeter或者postman上面来测试一下:

    de6655206ebe096463e584d2844b427e.png

    执行一下:

    6762daf52b4d6a63dc2372ab4815389e.png

    和网站图片上显示一样,说明测试通过了。

    (2)开始写代码:

    1)设计配置文件:在src/main/java下新建一个包:com.qa.config,然后在新包下新建一个config.properties文件,文件内容如下。

    5f546fe20e43c5cb13b9667f138cbcac.png

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

    package com.qa.base;

    import org.testng.TestException;

    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();

    }

    }

    //mian函数主要是为了检测user.dir目录是否正确,执行结果:E:\Java_project\MavenProject_script正是当前项目的目录

    public static void main(String[] args){

    System.out.println(System.getProperty("user.dir"));

    }

    }

    上面我们把加载配置文件的代码写在空参构造函数里,好处就是,每初始化这个类的对象就会执行构造函数的代码,即执行读取配置文件这么一个作用

    3)新建一个RestClient.java类,实现get请求的代码。在src/main/java下新建一个包:com.qa.restclient,最要实现:实现了get请求,和得到相应状态码和响应头信息,以及响应主体的json内容

    package com.qa.restclient;

    import com.alibaba.fastjson.JSON;

    import com.alibaba.fastjson.JSONObject;

    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 java.io.IOException;

    import java.util.HashMap;

    public class RestClient {

    //1. Get 请求方法

    public void get(String url) throws ClientProtocolException, IOException {

    //创建一个可关闭的HttpClient对象

    CloseableHttpClient httpclient= HttpClients.createDefault();

    //创建一个HttpGet的请求对象

    HttpGet httpget=new HttpGet(url);

    //执行请求,相当于jmeter上点击执行按钮,然后赋值给HttpResponse对象接收

    CloseableHttpResponse httpResponse=httpclient.execute(httpget);

    //拿到Http响应状态码,例如和200,404,500去比较

    int respinseStatusCode=httpResponse.getStatusLine().getStatusCode();

    System.out.println("response status code-->"+respinseStatusCode);

    //把响应内容存储在字符串对象

    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对象,通过jmeter可以看到请求响应头信息都是Key和value得形式,所以我们想起了HashMap

    HashMap hm=new HashMap();

    //增强for循环遍历headerArray数组,依次把元素添加到hashmap集合

    for(Header header:headerArray){

    hm.put(header.getName(),header.getValue());

    }

    //打印HashMap

    System.out.println("response headers-->"+hm);

    }

    }

    4)写一个测试类:GetApiTest.java类,在src/test/java下新建一个包:com.qa.tests。测试上面的get请求

    package com.qa.tests;

    import com.qa.base.TestBase;

    import com.qa.restclient.RestClient;

    import org.apache.http.client.ClientProtocolException;

    import org.testng.annotations.BeforeClass;

    import org.testng.annotations.Test;

    import java.io.IOException;

    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);

    }

    }

    运行结果:

    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=459a199309239559-NRT, Access-Control-Allow-Origin=*, ETag=W/"1bb-D+c3sZ5g5u/nmLPQRl1uVo2heAo", Connection=keep-alive, Set-Cookie=__cfduid=d746298a777ed31a0deaa8ed5264067471536836319; expires=Fri, 13-Sep-19 10:58:39 GMT; path=/; domain=.reqres.in; HttpOnly, Date=Thu, 13 Sep 2018 10:58:39 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"}

    请求成功,目前的目录如下 :

    6b0a46faf5c6cf5f1a0fa6ccdb3a2170.png

    展开全文
  • 文件:E:\最全面的Java接口自动化测试实战\project.zip E:\最全面的Java接口自动化测试实战\第10章 项目实战接口开发SpringBoot E:\最全面的Java接口自动化测试实战\第11...E:\最全面的Java接口自动化测试实战\课程代码
  • 框架原理:使用脚本发送HTTP请求返回接口的响应结果,并将代码存放在svn,Git中,jenkins可以设置测试的时间自动获取代码,编辑和运行。三.环境部署和安装:1.安装JDK1.8,配置相关的环境变量;2.安装eclipse;3.在...

    一.实现框架:

    java+maven+testng+reportNG+jenkins框架

    二.框架原理:

    使用脚本发送HTTP请求返回接口的响应结果,并将代码存放在svn,Git中,jenkins可以设置测试的时间自动获取代码,编辑和运行。

    三.环境部署和安装:

    1.安装JDK1.8,配置相关的环境变量;

    2.安装eclipse;

    3.在eclipse中安装maven,svn,testng插件;

    四.详细实现:

    1.详情:

    445c5d6950afe960c76faaa07dfe8d90.png

    2.封装http请求方法:

    package com.jdapi.util;

    /**

    * HttpRequest.java Created on

    * @author

    * @version 1.0

    * 封装GET,PUT,POST,Delete请求

    */

    import java.io.BufferedReader;

    import java.io.IOException;

    import java.io.InputStreamReader;

    import java.io.OutputStreamWriter;

    import java.net.HttpURLConnection;

    import java.net.URL;

    import java.util.Map;

    import java.util.Objects;

    import org.apache.log4j.Logger;

    import okhttp3.Headers;

    import okhttp3.MediaType;

    import okhttp3.OkHttpClient;

    import okhttp3.Request;

    import okhttp3.RequestBody;

    public class HttpRequest {

    private Logger logger = Logger.getLogger(this.getClass());

    /**

    * @param path

    * @param query

    * @param header

    * @param json

    * query拼接在请求地址后面,类似url?query1=value1&query2=value2

    * header为空则填null,不为空则直接调用getOfflineHeader方法

    * json参数从excel表格中获取json格式的字符串

    * @return

    * @throws IOException

    */

    public String sendPost(String path,Map query,Map header,String json) throws IOException{

    OkHttpClient client = new OkHttpClient();

    StringBuilder url = new StringBuilder(path);

    Request request = null;

    String result = "";

    if (Objects.nonNull(query) && Objects.nonNull(json) && Objects.isNull(header)) {

    url.append("?");

    query.forEach((k, v)->{

    url.append(k).append("=").append(v).append("&");

    });

    String temporaryUrl = url.substring(0,url.length()-1);

    url.setLength(0);

    url.append(temporaryUrl);

    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    request = new Request.Builder()

    .url(url.toString())

    .post(body)

    .build();

    result = client.newCall(request).execute().body().string();

    }

    if(Objects.nonNull(query) && Objects.isNull(header) && Objects.isNull(json)){

    BufferedReader in = null;

    OutputStreamWriter out = null;

    StringBuilder rs = new StringBuilder();

    StringBuilder realUrl = new StringBuilder(path);

    try {

    url.append("?");

    query.forEach((k, v)->{

    url.append(k).append("=").append(v).append("&");

    });

    String temporaryUrl = url.substring(0,url.length()-1);

    url.setLength(0);

    url.append(temporaryUrl);

    URL requestUrl = new URL(realUrl.toString());

    HttpURLConnection conn = (HttpURLConnection)requestUrl.openConnection();

    conn.setRequestMethod("POST");

    conn.setDoOutput(true);

    conn.setDoInput(true);

    //设置连接超时时间和读取超时时间

    conn.setConnectTimeout(10000);

    conn.setReadTimeout(10000);

    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    out = new OutputStreamWriter(conn.getOutputStream());

    out.flush();

    out.close();

    // 取得输入流,并使用Reader读取

    in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

    String line;

    while ((line = in.readLine()) != null) {

    rs.append(line);

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    //关闭输出流、输入流

    finally{

    try{

    if(out!=null){

    out.close();

    }

    if(in!=null){

    in.close();

    }

    }

    catch(IOException ex){

    ex.printStackTrace();

    }

    }

    result = rs.toString();

    }

    if(Objects.nonNull(query) && Objects.nonNull(json) && Objects.nonNull(header)){

    url.append("?");

    query.forEach((k, v)->{

    url.append(k).append("=").append(v).append("&");

    });

    String temporaryUrl = url.substring(0,url.length()-1);

    url.setLength(0);

    url.append(temporaryUrl);

    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    request = new Request.Builder()

    .url(url.toString())

    .headers(Headers.of(header))

    .post(body)

    .build();

    result = client.newCall(request).execute().body().string();

    }

    if(Objects.isNull(query) && Objects.nonNull(json) && Objects.nonNull(header)){

    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    request = new Request.Builder()

    .url(url.toString())

    .headers(Headers.of(header))

    .post(body)

    .build();

    return client.newCall(request).execute().body().string();

    }

    if(Objects.isNull(query) && Objects.nonNull(json) && Objects.isNull(header)){

    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    request = new Request.Builder()

    .url(url.toString())

    .post(body)

    .build();

    result = client.newCall(request).execute().body().string();

    }

    return result;

    }

    /**

    *

    * @param path

    * @param query

    * @param header

    * @param json

    * query拼接在请求地址后面,类似url?query1=value1&query2=value2

    * header为空则填null,不为空则直接调用getOfflineHeader方法

    * @return result 请求结果

    * @throws IOException

    */

    public String sendGet(String path,Map query,Map header,String json) throws IOException{

    OkHttpClient client = new OkHttpClient();

    StringBuilder url = new StringBuilder(path);

    String requestUrl = null;

    Request request = null;

    String result = null;

    if(Objects.nonNull(query) && Objects.isNull(header) && Objects.isNull(json)){

    url.append("?");

    query.forEach((k, v)->{

    url.append(k).append("=").append(v).append("&");

    });

    String temporaryUrl = url.substring(0,url.length()-1);

    url.setLength(0);

    url.append(temporaryUrl);

    if(url.toString().contains("\"\"")){

    requestUrl = url.toString().replace("\"\"", "");

    }else{

    requestUrl = url.toString();

    }

    request = new Request.Builder()

    .url(requestUrl)

    .build();

    result = client.newCall(request).execute().body().string();

    }

    if(Objects.nonNull(query) && Objects.nonNull(header) && Objects.nonNull(json)){

    url.append("?");

    query.forEach((k, v)->{

    url.append(k).append("=").append(v).append("&");

    });

    String temporaryUrl = url.substring(0,url.length()-1);

    url.setLength(0);

    url.append(temporaryUrl);

    if(url.toString().contains("\"\"")){

    requestUrl = url.toString().replace("\"\"", "");

    }else{

    requestUrl = url.toString();

    }

    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

    request = new Request.Builder()

    .url(requestUrl)

    .headers(Headers.of(header))

    .post(body)

    .build();

    result = client.newCall(request).execute().body().string();

    }

    return result;

    }

    /**

    * @param url

    * @param path

    * @param json

    * 请求地址:url/path1/path2,请求json字符串放在body中

    * @return result

    * @throws IOException

    */

    public String sendPut(String url,String[] path,String json) throws IOException{

    OkHttpClient client = new OkHttpClient();

    StringBuilder realUrl = new StringBuilder(url);

    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),"");

    //如果请求中带有query参数,则拼接在path后面

    if(Objects.nonNull(path)){

    for(int i=0;i

    realUrl.append("/").append(path[i]);

    }

    }

    logger.debug("实际请求地址是:"+realUrl.toString());

    Request request = new Request.Builder()

    .url(realUrl.toString())

    .put(body)

    .build();

    return client.newCall(request).execute().body().string();

    }

    /**

    * @param url

    * @param path

    * 请求地址:url/path1/path2

    * @return result

    * @throws IOException

    */

    public String sendDelete(String url,String[]path) throws IOException{

    OkHttpClient client = new OkHttpClient();

    StringBuilder realUrl = new StringBuilder(url);

    if(Objects.nonNull(path)){

    for(int i=0;i

    realUrl.append("/").append(path[i]);

    }

    }

    Request request = new Request.Builder()

    .url(realUrl.toString())

    .build();

    return client.newCall(request).execute().body().string();

    }

    public interface OnResponseCallback {

    void onResponse(String str);

    }

    public String sendPostWithUrlAndQuery(String path,Map query){

    BufferedReader in = null;

    OutputStreamWriter out = null;

    StringBuilder result = new StringBuilder();

    StringBuilder url = new StringBuilder(path);

    try {

    url.append("?");

    query.forEach((k, v)->{

    url.append(k).append("=").append(v).append("&");

    });

    String temporaryUrl = url.substring(0,url.length()-1);

    url.setLength(0);

    url.append(temporaryUrl);

    URL realUrl = new URL(url.toString());

    HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

    conn.setRequestMethod("POST");

    conn.setDoOutput(true);

    conn.setDoInput(true);

    //设置连接超时时间和读取超时时间

    conn.setConnectTimeout(10000);

    conn.setReadTimeout(10000);

    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    out = new OutputStreamWriter(conn.getOutputStream());

    out.flush();

    out.close();

    // 取得输入流,并使用Reader读取

    in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

    String line;

    while ((line = in.readLine()) != null) {

    result.append(line);

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    //关闭输出流、输入流

    finally{

    try{

    if(out!=null){

    out.close();

    }

    if(in!=null){

    in.close();

    }

    }

    catch(IOException ex){

    ex.printStackTrace();

    }

    }

    return result.toString();

    }

    }

    3.json解析:

    package com.jdapi.util;

    import java.util.Map;

    import org.apache.log4j.Logger;

    import com.google.gson.GsonBuilder;

    public class AnalyzeJson {

    private static Logger logger = Logger.getLogger(AnalyzeJson.class);

    /**

    * 封装了响应结果中带有list数组和data不同情况下

    * 取出return_msg字段值的方法

    * responseResult 是请求响应结果

    * dataType 表示return_data返回字段中是否包括数组,如果有数组则此参数传list,不包括数组则此参数传data,缺失data字段则传emptyData

    */

    public static String getresultmsg(String responseResult,String responseType){

    try{

    if(responseType.equals("list")){

    ListResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult,ListResponseResult.class);

    return resultObj.resultmsg();

    }else if(responseType.equals("data")){

    ResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult,ResponseResult.class);

    return resultObj.resultmsg();

    }

    }catch(Exception e){

    e.printStackTrace();

    logger.debug("响应结果类型传参有误,请输入list,data,emptyData中的一种类型");

    }

    return null;

    }

    /**

    * 根据接口请求返回数组分类,解析返回字段

    * @param responseResult

    * @param dataType

    * @param field

    * @return

    * @throws Exception

    */

    public static String getValue(String responseResult,String dataType,String field) throws Exception{

    try{

    if(responseResult.length() != 0){

    if(dataType.equals("list")){

    ListResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult,ListResponseResult.class);

    for(Map o : resultObj.getData()){

    return (String)o.get(field);

    }

    }else if(dataType.equals("data")){

    ResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult,ResponseResult.class);

    return resultObj.getData().get(field).toString();

    }

    }

    }catch(Exception e){

    e.printStackTrace();

    logger.debug("json字段类型传参有误,请输入list,data,或者null!");

    }

    return null;

    }

    /**

    * 判断return_data是否返回空数组,如果为空数组则返回true,不为空数组则返回false

    * @param responseResult

    * @param dataType

    * @return

    */

    public static boolean isReturnDataEmpty(String responseResult,String dataType){

    if(responseResult.length() != 0){

    if(dataType.equals("list")){

    ListResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult, ListResponseResult.class);

    if(resultObj.getData().toString().equals("[]")){

    return true;

    }

    return false;

    }else if(dataType.equals("data")){

    ResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult, ResponseResult.class);

    if(resultObj.getData().toString().equals("[]")){

    return true;

    }

    return false;

    }

    }

    return true;

    }

    }

    4.excel数据读取:

    package com.jdapi.util;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.IOException;

    import java.util.ArrayList;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import org.apache.poi.ss.usermodel.Cell;

    import org.apache.poi.ss.usermodel.DataFormatter;

    import org.apache.poi.ss.usermodel.DateUtil;

    import org.apache.poi.ss.usermodel.Row;

    import org.apache.poi.ss.usermodel.Sheet;

    import org.apache.poi.ss.usermodel.Workbook;

    import org.apache.poi.ss.usermodel.WorkbookFactory;

    public class ExcelReader {

    private String filePath;

    private String sheetName;

    private Workbook workBook;

    private Sheet sheet;

    private List columnHeaderList;

    private List> listData;

    private List> mapData;

    private boolean flag;

    public ExcelReader(String filePath, String sheetName) {

    this.filePath = filePath;

    this.sheetName = sheetName;

    this.flag = false;

    this.load();

    }

    private void load() {

    FileInputStream inStream = null;

    try {

    inStream = new FileInputStream(new File(filePath));

    workBook = WorkbookFactory.create(inStream);

    sheet = workBook.getSheet(sheetName);

    } catch (Exception e) {

    e.printStackTrace();

    }finally{

    try {

    if(inStream!=null){

    inStream.close();

    }

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    private String getCellValue(Cell cell) {

    String cellValue = "";

    DataFormatter formatter = new DataFormatter();

    if (cell != null) {

    switch (cell.getCellType()) {

    case Cell.CELL_TYPE_NUMERIC:

    if (DateUtil.isCellDateFormatted(cell)) {

    cellValue = formatter.formatCellValue(cell);

    } else {

    double value = cell.getNumericCellValue();

    int intValue = (int) value;

    cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);

    }

    break;

    case Cell.CELL_TYPE_STRING:

    cellValue = cell.getStringCellValue();

    break;

    case Cell.CELL_TYPE_BOOLEAN:

    cellValue = String.valueOf(cell.getBooleanCellValue());

    break;

    case Cell.CELL_TYPE_FORMULA:

    cellValue = String.valueOf(cell.getCellFormula());

    break;

    case Cell.CELL_TYPE_BLANK:

    cellValue = "";

    break;

    case Cell.CELL_TYPE_ERROR:

    cellValue = "";

    break;

    default:

    cellValue = cell.toString().trim();

    break;

    }

    }

    return cellValue.trim();

    }

    private void getSheetData() {

    listData = new ArrayList>();

    mapData = new ArrayList>();

    columnHeaderList = new ArrayList();

    int numOfRows = sheet.getLastRowNum() + 1;

    for (int i = 0; i < numOfRows; i++) {

    Row row = sheet.getRow(i);

    Map map = new HashMap();

    List list = new ArrayList();

    if (row != null) {

    for (int j = 0; j < row.getLastCellNum(); j++) {

    Cell cell = row.getCell(j);

    if (i == 0){

    columnHeaderList.add(getCellValue(cell));

    }

    else{

    map.put(columnHeaderList.get(j), this.getCellValue(cell));

    }

    list.add(this.getCellValue(cell));

    }

    }

    if (i > 0){

    mapData.add(map);

    }

    listData.add(list);

    }

    flag = true;

    }

    public String getCellData(int row, int col){

    if(row<=0 || col<=0){

    return null;

    }

    if(!flag){

    this.getSheetData();

    }

    if(listData.size()>=row && listData.get(row-1).size()>=col){

    return listData.get(row-1).get(col-1);

    }else{

    return null;

    }

    }

    public String getCellData(int row, String headerName){

    if(row<=0){

    return null;

    }

    if(!flag){

    this.getSheetData();

    }

    if(mapData.size()>=row && mapData.get(row-1).containsKey(headerName)){

    return mapData.get(row-1).get(headerName);

    }else{

    return null;

    }

    }

    public Map getQueryToMap(int row,String headerName){

    String result;

    String[] sourceStrArray;

    Map mp = new HashMap();

    if(row<=0){

    return null;

    }

    if(!flag){

    this.getSheetData();

    }

    if(mapData.size()>=row && mapData.get(row-1).containsKey(headerName)){

    result = mapData.get(row-1).get(headerName);

    sourceStrArray = result.split("&");

    if(sourceStrArray.length>=2){

    for(int i=0;i

    String[] ary = sourceStrArray[i].split("=");

    for(int j=1;j

    mp.put(ary[j-1],ary[ary.length-1]);

    }

    }

    }else{

    String[] ary = result.split("=");

    mp.put(ary[0], ary[ary.length-1]);

    }

    return mp;

    }else{

    return null;

    }

    }

    }

    5.excel数据:

    70c370e1cef04045af15272d79177577.png

    6.测试代码:

    package com.jdapi.testcase;

    import org.testng.annotations.Test;

    import com.jdapi.util.ExcelReader;

    import com.jdapi.util.AnalyzeJson;

    import com.jdapi.util.HttpRequest;

    import com.jdapi.util.Assertion;

    import org.apache.log4j.Logger;

    public class NewTest {

    private Logger logger = Logger.getLogger(this.getClass());

    private String excelPath = "D:\\testdata\\test.xlsx";

    private String sheet = "京东天气预报接口";

    ExcelReader excelReader = new ExcelReader(excelPath, sheet);

    HttpRequest httpRequest = new HttpRequest();

    AnalyzeJson analyzeJson = new AnalyzeJson();

    private String result = "";

    @Test

    public void test_NewTest() throws Exception

    {

    result = httpRequest.sendGet(excelReader.getCellData(1, "url"), excelReader.getQueryToMap(1, "query"),null, null);

    logger.info("接口响应结果:"+result);

    Assertion.verifyEquals(AnalyzeJson.getresultmsg(result, "data"),excelReader.getCellData(1, "expectedResult"));

    logger.info("实际结果是:"+AnalyzeJson.getresultmsg(result, "data"));

    logger.info("预期结果是:"+excelReader.getCellData(1, "expectedResult"));

    }

    }

    7.运行结果:

    14b51da4a81921a7b733b0037b6af9f7.png

    c9852e1a1c0323521384cd6e4f44d526.png

    总结:需要学习的知识点为java相关网络编程,例如http请求不同方法的封装,json的解析以及分层解析,连接数据库操作数据库,文件读取;基本功日志相关;

    其中个人认为在实现的过程中难点:

    1.json的解析尤其是遇到不同返回结果,多层实现的时候就比较困难;

    2.断言现在只是基本的实现和文件预期结果进行对比判断;

    3.请求头的封装;

    4.签名的封装;

    5.接口格式一定要完全统一;

    后期优化实现方向:

    1.json多层解析;

    2.断言数据库进行判断;

    3.报告优化;

    展开全文
  • 自动生成的测试报告集成至项目中,可直接通过项目访问测试报告(之前生成测试报告位于项目外,需要手动打开) 优化效果:2.增加邮件发送功能(定时任务触发用例后,生成的测试报告通过邮件发送)部分代码public class ...
  • 项目背景公司内部的软件采用B/S架构,目的是进行实验室的数据存储、分析、管理。大部分是数据的增删改查,但是由于还...工具选择针对接口测试的自动化工具也很多,例如Soup UI、Postman、robotframework,甚至jmete...
  • 在上篇文章,我们介绍了Get方法的设计过程和测试结果,现在我们需要对前面代码进行重构和修改,本篇需要完成以下目标。1)重构Get方法2)如何进行JSON解析3)使用TestNG方法进行测试断言1.重构Get方法在前面文章,说过...
  • java接口自动化需要导入依赖包Httpclient或者jsoup都可以。我这里以httpclient为例。话不多说上代码package com.ls;import java.io.FileWriter;import java.io.IOException;import java.sql.SQLException;import ...
  • java接口自动化.txt

    2020-02-18 18:38:24
    第01章 接口自动化测试整体认知 第02章 接口测试的用例设计 第03章 手工接口测试到自动化框架设计 第04章 企业级代码管理工具git的应用 第05章 测试框架TestNG 第06章 测试报告 第07章 Mock接口框架的应用实战...
  • 主要介绍了java接口自动化测试框架及断言详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 接口自动化代码.zip

    2020-01-14 13:26:42
    接口自动化 java框架编写 testng 等测试框架 jenkins 自动部署 自动构建
  • java接口自动化需要导入依赖包Httpclient或者jsoup都可以。我这里以httpclient为例。话不多说上代码package com.ls; import java.io.FileWriter; import java.io.IOException; import java.sql.SQLException; ...
  • 接口测试的时候,经常会遇到上一个接口的返回参数作为下一个接口的入参这种情况,本片介绍如何使用java代码处理这种情况 1.maven引入gson包,我第一次用的是2.8.6版本,new JsonParser().parse(s)总是报错,于是换...
  • (简单记录,有问题请指出)直接用java语言对接口进行测试有很多便利的地方,比如说复杂的参数、部署服务、扩展性等 下面我用两种方式简单列举下java直接往http接口发送参数,进行接口测试一、方式一,简单不规范...
  • 一、jdk安装2、下载后根据提示一步一步安装就行3、配置环境变量右击计算机→属性→高级系统设置→高级→环境变量(1)、新建JAVA_HOME变量JAVA_HOME=C:Program FilesJavajdk1.8.0_151; (你自己的JDK安装路径)(2)、新建...
  • 这是一个让你快速入手、快速入门的自动化工具jitest不只是能使用的接口自动化工具,这是一个让你可学习,可提升的工具。jitest分为v1.0,v2.0,v3.0 使用工具和复杂度不同,测试同学自由选择当前版本:v3.0使用技术:...
  • 主要介绍了Java接口自动化测试框架设计 Get请求方法和测试,框架设计我们只是介绍基本的组件,而且框架设计没有想象那么难,一步一步跟着做就会了。这篇我们来演示,如果通过Java代码来实现一个用纯代码实现Http中的...
  • (简单记录,有问题请指出)直接用java语言对接口进行测试有很多便利的地方,比如说复杂的参数、部署服务、扩展性等 下面我用两种方式简单列举下java直接往http接口发送参数,进行接口测试一、方式一,简单不规范此...
  • 前面一篇,我们介绍了Get方法的设计过程和测试结果,现在我们需要对前面代码进行重构和修改,本篇需要完成以下目标。1)重构Get方法2)如何进行JSON解析3)使用TestNG方法进行测试断言1.重构Get方法在前面文章,说过,...
  • 在上篇文章,我们介绍了Get方法的设计过程和测试结果,现在我们需要对前面代码进行重构和修改,本篇需要完成以下目标。1)重构Get方法2)如何进行JSON解析3)使用TestNG方法进行测试断言1.重构Get方法在前面文章,说过...
  • SprintBoot 自动化测试开发 数据持久层框架 MyBatis</a MyBatis+MySQL实现用例管理 TestNG+MyBatis实现数据校验 Jenkins持续集成 综述 需求阶段:项目立项、产品设计、需求文档 研发阶段:UI 设计、前端开发、后....
  • 1. pom.xml导入依赖包 <dependency> <groupId>javax.mail<...2. 邮件开启smtp服务,并复制授权码,注意代码中写的password不是密码而是授权码,本人的实现如下 package com.qa.com
  • 我来介绍通过代码逐步实现接口自动化测试框架的设计过程。先不要着急,框架设计我们只是介绍基本的组件,而且框架设计没有想象那么难,一步一步跟着做就会了。这篇我们来演示,如果通过Java代码来实现一个用纯代码...
  • 然后在src/main/java下新建一个包:com.qa.base,新建一个TestBase.java,这个类作为所有接口请求测试的父类,都需要继承这个父类,目前我们就写一个构造方法,实现加载读取properties文件。我们不想在代码里写死
  • 接口测试实践的记录在敏捷开发交付的流程中,自动化测试实际上被放在一个看起来挺重要的位置,而自动化测试中,接口测试是一个投入产出比比较高的一种自动化测试的形式,而我自己也做了一个这样的脚手架一样的东西...
  • 接口自动化框架项目说明本框架是一套基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport而设计的数据驱动接口自动化测试框架,TestNG 作为执行器,poi用于读取存放于excel的接口用例,jsonPath用于校验...
  • 接口自动化测试– Java+TestNG 测试 Restful Web Service关键词:基于Rest的Web服务,接口自动化测试,数据驱动测试,测试Restful Web Service, 数据分离,Java+Maven+TestNG本文主要介绍如何用Java针对Restful web...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,386
精华内容 554
关键字:

java接口自动化代码

java 订阅