APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例
前两篇普及相关基础知识后,本篇主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,除了前两篇的一些了解外,需要有一定的JAVA知识(HTTP相关)。
目录
以下实例均为本次总结再次编写,,如转载还请保留出处与作者姓名Findyou,谢谢!
3.1.1 待测接口说明
1.国家气象局天气预报接口
例:北京市天气
- 接口的址:http://www.weather.com.cn/data/cityinfo/101010100.html
- 请求方式:GET
- 请求结果:
{ "weatherinfo": { "city": "北京", "cityid": "101010100", "temp1": "15℃", "temp2": "5℃", "weather": "多云", "img1": "d1.gif", "img2": "n1.gif", "ptime": "08:00" } }2.测试目标
请求对应cityid代码,返回的城市是否是预期城市。
3.1.2 新建JAVA工程
步骤同上一篇2.2.2.1新建JAVA工程,不再复述,如不懂请百度Eclipse新建工程
1.工程结构说明
2.Common.java源码
package findyou.Interface; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; public class Common { /** * 解析Json内容 * * @author Findyou * @version 1.0 2015/3/23 * @return JsonValue 返回JsonString中JsonId对应的Value **/ public static String getJsonValue(String JsonString, String JsonId) { String JsonValue = ""; if (JsonString == null || JsonString.trim().length() < 1) { return null; } try { JSONObject obj1 = new JSONObject(JsonString); JsonValue = (String) obj1.getString(JsonId); } catch (JSONException e) { e.printStackTrace(); } return JsonValue; } }3.getCityWeathe.java源码
package findyou.Interface; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; public class getCityWeather { private String url=""; public String geturl() { return url; } public String getHttpRespone(String cityCode) throws IOException { String line = ""; String httpResults = ""; url=("http://www.weather.com.cn/data/cityinfo/" + cityCode + ".html"); try { HttpURLConnection connection = URLConnection .getConnection(url); DataOutputStream out = null; // 建立实际的连接 connection.connect(); out = new DataOutputStream(connection.getOutputStream()); out.flush(); out.close(); BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream())); while ((line = reader.readLine()) != null) { httpResults = httpResults + line.toString(); } reader.close(); // 断开连接 connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } return httpResults; } }4.URLConnection.java源码
package findyou.Interface; import java.net.HttpURLConnection; import java.net.URL; public class URLConnection { public static HttpURLConnection getConnection(String url){ HttpURLConnection connection = null; try { // 打开和URL之间的连接 URL postUrl = new URL(url); connection = (HttpURLConnection) postUrl.openConnection(); // 设置通用的请求属性 connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.setUseCaches(false); connection.setInstanceFollowRedirects(true); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Charset", "utf-8"); connection.setRequestProperty("Accept-Charset", "utf-8"); } catch (Exception e) { e.printStackTrace(); } return connection; } }
3.1.3 编写测试用例
1.测试用例(常见"二"一般的写法)
package findyou.testcase; import java.io.IOException; import org.testng.Assert; import org.testng.Reporter; import org.testng.annotations.Test; import findyou.Interface.Common; import findyou.Interface.getCityWeather; public class test { public String httpResult= null, weatherinfo= null, city=null,exp_city = null; public static String cityCode=""; public static getCityWeather weather=new getCityWeather(); @Test(groups = { "BaseCase"}) public void getShenZhen_Succ() throws IOException{ exp_city="深圳"; cityCode="101280601"; Reporter.log("【正常用例】:获取"+exp_city+"天气成功!"); httpResult=weather.getHttpRespone(cityCode); Reporter.log("请求地址: "+weather.geturl()); Reporter.log("返回结果: "+httpResult); weatherinfo=Common.getJsonValue(httpResult, "weatherinfo"); city=Common.getJsonValue(weatherinfo, "city"); Reporter.log("用例结果: resultCode=>expected: " + exp_city + " ,actual: "+ city); Assert.assertEquals(city,exp_city); } @Test(groups = { "BaseCase"}) public void getBeiJing_Succ() throws IOException{ exp_city="北京"; cityCode="101010100"; Reporter.log("【正常用例】:获取"+exp_city+"天气成功!"); httpResult=weather.getHttpRespone(cityCode); Reporter.log("请求地址: "+weather.geturl()); Reporter.log("返回结果: "+httpResult); weatherinfo=Common.getJsonValue(httpResult, "weatherinfo"); city=Common.getJsonValue(weatherinfo, "city"); Reporter.log("用例结果: resultCode=>expected: " + exp_city + " ,actual: "+ city); Assert.assertEquals(city,exp_city); } @Test(groups = { "BaseCase"}) public void getShangHai_Succ() throws IOException{ exp_city="上海"; cityCode="101020100"; Reporter.log("【正常用例】:获取"+exp_city+"天气成功!"); httpResult=weather.getHttpRespone(cityCode); Reporter.log("请求地址: "+weather.geturl()); Reporter.log("返回结果: "+httpResult); weatherinfo=Common.getJsonValue(httpResult, "weatherinfo"); city=Common.getJsonValue(weatherinfo, "city"); Reporter.log("用例结果: resultCode=>expected: " + exp_city + " ,actual: "+ city); Assert.assertEquals(city,exp_city); } }2.简化后的用例
如何返回值格式与请求格式固定,用例优化如下package findyou.testcase; import java.io.IOException; import org.testng.Assert; import org.testng.Reporter; import org.testng.annotations.Test; import findyou.Interface.Common; import findyou.Interface.getCityWeather; public class test { public String httpResult= null, weatherinfo= null, city=null,exp_city = null; public static String cityCode=""; getCityWeather weather=new getCityWeather(); @Test(groups = { "BaseCase"}) public void getShenZhen_Succ() throws IOException{ exp_city="深圳"; cityCode="101280601"; resultCheck(cityCode, exp_city); } @Test(groups = { "BaseCase"}) public void getBeiJing_Succ() throws IOException{ exp_city="北京"; cityCode="101010100"; resultCheck(cityCode, exp_city); } @Test(groups = { "BaseCase"}) public void getShangHai_Succ() throws IOException{ exp_city="上海"; cityCode="101020100"; resultCheck(cityCode, exp_city); } public void resultCheck(String cityCode_str, String exp_city_str) throws IOException{ Reporter.log("【正常用例】:获取"+exp_city_str+"天气成功!"); httpResult=weather.getHttpRespone(cityCode_str); Reporter.log("请求地址: "+weather.geturl()); Reporter.log("返回结果: "+httpResult); weatherinfo=Common.getJsonValue(httpResult, "weatherinfo"); city=Common.getJsonValue(weatherinfo, "city"); Reporter.log("用例结果: resultCode=>expected: " + exp_city_str + " ,actual: "+ city); Assert.assertEquals(city,exp_city_str); } }工程下载地址: https://pan.baidu.com/s/1HL2WPkYNwJ3kx4WH5hSvZA 密码: 7nm5
3.1.4 执行测试用例
TestNG自动化测试系列实例,基本已完毕,Post方法由于篇幅问题,则再不贴出来了,了解了以上实例,Post方法没有太大问题。后续如有时间看心情再上持续集成、自动化部署、自动化用例执行与测试报告输出博文~~~
APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例的更多相关文章
- APP接口自动化测试JAVA+TestNG(二)之TestNG简介与基础实例
前言 继上篇环境篇后,本篇主要对TestNG进行介绍,给出最最基础的两个实例,通过本文后,学会并掌握TestNG测试用例的编写与运行,以及生成美化后的报告.下一篇为HTTP接口实战(国家气象局接口自动 ...
- APP接口自动化测试JAVA+TestNG(一)之框架环境搭建
前言 好久不曾写点啥,去年换到新公司组测试团队与培养建设花费大量时间与精力,终于架构成型与稳定有时间可以打打酱油了.很久没有总结点啥,提笔想写的内容太多,先放APP接口自动化的内容吧,这个估计大家比较 ...
- 零成本实现接口自动化测试 – Java+TestNG 测试Restful service
接口自动化测试 – Java+TestNG 测试 Restful Web Service 关键词:基于Rest的Web服务,接口自动化测试,数据驱动测试,测试Restful Web Service, ...
- (转)接口自动化测试 – Java+TestNG 测试 Restful Web Service
本文主要介绍如何用Java针对Restful web service 做接口自动化测试(数据驱动),相比UI自动化,接口自动化稳定性可靠性高,实施难易程度低,做自动化性价比高.所用到的工具或类库有 T ...
- 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析
一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...
- Effective Java 第三版——35. 使用实例属性替代序数
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——89. 对于实例控制,枚举类型优于READRESOLVE
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- python接口自动化测试二十:函数写接口测试
# coding:utf-8import requestsimport refrom bs4 import BeautifulSoup # s = requests.session() # 全局的s ...
- 接口自动化测试框架搭建 – Java+TestNG 测试Restful service
接口自动化测试 – Java+TestNG 测试 Restful Web Service 关键词:基于Rest的Web服务,接口自动化测试,数据驱动测试,测试Restful Web Service, ...
随机推荐
- C#如何测试代码运行时间
1.System.Diagnostics.Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 开始监视代码运行时间 // 需要测试 ...
- WPF RichTextBox 做内容展示框 滚动条控制判定是否阅读完成
一.项目背景: 最近,做项目,因为是金融项目,客户登录交易的时候,有一个提示框,就是告知客户要“入市需谨慎”等等,想必大家都遇到这样的场景,当然,这种提示是没人会看的,不过作为交易所,这样的提示又必不 ...
- C语言 · 寻找数组中的最大值
问题描述 对于给定整数数组a[],寻找其中最大值,并返回下标. 输入格式 整数数组a[],数组元素个数小于1等于100.输出数据分作两行:第一行只有一个数,表示数组元素个数:第二行为数组的各个元素. ...
- CentOS On VirtualBox
背景 后台开发需要随时与服务器交互,本人使用Mac开发.但是不愿意在Mac上直接安装redis以及mysql等等工具.所以选择在VirtualenvBox下安装一个服务器系统,并且使用ssh与其连接. ...
- ASP.NET MVC Routing学习笔记(一)
Routing在ASP.NET MVC中是非常核心的技术,属于ASP.NET MVC几大核心技术之一,在使用Routing之前,得先引入System.Web.Routing,但其实不用这么麻烦,因为在 ...
- 2013 duilib入门简明教程 -- 其他 (18)
一.超链接按钮 代码很简单,参见360Demo: <Button text="{u}{a}求助{/a}{/u}" showhtml="true& ...
- php ajax 交互
html 页面 <body> <button id="oBtn">点击我</button> <script type="text ...
- 基于JQuery的浮动DIV显示提示信息并自动隐藏
/** * 浮动DIV定时显示提示信息,如操作成功, 失败等 * @param string tips (提示的内容) * @param int height 显示的信息距离浏览器顶部的高度 * @p ...
- KnockoutJS 3.X API 第六章 组件(4) 自定义元素
自定义元素提供了一种将组件注入视图的方便方法. 本节目录 介绍 例子 传递参数 父组件和子组件之间的通信 传递监控属性的表达式 将标记传递到组件中 控制自定义元素标记名称 注册自定义元素 备注1:将自 ...
- Apk去掉签名以及重新签名的方法
Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败. 网上流传的"勾选允许安装未知来源的应用"其实跟签不 ...


