精华内容
下载资源
问答
  • java接口测试

    千次阅读 2017-11-14 10:30:55
    第一次做接口测试,网上找了很久,找不到想要的,只能自己摸索写了测试代码T.T ApiRequestUtil.javapackage com.util.api;import java.io.BufferedReader; import java.io.IOException; import java.io....

    第一次做接口测试,网上找了很久,找不到想要的,只能自己摸索写了测试代码T.T
    ApiRequestUtil.java

    package com.util.api;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    import net.sf.json.JSONObject;
    
    public class ApiRequestUtil {
    
        public static void main(String[] args){
            Map<String,Object> mapParam = new HashMap<String,Object>();
            JSONObject str = sendGet("https://请求地址", mapParam);
            System.out.println(str);
        }
    
        /**
         * 向指定url发送POST请求
         * 
         */
        public static JSONObject sendPost(String url,Map<String, Object> paramMap){
            JSONObject jsonObj = null;
            if(url != "https:/Your URL!"){
            //获取token,这里是OAuth 2.0认证    
                paramMap.put("access_token", getToken());
            }
            try {
                URL realUrl = new URL(url);
                URLConnection conn = realUrl.openConnection();
                //指定客户端能够接收的内容类型    
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");//设置连接的状态
                //User-Agent的内容包含发出请求的用户信息
                conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                conn.setRequestProperty("Charset", "UTF-8");
                conn.setDoOutput(true);
                conn.setDoInput(true);
    
                PrintWriter out = new PrintWriter(conn.getOutputStream());
                String param = mapToParam(paramMap);
                out.print(param);
                out.flush();
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line;
                String str = "";
                while ((line = in.readLine()) != null) {
                    str += line;
                }
                jsonObj = JSONObject.fromObject(str);
            } catch (MalformedURLException e) {
                System.err.println("URL协议、格式或者路径错误!" + e);
                e.printStackTrace();
            } catch (IOException e) {
                System.err.println("URL连接失败!" + e);
                e.printStackTrace();
            } catch (Exception e) {
                System.err.println("发送  POST 请求出现异常!" + e);
                e.printStackTrace();
            }
            return jsonObj;
        }
    
    
        /**
         * 向指定url发送GET请求
         * 
         */
        public static JSONObject sendGet(String url,Map<String,Object> paramMap){
            JSONObject jsonObj = null;
            paramMap.put("access_token", getToken());
            try {
                String requestUrl = url + "?" + mapToParam(paramMap);
                URL realUrl = new URL(requestUrl);
    
                URLConnection conn = realUrl.openConnection();
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                conn.setRequestProperty("Charset", "UTF-8");
                conn.connect();
                System.out.println("接口连接成功");
    
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String str = "";
                String line;
                while ((line = in.readLine()) != null) {
                    str += line;
                }
                jsonObj = JSONObject.fromObject(str);
            } catch (MalformedURLException e) {
                System.err.println("URL协议、格式或者路径错误!" + e);
                e.printStackTrace();
            } catch (IOException e) {
                System.err.println("URL连接失败!" + e);
                e.printStackTrace();
            } catch (Exception e) {
                System.err.println("发送  GET 请求出现异常!" + e);
                e.printStackTrace();
            }
            return jsonObj;
        }
    
        /**
         * 将Map形式的参数转为url参数
         * @Title mapToParam
         */
        public static String mapToParam(Map<String,Object> paramMap){
            //取出Map里的数据拼接请求参数
            String param = "";
            if (paramMap != null && paramMap.size() > 0) {
                Iterator<String> ite = paramMap.keySet().iterator();
                while (ite.hasNext()) {
                    String key = ite.next();// key
                    Object value = paramMap.get(key);
                    param += key + "=" + value + "&";
                }
                param = param.substring(0, param.length() - 1);
            }
            return param;
        }
    
        /**
         * 获取access_token权限认证令牌(token)
         */
        public static String getToken(){
            Map<String,Object> mapParam = new HashMap<String,Object>();//请求参数
            mapParam.put("grant_type", "password");
            mapParam.put("参数名","参数值");//这里的参数按照要求传就好
            mapParam.put("redirect_uri","http://www.baidu.com/");
            mapParam.put("username","");
            mapParam.put("password","");
            String pathUrl = "获取token的URL";
            Map<String,Object> result = sendPost(pathUrl, mapParam);
            System.out.println(result.toString());
            return (String) result.get("access_token");
        }
    }
    

    页面可以自己写,我是直接在系统菜单管理里加的链接:tool/interfaceTest.do
    效果图如下:

    最终结果

    展开全文
  • Java接口测试工具

    2019-11-29 09:57:48
    Java接口测试工具
  • Java接口测试自动化

    2019-04-18 12:03:29
    java接口自动化测试视频教程testng httpclient mock jenkins集成
  • 走进Java接口测试之整合ELK实现日志收集

    千次阅读 多人点赞 2020-09-22 15:08:59
    文章目录走进Java接口测试之整合ELK实现日志收集一、前言二、ELK 中各个服务的作用三、使用 Docker Compose 搭建 ELK 环境1、需要下载的 Docker 镜像2、搭建前准备2.1、下载 Docker Compose2.2、修改该文件的权限为...

    走进Java接口测试之整合ELK实现日志收集

    一、前言

    ELK 即 Elasticsearch、Logstash、Kibana,组合起来可以搭建线上日志系统,本文主要讲解使用 ELK 来收集测试框架产生的日志。

    二、ELK 中各个服务的作用

    在这里插入图片描述

    • Elasticsearch:用于存储收集到的日志信息;
    • Logstash:用于收集日志,测试框架应用整合了 Logstash 以后会把日志发送给 Logstash,Logstash再把日志转发给Elasticsearch;
    • Kibana:通过Web端的可视化界面来查看日志。

    三、使用 Docker Compose 搭建 ELK 环境

    1、需要下载的 Docker 镜像

    docker pull elasticsearch:7.6.2
    docker pull logstash:7.6.2
    docker pull kibana:7.6.2
    

    2、搭建前准备

    Docker Compose是一个用于定义和运行多个docker容器应用的工具。使用Compose你可以用YAML文件来配置你的应用服务,然后使用一个命令,你就可以部署你配置的所有服务了。

    2.1、下载 Docker Compose

    curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    

    2.2、修改该文件的权限为可执行

    chmod +x /usr/local/bin/docker-compose
    

    2.3、查看是否已经安装成功

    docker-compose --version
    

    3、开始搭建

    3.1、创建一个存放 logstash 配置的目录并上传配置文件

    logstash-springboot.conf 文件内容:

    input {
      tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4560
        codec => json_lines
      }
    }
    output {
      elasticsearch {
        hosts => "es:9200"
        index => "springboot-logstash-%{+YYYY.MM.dd}"
      }
    }
    

    创建配置文件存放目录并上传配置文件到该目录:

    mkdir /mydata/logstash
    

    3.2、使用 docker-compose.yml 脚本启动 ELK 服务

    docker-compose.yml 内容:

    version: '3'
    services:
      elasticsearch:
        image: elasticsearch:7.6.2
        container_name: elasticsearch
        user: root
        environment:
          - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
          - "discovery.type=single-node" #以单一节点模式启动
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
        volumes:
          - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
          - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
        ports:
          - 9200:9200
          - 9300:9300
      logstash:
        image: logstash:7.6.2
        container_name: logstash
        environment:
          - TZ=Asia/Shanghai
        volumes:
          - /mydata/logstash/logstash-springboot.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
        depends_on:
          - elasticsearch #kibana在elasticsearch启动之后再启动
        links:
          - elasticsearch:es #可以用es这个域名访问elasticsearch服务
        ports:
          - 4560:4560
      kibana:
        image: kibana:7.6.2
        container_name: kibana
        links:
          - elasticsearch:es #可以用es这个域名访问elasticsearch服务
        depends_on:
          - elasticsearch #kibana在elasticsearch启动之后再启动
        environment:
          - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
        ports:
          - 5601:5601
    

    上传到 linux 服务器并使用 docker-compose 命令运行:

    docker-compose up -d
    

    注意:Elasticsearch 启动可能需要好几分钟,要耐心等待。

    启动时会发现 /usr/share/elasticsearch/data 目录没有访问权限,只需要修改 /mydata/elasticsearch/data 目录的权限,再重新启动即可;

    chmod 777 /mydata/elasticsearch/data/
    
    $ docker-compose ps
        Name                   Command               State                       Ports                     
    -------------------------------------------------------------------------------------------------------
    elasticsearch   /usr/local/bin/docker-entr ...   Up      0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
    kibana          /usr/local/bin/dumb-init - ...   Up      0.0.0.0:5601->5601/tcp                        
    logstash        /usr/local/bin/docker-entr ...   Up      0.0.0.0:4560->4560/tcp, 5044/tcp, 9600/tcp    
    [root@centos-7-template elk]# docker-compose up -d
    

    3.3、在 logstash 中安装 json_lines 插件

    # 进入logstash容器
    docker exec -it logstash /bin/bash
    # 进入bin目录
    cd /bin/
    # 安装插件
    logstash-plugin install logstash-codec-json_lines
    # 退出容器
    exit
    # 重启logstash服务
    docker restart logstash
    

    3.4、关闭防火墙并在kibana 中查看

    systemctl stop firewalld
    

    访问地址:http://172.16.106.233:5601/

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5lYaaY9i-1600755488424)(../images/tech_screen_02.png)]

    四、框架集成 Logstash

    1、添加 logstash-logback-encoder 依赖

    pom.xml 中添加:

    <!--集成logstash-->
    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>5.3</version>
    </dependency>
    

    2、添加配置文件 logback-spring.xml 让 logback 的日志输出到 logstash

    注意 appender 节点下的 destination 需要改成你自己的 logstash 服务地址,比如我的是:172.16.106.233:4560

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
        <!--应用名称-->
        <property name="APP_NAME" value="springboot-logback-elk-demo"/>
        <!--日志文件保存路径-->
        <property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
        <contextName>${APP_NAME}</contextName>
        <!--每天记录日志到文件appender-->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
            </encoder>
        </appender>
        <!--输出到logstash的appender-->
        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <!--可以访问的logstash日志收集端口-->
            <destination>172.16.106.233:4560</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
        </appender>
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
            <appender-ref ref="LOGSTASH"/>
        </root>
    </configuration>
    

    3、进行测试

    添加一个测试方法:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Slf4j
    public class LogbackdemoApplicationTests {
    
    	@Test
    	public void contextLoads() {
    		log.info("输出info");
    		log.debug("输出debug");
    		log.error("输出error");
    	}
    }
    

    运行测试:
    在这里插入图片描述

    五、在 kibana 中查看日志信息

    1、创建 index pattern

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2、查看收集的日志

    在这里插入图片描述

    在这里插入图片描述

    3、筛选日志

    在这里插入图片描述

    4、查看日志详情

    在这里插入图片描述

    六、总结

    搭建了 ELK 日志收集系统之后,我们如果要查看测试框架的日志信息,就不需要查看日志文件了,直接在 Kibana 中查看即可。

    文章源码地址:

    展开全文
  • 走进Java接口测试之Mock(概念篇)

    万次阅读 多人点赞 2018-12-09 00:25:31
    场景一:依赖接口不通,甲开发A模块,乙开发B模块,甲的进度比乙快,但A模块的方法依赖于B模块,要测试A模块接口怎么办? 场景二:异常数据难模拟,当需要测试接口一些异常数据,接口正常情况是否无法提供异常数据的...

    在这里插入图片描述

    一、引言

    实际工作中,测试人员可能会遇到如下情况:

    • 场景一:依赖接口不通,甲开发A模块,乙开发B模块,甲的进度比乙快,但A模块的方法依赖于B模块,要测试A模块接口怎么办?
    • 场景二:异常数据难模拟,当需要测试接口一些异常数据,接口正常情况是否无法提供异常数据的。那么如何简便地构造接口的异常数据?
    • 场景三:依赖接口性能参数无法保障。在对接口性能压测的时候,需要下游接口及时返回数据,满足上游接口的调用频度。在依赖接口多的情况下,如何减轻工作量?

    二、Mock 的定义

    性能基础之浅谈常见接口性能压测文中,我们有简单介绍过 Mock ,本文将详细阐述 Mock 概念。
    在接口测试过程中,对于某些不容易构造或者不容易获取的对象,我们常常会用一个虚拟的对象代替以便测试。在具体的测试过程中,我们经常会碰到需要模拟数据或者接口的情况,因为环境问题或者系统复杂度的问题,我们需要使用 Mock 方式进行数据的模拟。
    引用淘宝网《接口测试白皮书》中的对 Mock 的定义:

    Mock 是指使用各种技术手段模拟出各种需要的资源以供测试使用。
    被 Mock 的资源通常有以下特征:

    • 被测目标依赖该资源
    • 该资源可能因为各种原因不稳定、返回结果不断变化或者并不总是能够获取到
    • 该资源跟被测目标本身质量无关
    • 这些资源可能是一个外部或底层接口、一个系统、一组数据对象或者是一整套目标软件的工作环境等。通过 Mock 避免对外部真实资源的依赖实现对被测目标的孤立测试,从而大大降低测试的难度,节约测试成本。
    • 需要注意的是利用 Mock 通过的测试与使用真实环境通过的测试毕竟还是有一定差别的。有些时候我们就是需要所测试的系统能够处理依赖所产生的各种情况,包括正常情况和异常情况,我们同样不能保证我们的Mock 可以模拟到每种这样的情况。因此只在确实有必要的情况下才运用Mock。

    三、Mock 的分类

    目前主要应用两大类 Mock 的场景。
    一种是 Mock 一个对象,写入一些预期的值,通过它进行自己想要的测试。主要适用于单元测试,哪种语言开发的程序必须用基于哪种语言的Mock 方案去实现。
    例如:Mockito 只能针对 Java ,适用范围:单测

    另外一种就是 Mock 一个 Server ,构造一个假的服务返回预期的结果,也是为了进行自己的测试。主要适用于接口&性能测试,Mock 方案和程序使用的语言无关,可以用 Java 实现,也可以用 Python 实现等,例如:搭建一个 Mock Server,适用范围:无限制

    这两个场景构造了大部分的 Mock 使用范围。

    四、Mock 一个对象

    此处使用Mockito示例

    Mockito 是 GitHub 上使用最广泛的 Mock 框架,并与 JUnit 结合使用。Mockito 框架可以创建和配置 mock 对象。使用 Mockito 简化了具有外部依赖的类的测试开发。

    在这里插入图片描述
    一般使用 Mockito 的步骤:

    1. 模拟任何外部依赖并将这些模拟对象插入测试代码中
    2. 执行测试中的代码执行测试中的代码
    3. 验证代码是否按照预期执行验证代码是否按照预期执行

    引入pom

      <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
                <version>1.10.19</version>
            </dependency>
            <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <version>6.14.3</version>
            </dependency>
    

    新建测试类,构造了 list 这样的对象,并且给一个元素赋值 zuozewei。在最后断言的时候,也可以通过这个 list 里面确实有这个值。所以,通过这种方式,我们可以进行对象构造。可以是类,也可以是接口。
    除了构造对象,当然也可以对方法设定的返回值指定异常。
    上述代码的意思就是当调用 list 的第二个元素的时候,抛出一个运行异常。

    public class SimpleTest {
    
    	@Test
    	public void test(){
    		// 创建Mock对象,参数可以是类或者接口
    		List<String> list = mock(List.class);
    
    		//设置方法的预期返回值
    		when(list.get(0)).thenReturn("zuozewei");
    		when(list.get(1)).thenThrow(new RuntimeException("test exception"));
    
    		String result = list.get(0);
    
    		//验证方法调用
    		verify(list).get(0);
    
    		//断言,list的第一个元素是否是"zuozwei"
    		Assert.assertEquals(result,"zuozewei");
    
    	}
    }
    

    上面只是列举了 Mockito 的简单用法。对于比较复杂的用法,大家可以通过官网深入学习。因为 Mockito 主要用于单元测试,开发人员用的比较多,所以大家有兴趣可以自行了解。

    五、Mock Server

    下图很好的解释了Mock Server 位置和作用:
    在这里插入图片描述
    常见的Mock Server

    1. WireMock,支持HTTP协议,参考:http://wiremock.org/
    2. SoapUI MockService 支持 WebService,参考:https://www.soapui.org/
    3. Dubbo,需要自己实现
    4. 使用Web框架自己开发 Mock Server 系统,参考:http://www.testclass.net/interface/flask_mock/
    5. 在线 Mock Server 系统,参考:http://easy-mock.com/login
    6. 使用现成的 Mock Server 库创建系统,参考:
      MockServer:https://github.com/jamesdbloom/mockserver
      Moco:https://github.com/dreamhead/moco
      两个项目都不错有 Mock Serve r库,GitHub 上面的 Star 也差不多。

    六、小结

    本文分场景介绍了两种 Mock 方式,对于Mock Server 的方案各有各的便利性,看起来都是对接口的模拟。

    展开全文
  • Java接口测试java代码

    千次阅读 2017-04-15 16:38:02
    //1.新建一个客户端对象 CloseableHttpClient client=HttpClients.createDefault(); //2....URI url=new URIBuilder().setScheme("https")//设置接口使用的协议 .setHost("api.weixin.qq.com")//
    //1.新建一个客户端对象
    
    CloseableHttpClient client=HttpClients.createDefault();
    //2.使用URLBuilder工具类构造一个get类型的url,来设置协议的
    URI url=new URIBuilder().setScheme("https")//设置接口使用的协议
    .setHost("api.weixin.qq.com")//设置主机地址
    .setPath("/cgi-bin/token")//设置接口地址
    .setParameter("appid","wx0772af203a544dd7")
    .setParameter("secret","f686bbfa5c596a9ff313422cb6121400")
    .setParameter("grant_type","client_credential").build();
    //3.实例化一个HttpGet类型的对象,并使用url进行初始化
    HttpGet get=new HttpGet(url);
    //4.新建一个closeableHttpResponse类型的响应对象,接受客户端执行get请求的结果
    CloseableHttpResponse response=client.execute(get);
    //5.从响应对象中提取响应实体
    String result=EntityUtils.toString(response.getEntity());
    //6.打印结果
    System.out.println(result);
    展开全文
  • java 接口测试工具(WEB)

    千次阅读 2018-04-08 03:55:45
    第一版(基本功能)包含功能:1、创建接口测试列表;2、请求java接口,并返回值(response)http://47.92.127.120:8080/TestWeb/jsp/system/api/api.jsp
  • 文章目录引言ExtentReports 简介具体步骤Step-1:添加 Maven 依赖包Step-2:重写 ExtentTestNgFormatter 类创建 MyExtentTestNgFormatter 类...4:配置报告Step-5:配置系统系统Step-6:添加测试用例Step-7:测试...
  • 如题,pas-benchmark是一个Java接口测试迭代器,目前是V0.1版本,部分内容还没开放。 p(Performance)、a(Atuo testing)、s(solution) 测试对象为Java接口,单机TPS过万的情况,可以在一台负载机上运行多个测试...
  • 前后端唯一联系变成了API接口,API文档变成了前后端开发人员&amp;amp;amp;amp;测试人员联系的纽带。所以一款强大的Restful API文档就变得至关重要了。而目前在后端领域,基本上是Swagger的天下了。 Swagger2综述...
  • 走进Java接口测试之流行框架SpringBoot

    千次阅读 2018-12-10 09:56:34
    文章目录引言Spring 历史Spring 1.x 时代Spring 2.x 时代Spring 3.x 到 Spring 4.xSpringBoot 的诞生什么是SpringbootSpringBoot 特点SpringBoot 优势SpringBoot 开发更简单SpringBoot 测试更简单SpringBoot 配置更...
  • @DataProvider(parallel = true) // ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 718,218
精华内容 287,287
关键字:

java接口测试

java 订阅