http接口测试—自动化测试框架设计
转载:https://my.oschina.net/hellotest/blog/499719
一、测试需求描述
对服务后台一系列的http接口功能测试。
输入:根据接口描述构造不同的参数输入值(Json格式)
输出:字符串(传入的方式+传入的字符串)
http://localhost:8090/lctest/TestServer
二、程序设计
1、Client程序设计
读取Excel配置的测试用例数据
发送参数Json格式给Server,接收Server的返回数据
进行数据比对校验,返回测试结果,将数据插入到Excel中
2、Server端程序设计
接受Client的参数,进行解析
发送返回数据给client
三、实现方法
1、选用Java脚本来驱动测试
2、采用Excel表格管理测试数据,包括用例的管理、测试数据录入、测试结果显示等等,这个需要封装一个Excel的类。
3、调用http接口采用java自带的的API
4、测试需要的将参数转化成字符串
5、通过预期结果和实际结果的对比,将实际结果和对比结果写入Excel用例中,这里封装了一个类
6、首次执行测试采用人工检查输出的是否正确,一旦正确写入Excel的期望结果中,如果发现错误手工修正为预期文件。
四、Excel表格设计

五、代码结构

六、实现代码
1、ExcelUtil.java
package client;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
public class ExcelUtil {
//读取Excel中数据
public static List<Param> read() throws Exception{
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet s = wb.createSheet();
HSSFRow row = s.createRow(0);
HSSFCell cell = row.createCell((int)0,0);
//------------从xls读出数据
wb = new HSSFWorkbook(new FileInputStream("D:\\learn\\test.xls"));
s = wb.getSheetAt(0);
//获得EXCEL行数
int rowNums=s.getLastRowNum();
//获得Excell列数
//int columnNum=r.getPhysicalNumberOfCells();
List<Param> params=new ArrayList<Param>();
for(int i=1;i<=rowNums;i++){
HSSFRow r = s.getRow(i);
cell=r.getCell(0);
Param param= new Param();
param.setNo(r.getCell(0).getStringCellValue());
param.setName(r.getCell(1).getStringCellValue());
param.setAge(r.getCell(2).getStringCellValue());
param.setSex(r.getCell(3).getStringCellValue());
param.setExpResu(r.getCell(4).getStringCellValue());
// System.out.println(cell.getRichStringCellValue());
params.add(param);
}
return params;
}
/**
* 写入Excel,在任意坐标处写入数据。
* String value:你要输入的内容
* int x :行坐标,Excel从 0 算起
* int y :列坐标,Excel从 0 算起
*/
public static void writeCell(String filePath,int x,int y,String value) {
try {
// 创建Excel的工作书册 Workbook,对应到一个excel文档
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(filePath));
HSSFSheet sheet=wb.getSheetAt(0);
HSSFRow row=sheet.getRow(x);
HSSFCell cell=row.getCell((short) y);
cell.setCellValue(value);
FileOutputStream os;
os = new FileOutputStream(filePath);
wb.write(os);
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、JsonsUtil.java
package client;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* 使用json-lib构造和解析Json数据
*/
public class JsonsUtil {
/**将Bean转换成Map
* 将Map转换Json数据
*/public static String BuildJson(Param param) throws JSONException {
Map<String, String> map1 = new HashMap<String, String>();
map1.put("no", param.getNo());
map1.put("name", param.getName());
map1.put("age", param.getAge());
map1.put("sex", param.getSex());
// map1.put("expResu", param.getExpResu());
// JSON格式数据解析对象
JSONObject jo = new JSONObject();
// 将Map转换为JSONArray数据
JSONArray ja = new JSONArray();
ja.put(map1);
// System.out.println("JSONArray对象数据格式:"+ja.toString());
jo.put("map", ja);
// System.out.println("最终构造的JSON数据格式:"+jo.toString());
return jo.toString();
}
/**
* 解析Json数据
*
*/public static JSONArray ParseJson(String jsonString) throws JSONException,
ParseException {
JSONObject jo = new JSONObject(jsonString);
JSONArray ja = jo.getJSONArray("map");
// System.out.println(ja.getJSONObject(0).getString("name"));
return ja;
}
}
3、Param.java
package client;
public class Param {
String no;//编号
String name;//姓名
String age;//年龄
String sex;//性别
String expResu;//期望结果
String actResu;//实际结果
String pass;//是否通过
String desc;//描述
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getExpResu() {
return expResu;
}
public void setExpResu(String expResu) {
this.expResu = expResu;
}
public String getActResu() {
return actResu;
}
public void setActResu(String actResu) {
this.actResu = actResu;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
4、CompareRes.java
package client;
public class CompareRes {
int actResuNo=5;//测试结果在第五例
int passNo=6;//对比结果在第六列
public void compare(String filePath,Param param,String actResu){
ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),actResuNo,actResu);
if(param.getExpResu().trim().equals(actResu)){
ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),passNo,"Y");
}else{
ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),passNo,"N");
}
}
}
5、TestClient .java
package client;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
public class TestClient {
public static void main(String[]agrs){
TestClient a=new TestClient();
try {
a.client();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void client() throws Exception{
List<Param> params = ExcelUtil.read();
for(Param pa:params){
try {
// 接报文的地址
String filePath="D:\\learn\\test.xls";
String param= new JsonsUtil().BuildJson(pa);
URL serverUrl= new URL("http://localhost:8090/lctest/TestServer");
URLConnection uct= serverUrl.openConnection();
HttpURLConnection hutc=(HttpURLConnection)uct;
// 设置报文参数
hutc.setRequestMethod("POST");
// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 http正文内,因此需要设为true, 默认情况下是false;
hutc.setDoOutput(true);
// 设置是否从httpUrlConnection读入,默认情况下是true
hutc.setDoInput(true);
// hutc.setAllowUserInteraction(true);
// 开启流,写入数据data
OutputStream out=hutc.getOutputStream();
out.write(param.getBytes("UTF-8"));
out.flush();
out.close();
// 获取返回的数据
StringBuffer buffer=new StringBuffer();
BufferedReader reader = null;
InputStream ins=hutc.getInputStream();
reader = new BufferedReader(new InputStreamReader(ins,"UTF-8"));
String sg=reader.readLine();
if (sg!= null){
buffer.append(sg);
}
System.out.println("接收返回值:" + buffer);
new CompareRes().compare(filePath, pa, buffer.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
6、TestServer
public class TestServer extends HttpServlet {
private static final long serialVersionUID = 1L;
private static JSONArray ja;
/**
* @see HttpServlet#HttpServlet()
*/
public TestServer() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try {
this.excute(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try {
this.excute(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void excute(HttpServletRequest request,HttpServletResponse response) throws Exception{
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml");
String method=request.getMethod();
String url=request.getRequestURI();
String param;
// 获取收到的报文
BufferedReader reader = request.getReader();
String line = "";
line = reader.readLine();
ja=new JsonsUtil().ParseJson(line);
StringBuffer resultBuffer=new StringBuffer();
resultBuffer.append("访问方式"+method+"访问成功");
resultBuffer.append("接收到的数据:"+line);
PrintWriter out =response.getWriter();
out.println(resultBuffer.toString());
out.flush();
out.close();
}
}
7、web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>TestServer</servlet-name>
<servlet-class>com.servlet.TestServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServer</servlet-name>
<url-pattern>/lctest/TestServer</url-pattern>
</servlet-mapping>
</web-app>
http接口测试—自动化测试框架设计的更多相关文章
- Python3简易接口自动化测试框架设计与实现(中)
目录 7.Excel数据读取 7.1.读取配置文件 7.1.编写Excel操作类 8.用例组装 9.用例运行结果校验 10.运行用例 11 .小结 上一篇:Python3简易接口自动化测试框架设计与实 ...
- 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...
- python 做接口自动化测试框架设计
1,明确什么叫自动化测试,什么叫接口自动化测试,如何设计接口测试用例,已登录为例 自动化测试:解放人力来自动完成规定的测试. 自动化测试分层模型:UI层,不论WEB端还是移动端,都是基于页面元素的识别 ...
- AI移动自动化测试框架设计(解读)
声明:原文出自"前端之巅"微信公众号"爱奇艺基于AI的移动端自动化测试框架的设计"一文,作者:何梁伟,爱奇艺Android架构师.文章提供了一种基于AI算法的自 ...
- python3+Robot Framework+PyCharm自动化测试框架设计
关于自动化测试框架的设计,笔者在前面的随笔里面有介绍和总结,这里结合实际的项目例子做个demo,环境部署参考笔者的的随笔<python3+Robot Framework+PyCharm环境部署及 ...
- Python3简易接口自动化测试框架设计与实现(上)
目录 1.开发环境 2.用到的模块 3.框架设计 3.1.流程 3.2.项目结构 5.日志打印 6.接口请求类封装 接口开发请参考:使用Django开发简单接口:文章增删改查 1.开发环境 操作系统: ...
- Java+Selenium3自动化测试框架设计系列--href="javascript:void(0)"如何获得元素定位
经过前面两篇文章的铺 垫,我们这篇介绍,webdriver如何处理,一个浏览器上多个窗口之间切换的问题.我们先脑补这样一个测试场景,你在页面A点击一个连接,会在新的 tab窗口打开页面B,这个时候,你 ...
- demo的自动化测试框架设计
[准备环境] pycharm [思路] Python+request+unittest+HTMLTestRunner 框架 框架的可读性需要强 公共方法提取 可变参数需要提取放入配置文件 做好日志记录 ...
- 从接口自动化测试框架设计到开发(二)操作json文件、重构json工具类
用例模板里的请求数据多,看起来很乱,所以可以通过访问另外一个文件的方式获取请求数据 把请求数据都放在一个json文件中 取出login的内容: import json fp = open('G:/un ...
随机推荐
- android Toolbox和BusyBox
在安卓系统中,Toolbox是能够实现内存的管理,备份管理和清除数据等功能的系统文件.用来对手机性能进行设置,需要root权限.能够被软件调用. 我们在updater-script文件中,知道有类似s ...
- 翻煎饼_简单模拟_C++
一.题目描述(懒人可直接跳过看题目概述) 题目来源: SWUST OJ 题目0254 http://acm.swust.edu.cn/problem/0254/ 二.问题概述 给出一列数,每次可将包 ...
- RobotFramework自动化2-自定义关键字【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/robotframework/ 前言 有时候一个页面上有多个对象需要操作,如果一个个去定 ...
- centos6.6部署mysql mmm高可用架构
一.环境简述 1.工作逻辑图 2.MySQL-MMM优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是 ...
- 负载均衡技术之-lvs
LVS简介 Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU.I/O处理能力很快会成为瓶颈.由于单台服 ...
- 读取EXCEL的办法
private void button9_Click(object sender, EventArgs e) { var folder =new FolderBrowserDialog(); if ( ...
- ReportView控件的使用
ReportView控件的使用Posted on 2012-01-06 17:02 随遇 阅读(3006) 评论(0) 编辑 收藏 最近使用了ReportView控件绑定数据,总结下: 1.在设计器 ...
- Mac下安装npm,http-server,安装虚拟服务器
http-server是一个简单的,不需要配置的命令行下使用的http服务器.类似的还有Xampp等. 针对前端开发工程的代码不需要编译的特点,使用这种简单的服务器十分的便利. 1.安装这个首先要安装 ...
- Nginx模块GeoIP匹配处理IP所在国家、城市
https://www.haiyun.me/archives/nginx-geoip.html
- (30)C#Timer类
有三种Timer 1.System.Windows.Forms.Timer 应用于WinForm中,它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程 ...