2018-04-22接口自动化测试学习心得(1)

根据接口文档写接口测试用例-->添加接口自动化测试项目相关依赖(httpclient+testng+poi-ooxml+log4j+mail+mysql-connector-java)-->写接口测试方法-->执行测试

-- 接口测试
1.一个接口就是一个函数
2.我们要保证一个接口能够在url地址栏里面访问到,必须满足一下两个条件
一是这个接口首先是部署到服务器上的web容器中,
而是此接口必须实现了http协议
-- 接口文档
接口地址
请求方式
参数
变量名
类型
说明
备注

-- 接口测试工具:
soapui,jmeter,pastman,fiddler
都操作一次
soapui:准备url创建项目,根据接口文档确定提交的方式,准备传参,发送请求,获取接口返回数据

-- ui层面的功能测试跟接口测试的区别:
1.ui层面可以通过页面填写数据,传数据到后台,
但是接口测试没有页面,我们只能借助接口测试工具模拟页面去提交接口数据。
2.UI层面的功能测试会有后台接口返回的数据,并且数据会通过js以提示信息的方式显示在页面帮助用户或者测试人员去判断功能是否正常。
但是接口测试就没有页面提示信息,我们能看到的是接口返回的最原始的数据。

接口自动化实现:
java有专门的第三方框架可以提供了一套基于http协议的接口请求和处理技术。--httpclient

-- 环境搭建
创建maven项目-eclipse集成testng-集成testng框架
添加依赖
    <dependencies>
        <!-- 管理用例,提供多种测试场景实现 -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8.8</version>
            <scope>test</scope>
        </dependency>
        <!-- 接口提交(get/post) -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>
        <!-- 解析excel文件 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>
        <!-- 记录日志框架 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- 发送邮件框架 -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.5.0-b01</version>
        </dependency>
        <!-- jdbc技术,数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>

-- httpPost
1,以post方式提交请求到服务器
2,参数封装到请求体当中
3,数据长度是没有限制的
4,支持post方式提交的接口往往是吧数据提交到服务器
关键api函数
构造函数:
HttpPost post=new HttpPost(url);
创建一个post对象,以post方式提交接口请求
设置参数到请求体
post.setEntity(new UrlEncodedFormEntity(params));
通过此方法将接口参数设置到请求中

-- httpGet
1,以get方式提交请求到服务器
2,get参数不是封装在请求体当中的(由没有setEntify方法就可以看出)
3,数据长度是有限制的
4,支持get提交的接口一般都是从服务器拿下来数据
关键api函数
构造函数:
HttpGet httpGet=new HttpGet(interfacesurl);
创建一个get对象,以get方式提交接口请求
注意:如果以get提交的接口请求有需要传参,蚕食通常是直接拼接在url后面
例子
public class RegisterInterface {
    @Test
    public void test1() throws Exception{
        //准备url;
        String url="http://8080/lmcanon_web_auto/mvc/member/api/member/register";
        //接口提交的方式;
        HttpPost post=new HttpPost(url);
        //准备传参;
        List<NameValuePair>params=new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("mobilephone", "13517315121"));
        params.add(new BasicNameValuePair("pwd", "e10adc3949ba59abbe56e057f20f883e"));
        //将参数设置到post请求中
        post.setEntity(new UrlEncodedFormEntity(params));
        //发送请求;
        CloseableHttpClient httpclient=HttpClients.createDefault();
        CloseableHttpResponse response=httpclient.execute(post);
        //获取接口返回数据.
        String jsonStr=EntityUtils.toString(response.getEntity());
        System.out.println(jsonStr);
    }}
    
    @Test
    public void get() throws Exception{
        //定义接口地址
        String interfacesurl="http://8080/futureload/mvc/api/member/list";
        //决定接口提交方式
        HttpGet httpGet=new HttpGet(interfacesurl);
        //直接提交接口请求,准备客户端
        CloseableHttpClient httpClient=HttpClients.createDefault();
        CloseableHttpResponse response=httpClient.execute(httpGet);
        //获取相应数据
        String jsonString=EntityUtils.toString(response.getEntity());
        System.out.println(jsonString);
    }}
    
--httpRequeste
接口类型,表示是从客户端发送服务端请求
HttpGet和httpPost都是httpRequest实现类,属于子类对象

-- httpResponse    
接口类型,表示是从服务端到客户端的响应
从响应对象中获取返回数据:getEntity()
从响应对象中获取响应状态:getStatusLine()
从响应对象中获取响应头信息:getAllHeaders()
从响应对象中设置响应头信息:setHeader

-- 93框架实现步骤
1,testng管理用例
2,实现httpUtil类提供公共的方法处理post和get请求
3,设计测试用例
4,实现数据驱动(获取url,接口类型,传参,封装成方法)
5,接口测试数据回写
6,日志集成
7,报表集成
8,jenkins集成

--get和post公共方法
public static String getResultStringByPost(String uri,List<NameValuePair>params){
        //调用函数StringUtils.isEmpty(uri),对uri是否为空的处理
        if(StringUtils.isEmpty(uri)){
            return "";
            }
        //创建httpPost对象
        HttpPost httpPost=new HttpPost(uri);
        String resultString="";
        //设置参数到httpPost对象中
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            //准备httpclient客户端
            CloseableHttpClient httpClient= HttpClients.createDefault();
            //发送请求
            CloseableHttpResponse response=httpClient.execute(httpPost);
            //解析数据
            resultString=EntityUtils.toString(response.getEntity());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return resultString;
        
    }
    /**get请求通用处理函数
     * @param uri:接口地址
     * @param params:提交参数
     * @return:接口响应数据
     */
    public static String getResultStringByGet(String uri,List<NameValuePair>params){
        //调用函数StringUtils.isEmpty(uri),对uri是否为空的处理
        if(StringUtils.isEmpty(uri)){
            return "";
            }
        if(params==null){
            return "";
        }
        for (int i=0;i<params.size();i++) {
            NameValuePair nameValuePair=params.get(i);
            if(i==0){
            uri+=("?"+nameValuePair.getName()+"="+nameValuePair.getValue());
            }else{
                uri+=("&"+nameValuePair.getName()+"="+nameValuePair.getValue());
            }
        }
        //创建httpGet对象
        HttpGet httpGet=new HttpGet(uri);
        String resultString="";
        //设置参数到httpPost对象中
        try {
//            httpGet.setEntity(new UrlEncodedFormEntity(params));
            //准备httpclient客户端
            CloseableHttpClient httpClient= HttpClients.createDefault();
            //发送请求
            CloseableHttpResponse response=httpClient.execute(httpGet);
            //解析数据
            resultString=EntityUtils.toString(response.getEntity());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return resultString;
        
    }
//StringUtils判空方法
public class StringUtils {
    public static boolean isEmpty(String content){
        boolean isEmpty=(content==null||content!=null&&content.trim().length()==0);
        return isEmpty;
    }
}

转载于:https://www.cnblogs.com/AIME/p/8907207.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java MemoryMapped文件的功能

Java MemoryMapped文件的功能 在JDK 1.4中&#xff0c;将内存映射文件的有趣功能添加到Java中&#xff0c;该功能允许将任何文件映射到OS内存以进行有效读取。 内存映射文件可用于开发IPC类型的解决方案。 本文是使用内存映射文件创建IPC的实验。 有关内存映射文件的一些详细信…

介绍一款好用 mongodb 可视化工具

最近想自己搭建一个个人博客&#xff0c;所以学了下mongodb&#xff0c;mongodb是用命令行输入的&#xff0c;有些人可能不太习惯&#xff0c;我自己找了下mongodb的一些可视化工具&#xff0c;发现了一款adminmongo很好用&#xff0c;这里介绍给你们用一下。 github地址&#…

用CSS3来代替JS实现交互

【CSS3和JS】 对于CSS了解的同学都知道&#xff0c;CSS的实现是最底层的&#xff0c;在实现方式和性能上都不是&#xff0c;JS这种提供接口的脚本可比的&#xff1b;从CSS3的动画和JS动画对比角度来看两者&#xff0c;会更清晰&#xff1b;而且随着前端框架的使用&#xff0c;…

php 如何宏定义,php – 在html中实现宏定义的方法

也许显而易见,但C预处理器可以完成这项工作.index._html#define _em(a) a #define _image(a, b) #define _list(a, b, c) a \\ b \ c \#define _theTile The Bar Title#include "head._html"_list(foo, bar, bean)This is really _em(great)_image(media/cat.jpg, …

python——函数 11、命名空间

三种名称空间1、内置名称空间&#xff1a; python解释器自带的名字,如&#xff1a;print、sum、max 当解释器启动时就会形成这个空间 2、全局名称空间&#xff1a; 执行python程序时就会产生这个空间 在每行顶端写代码 a10 def foo():print(a) foo() View Code3&…

Hadoop如何工作? HDFS案例研究

Apache Hadoop软件库是一个框架&#xff0c;该框架允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。 它旨在从单个服务器扩展到数千台机器&#xff0c;每台机器都提供本地计算和存储。 库本身不用于依靠硬件来提供高可用性&#xff0c;而是被设计用来检测和处…

CS Round#53 E Maxor

题意&#xff1a;给你N个数&#xff0c;你可以从中选出两个数将它们or起来得到M&#xff0c;求M的最大值及得到最大值的方案数。 刚了半个小时得到了一个貌似时O(N log max(Ai)^2)的方法&#xff0c;想了想发现貌似只能做出第一问&#xff0c;但好像改一下就能搞掉第二问&#…

CSS小记录

1.让图文不可复制 -webkit-user-select: none; -ms-user-select: none; -moz-user-select: none; -khtml-user-select: none; user-select: none; 2.让图片垂直居中 .Logo{height: 109px;line-height: 109px;} .Logo img{vertical-align: middle;} 3.行内块级元素垂直居中&…

Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...

文章目录重量级锁(Mutex Lock)偏向锁(比较 ThreadID)偏向锁获取过程偏向锁的释放轻量级锁(自旋)轻量级锁的加锁过程轻量级锁的释放总结重量级锁(Mutex Lock)Synchronized 是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的 Mute…

使用镜像源安装EASY_INSTALL和PIP教程

使用easy_install和pip可以让python的模块的安装和管理变得非常方便。我一般在新的Linux系统上&#xff0c;先easy_install pip然后就用pip安装其他的模块了。 不过&#xff0c;在国内用官方的pypi源&#xff08;https://pypi.python.org/simple&#xff09;一般比较慢&#xf…

Flexbox布局

Flexbox布局 刚开始接触flex布局的时候&#xff0c;只知道它可以用来使子元素水平垂直居中&#xff0c;代码最为简洁好用。 .container {display: flex;justify-content: center;align-items: center; } 当然不仅仅是居中问题&#xff0c;flexbox能做的事情大多&#xf…

臭名昭著的Java错误和陷阱

在2000年&#xff0c;我上大学&#xff0c;濒临选择一种语言来发展自己的职业。 Java尚未成为主流&#xff0c;但很受人们欢迎。 与静态html页面相比&#xff0c;小应用程序&#xff08;尚未破碎&#xff09;花哨且富有光泽。 Swing不是构建桌面应用程序的不错选择。 J2EE越来越…

php oracle 配置,关于php:为Windows 64位配置Oracle OCI8

我一直在为Windows配置oracle oci8时遇到问题我正在使用Windows 7 64位&#xff0c;xampp v3.2.2&#xff0c;php 5.6.15和oracle g11 Express我尝试了以下步骤&#xff0c;但是在运行phpinfo时找不到oci软件包&#xff1a;我同时下载了Instant Client Package-Basic和Instant …

CSS_常见布局

1.一列布局——常用于网站首页。 html&#xff1a; 1 <div class"top"></div> 2 <div class"main"></div> 3 <div classfoot></div> css&#xff1a; 1 body{2 margin:0;3 padding: 0;4 …

解决android studio引用远程仓库下载慢(JCenter下载慢)

原文&#xff1a;https://blog.csdn.net/linglingchenchen/article/details/62236723 第一种方法 使用开源中国的maven库 阿里云的(速度飞快)&#xff1a;http://maven.aliyun.com/nexus/content/groups/public/ 替换项目根目录下build.gradle中的 repositories {jcenter()} 为…

Java中的工厂方法模式

在我以前关于模板方法模式的文章中 &#xff0c;我展示了如何利用lambda表达式和默认方法 。 在本文中&#xff0c;我将探讨工厂方法模式&#xff0c;并了解如何利用方法引用&#xff0c;这是Java 8中与lambda表达式一起添加的另一项功能。 让我们考虑一个Vehicle接口及其两个…

会员系统用php框架,代码基地会员中心的PHP签到系统结合thinkphp框架

分享代码基地会员中心的PHP签到系统&#xff0c;PHP很漂亮的签到界面。签到后&#xff0c;会有不同颜色区分。附带PHP签到源码带安装说明和详细注释。(详细查看https://www.daimajidi.com/deal/574)JS:function getUrl(strs) {var url "/demo/1563064903/" strs;re…

MVP数据请求recycview展示

M层 public class Mod {public void shuju(final Modlister modlister){ OkHttpClient okHttpClientnew OkHttpClient();final Request requestnew Request.Builder().url("http://v.juhe.cn/weixin/query?key55010ae808217e996bbf414bbdad843c").build(); Call …

impress.js

介绍一下 impress.js是一个非常炫酷的幻灯片展示框架&#xff0c;依靠CSS3技术。 impress.js使用起来非常简单&#xff0c;下面就来简单介绍一下其用法。 Start 首先&#xff0c;当然要引入impress.js。 在div标签设置id为impress&#xff08;不要求一定是div&#xff09;…

Spring MVC:表单处理卷。 1个

Spring MVC是Spring Framework的一部分&#xff0c;其主要目的是使Web开发更加简单&#xff0c;便捷和轻松。 与表单的交互是或多或少现代Web应用程序的一部分。 Spring MVC允许您以非常严格和简单的方式执行各种形式的活动。 在本文中&#xff0c;您将在Spring MVC的帮助下阅读…