Swagger Core
最后更新于:2022-04-01 09:43:44
> 今天我们来学习Swagger庞大体系中的第一个工具:`Swagger Core`,想要学习这个,需要有`swagger-simaples`项目的帮助。`swagger-simaples`提供了很多解释swagger-core作用的例子,以便帮助你理解`Swagger Core`中的项目,跟我一探究竟吧!
## swagger-core
[swagger-core](https://github.com/swagger-api/swagger-core)含有如下子项目:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb25dc197.jpg)
针对不同的web框架,提供了多种针对性jar包。
## swagger-simaples
[swagger-samples](https://github.com/swagger-api/swagger-samples/tree/master/java)项目是为了针对我们的swagger-core的工具,编写的样例,方便大家理解的。里面还有`java`和`scala`的项目,目前我们只关注`java`的。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb2603d14.jpg)
## 源码编译
我将这两个项目的源码都clone到本地,然后编译,以确保正确导入到eclipse中
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb2748e23.jpg)
simaples项目源码编译:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb278a6e9.jpg)
## 实例
我们找一个例子来实际看看`swagger-core`到底是做什么的?
我们来看[java-jaxrs](https://github.com/swagger-api/swagger-samples/tree/master/java/java-jaxrs)项目,按照github上的教程,启动完服务器后,我们在本地访问`http://localhost:8002`,打开后如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb2866b69.jpg),这个时候你就可以看到利用`swagger-core`生成的api文档,具体这个界面里面的东西,我会在下一篇`swaager-ui`的文章来讲解。
那我们来看看他如何生成这个文档的,或者说如何将代码里的接口呈现在我们眼中的呢?
## 工作原理
`java-jaxrs`项目依赖的是`swagger-core`的`swagger-jaxrs`项目,由此可以看出`swagger-core`中的子项目是针对特定框架分开来开发的。而`swagger-jaxrs`项目针对的是[jaxrs](http://baike.baidu.com/link?url=D-yOgrIzkR4lZF50UNNqZT69yva7qRGOEi9V8Ao3eiZ4HqqeXRY8UMlCrToR-YDTthDzKjz3IksvjZ_yDnsNs_)技术开发的`web`项目。那么他是怎么通过你的项目生成`api`可视文档的呢?
方式是注解!`swagger-jaxrs`提供了很多可供调用的注解方式,方便研发在添加代码生成我们需要的接口信息,请看项目中的使用代码:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb28b24ee.jpg)
这一段代码,生成的api信息如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb29033f0.jpg)
具体的注解代表什么意思,有时间我会一一道来的。
想随时随地了解我的文章,请关注下面的微信公众号,我会不定时推送新文章
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb2957435.jpg)
Swagger介绍
最后更新于:2022-04-01 09:43:42
> 官网:[swagger](http://swagger.io/)
## Swagger
一个开源的接口框架,提供了多种工具,帮助你解决与`api`的不同的情况下的问题,包含的子项目如下:
## 核心工具
| 名称 | github地址 | 作用 |
| --- | --- | --- |
| [Swagger Core](http://swagger.io/swagger-core/) | [https://github.com/swagger-api/swagger-core](https://github.com/swagger-api/swagger-core) | Java依赖库,用于生成或阅读`Swagger definitions`,可以理解为Swagger的一个中间产物 |
| [Swagger Codegen](http://swagger.io/swagger-codegen/) | [https://github.com/swagger-api/swagger-codegen/tree/develop_2.0](https://github.com/swagger-api/swagger-codegen/tree/develop_2.0) | 通过`Swagger definitions`在命令行下生成Client/Server端的代码 |
| [Swagger UI](http://swagger.io/swagger-ui/) | [https://github.com/swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui) | 一个简单的浏览swagger接口文档的文件服务器 |
| [Swagger Editor](http://swagger.io/swagger-editor/) | [https://github.com/swagger-api/swagger-editor](https://github.com/swagger-api/swagger-editor) | 一个浏览工具,不过支持在线编辑、执行,且能查看响应结果的这么一个工具,支持YAML/Json格式的接口文件下载 |
## 其他工具
| 名称 | github地址 | 作用 |
| --- | --- | --- |
| Swagger JS | [https://github.com/swagger-api/swagger-js](https://github.com/swagger-api/swagger-js) | js客户端,方便使用`js`语言调试 |
| Swagger Node | [https://github.com/swagger-api/swagger-node](https://github.com/swagger-api/swagger-node) | JS依赖库 |
| Swagger-Socket | [https://github.com/swagger-api/swagger-socket](https://github.com/swagger-api/swagger-socket) | 通过`websocket`方式调用`swagger`形式的`api` |
| Swagger Parser | [https://github.com/swagger-api/swagger-parser](https://github.com/swagger-api/swagger-parser) | 工具类,Java语言,独立使用解析`Swagger definitions` |
## 总结
Swagger是个庞大的体系,需要慢慢细啃,这一周就它了。
runscope接口测试服务平台
最后更新于:2022-04-01 09:43:40
> [runscope](https://www.runscope.com/radar/y1erbsgnrws9)是个收费的接口测试服务平台,不过提供了30天的免费体验
## 平台首页
当你注册完后,登录到平台后,会出现如下的面板
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb22472fb.jpg)
展示了我们目前所有的测试任务,以及任务的执行情况。
## 支持批量导入文件格式
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb22eada9.jpg)
这样很好的满足了我们的需求,特别是我昨天的文章中讲到的,当接口数量特别多的时候,App中的接口是可以通过Charles导出为Har的格式的,然后导入到该平台就可以执行了。
## 添加接口用例
首页的左下角区域有添加测试用例的按钮
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb2309ed7.jpg)
你需要在输入框中输入这次测试的名称,然后点击`Create Test`按钮,比如我输入`test`然后跳入到如下页面:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb2324018.jpg)
我们填入我们要测试的接口,比如`www.baidu.com`,这个时候我们就已经录制了一条case了,现在点击`Save&Run`按钮,我们的测试任务就开始执行了,执行完可以看到结果信息:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb235260c.jpg)
默认我们是带状态码检测的。这一条case就这么简单的录制了
## 添加验证
runscope添加验证点也非常方便,只需要在接口编辑页面点击`Assertions`
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb23774f5.jpg)
默认情况下只验证状态码,如果你想添加验证点,可以点击`Add Assertion`,为了帮助你添加验证,还将返回信息放在了下面,你点击`Last Response Data`就能看到:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb239f3ac.jpg)
我添加了一个验证,返回内容中包含`百度首页`,然后我们点击`Sava&Run`执行任务,执行结束后可以看到我们的添加的验证是执行成功的。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb242dc9d.jpg)
## 设置测试计划
你肯定不止希望接口测试就做一次就没有了,runscope也提供了这个功能:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb24ba23c.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb2508eb0.jpg)
比如我们设置每5分钟执行一次,设置如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb252fe68.jpg)
这个时候我们的任务就可以持续的执行了,返回到Tests菜单,这个时候我们可以看到周期任务的整体信息:
![](image/56cbd8b08d17d.jpg)
显示了所有的执行情况,每一个树形的蓝条代表一次执行的成功,红色的话就代表失败了,也有成功的百分比,和平均响应时间。
默认是一天的情况,你也可以选择30d或者1h的总览情况。
## 邮件通知
会定时给你发送邮件,邮件内容如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb254f127.jpg)
## 数据统计
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb25af475.jpg)
## 总结
这个平台兼容各种测试工具的测试集,比如Swagger,Postman,Flidder或者Har文件格式,这样可以更方便的将不同的测试方式转化到该平台上,是个很不错的方式。
postman+newman+jenkins组合
最后更新于:2022-04-01 09:43:37
> 这样的组合可以快速的让你开始接口测试,一起来看看这个小儿美的接口测试工具吧
## Postman-录制Case
### 安装Postman
[Postman](http://www.getpostman.com/)现在是一个单独的`App`,以前是`Chrome`的一个插件,现在单独出来了。
### 安装Postman Interceptor
记得一定要安装`Postman Interceptor`插件,这样在`chrome`浏览器上访问的信息都会在`postman`的app端同步显示。安装好后`Postman Interceptor`会在浏览器的右边显示,如下:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1a31798.jpg "")
### 连接Postman和Interceptor
在我们使用`postman`前,开启这个工具:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1a4403f.jpg "")
我是在`mac`下安装`postman`的,打开后如下:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1a67093.jpg "")
点击图中红框的按钮,打开`Interceptor`开关。
这样的工作准备完毕后,我们就可以通过`chrome`正常访问了。
### 录制请求
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1ac0b78.jpg "")
这样就录制了一条url了。
### 过滤特定url
如果你想录制特定的url的访问请求,可以在`postman interceptor`中加过滤条件:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1b06cae.jpg "")
这样我们就只录制跟`testerhome`相关的请求了。
### 编写验证
有了url只是开始,现在执行一下这个请求:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1b3f0cc.jpg "")
执行完后,我们有了返回值了,我们可以根据这个填写验证点
比如我们想验证返回的结果中是否包含了`TesterHome`,然后再来个反例,看是否包含`Doctorq`
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1d720b3.jpg "")
验证语句如下:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1d8a2f6.jpg "")
这个时候执行,我们就能看到执行结果如下:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1dbc440.jpg "")
测试结果显示也很清晰。
用例已经执行完了,我们要把用例导出,用`newman`来执行:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1dd9d29.jpg "")
`ok`,到`newman`了。
## Newman-执行Case
[newman](http://www.getpostman.com/docs/newman_intro)安装文档
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1f17437.jpg "")
安装成功后,执行上面命令,可以显示版本信息,现在可以执行接口测试了。
如果你出现如下错误,请看[newman github](https://github.com/postmanlabs/newman),是因为node4.0以上的版本支持最新的newman,所以我们下载最新的。
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1f580da.jpg "")
~~~
npm install -g newman@beta
~~~
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb21043e7.jpg "")
这个时候执行就没问题,执行完毕后,会看出结果的详细信息。如果加上参数,可以生成如下报告:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb213f2d6.jpg "")
**`newman`也可以直接执行`postman`云端保存的`collections`,**
具体怎么做请参考上面的文章。
因为`newman`的方式是通过命令行的方式,所以就可以通过`jenkins`去做定时自动化回归测试了。
## Jenkins-自动化回归
具体怎么在Jenkins里面配置我就不讲解了
## 缺点
-
无法直接导入HAR包,不过现在呼声很高,请查看[github上的support](https://github.com/postmanlabs/postman-app-support/issues/86)
-
App无法通过代理直接连接POSTMAN,这样录制移动端的http请求就很麻烦
这两种局限性,目前的想法的通过将har文件转为能导入postman的文件格式,有时间去尝试下。
解析har文件
最后更新于:2022-04-01 09:43:35
> 之前我已经研究到让业务测试通过不同方式来获取我们工具需要的har文件,现在我们拿到了业务测试提供的har文件,我们首先要解析这些文件里存放的信息,特别是`entries`字段里的信息,在万能的`github`上果然搜出来一个工具包
## 地址
[har](https://github.com/DoctorQ/har)
因为maven库里还没有这个jar包提供下载,你需要将源码下载到本地,打包后上传到自己公司的私有库里,供其他开发者下载
## 源码
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1a11a04.jpg "")
主要的类为`HarUtils.java`,还有命令行下执行需要的2个类(`HarCli.java`,`ViewHar.java`),这两个类的主要作用请看我之前的文章[Java命令行程序构建工具-airline ](http://blog.csdn.net/itfootball/article/details/50541960),最后剩下来的就是model包中的实体类了,一一对应了`har`文件中的信息实体。
### HarUtils.java
~~~
/**
*
* har - HAR file reader, writer and viewer
* Copyright (c) 2014, Sandeep Gupta
*
* http://sangupta.com/projects/har
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.sangupta.har;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.io.FileUtils;
import com.google.gson.JsonElement;
import com.google.gson.JsonSyntaxException;
import com.sangupta.har.model.Har;
import com.sangupta.har.model.HarEntry;
import com.sangupta.har.model.HarPage;
import com.sangupta.jerry.util.AssertUtils;
import com.sangupta.jerry.util.CheckUtils;
import com.sangupta.jerry.util.GsonUtils;
/**
* Utility class for working with HAR files.
*
* @author sangupta
*
*/
public class HarUtils {
/**
* Read the HAR file and create an {@link Har} model instance from the same.
*
* @param file
* the file to be read
*
* @return the {@link Har} instance
*
* @throws JsonSyntaxException
* if the JSON is not well formed
*
* @throws IOException
* if reading the file fails
*
* @throws IllegalArgumentException
* if the file does not exist, is a directory or is not a valid
* file
*/
public static Har read(File file) throws JsonSyntaxException, IOException {
CheckUtils.checkFileExists(file);
return GsonUtils.getGson().fromJson(FileUtils.readFileToString(file), Har.class);
}
public static Har read(String harJson) throws JsonSyntaxException, IOException {
if(AssertUtils.isEmpty(harJson)) {
throw new IllegalArgumentException("HAR Json cannot be null/empty");
}
return GsonUtils.getGson().fromJson(harJson, Har.class);
}
public static Har read(Reader harReader) throws JsonSyntaxException, IOException {
if(harReader == null) {
throw new IllegalArgumentException("HAR reader cannot be null");
}
return GsonUtils.getGson().fromJson(harReader, Har.class);
}
public static Har read(JsonElement jsonElement) throws JsonSyntaxException, IOException {
if(jsonElement == null) {
throw new IllegalArgumentException("HAR JsonElement cannot be null");
}
return GsonUtils.getGson().fromJson(jsonElement, Har.class);
}
/**
* Connect references between page and entries so that they can be obtained as needed.
*
* @param har
*/
public static void connectReferences(Har har) {
if(har == null) {
throw new IllegalArgumentException("HAR object cannot be null");
}
if(har.log == null || AssertUtils.isEmpty(har.log.pages)) {
// nothing to do
return;
}
if(AssertUtils.isEmpty(har.log.entries)) {
// no har entry - initialize empty list
for(HarPage page : har.log.pages) {
page.entries = new ArrayList<HarEntry>();
}
return;
}
for(HarPage page : har.log.pages) {
String pageID = page.id;
List<HarEntry> entries = new ArrayList<HarEntry>();
for(HarEntry entry : har.log.entries) {
if(pageID.equals(entry.pageref)) {
entries.add(entry);
}
}
// sort these based on start date
Collections.sort(entries);
// set the parent reference
page.entries = entries;
}
}
}
~~~
提供了如下几个方法获得`Har`对象:
| Method | 解释 |
|-----|-----|
| read(File) | 以har文件为参数,生成har对象 |
| read(JsonElement) | 以JsonElement对象为参数 |
| read(Reader) | 从字节流中获得har对象 |
| read(String) | 从字符串中获取har对象 |
| connectReferences(Har har) | 将har文件中pages和enties字段中的page信息关联起来 |
## 实例
~~~
public class HarParserTest {
@Test
public void parserFile() throws Exception {
File file = new File("/Users/wuxian/Desktop/interface/www.baidu.com.har");
Har har = HarUtils.read(file);
System.out.println("HarParserTest.parserFile() : " + har.toString());
}
}
~~~
输出信息:
~~~
HarParserTest.parserFile() : Har [log=HarLog [version=1.2, creator=HarCreator [name=WebInspector, version=537.36, comment=null], browser=null, pages=[HarPage [startedDateTime=2016-01-18T08:50:23.913Z, id=page_2, title=http://www.baidu.com/baidu.html?from=noscript, pageTimings=HarPageTiming [onContentLoad=82.36399999987043, onLoad=97.73299999869778, comment=null], comment=null]], entries=[HarEntry [pageref=page_2, startedDateTime=2016-01-18T08:50:23.913Z, time=10.068999999930384, request=GET http://www.baidu.com/baidu.html?from=noscript HTTP/1.1, response=HTTP 200 (OK), cache=com.sangupta.har.model.HarCache@46b44bc2, timings=HarTiming [blocked=0.663999999233056, dns=-1.0, connect=-1.0, send=0.10800000018207301, wait=7.102999999915481, receive=2.1940000005997735, ssl=-1.0, comment=null], serverIPAddress=null, connection=31193, comment=null], HarEntry [pageref=page_2, startedDateTime=2016-01-18T08:50:23.971Z, time=9.560000000419677, request=GET http://www.baidu.com/img/bd_logo1.png HTTP/1.1, response=HTTP 200 (OK), cache=com.sangupta.har.model.HarCache@66d9d1d1, timings=HarTiming [blocked=1.37800000084098, dns=-1.0, connect=-1.0, send=0.09800000043469992, wait=6.0219999995752, receive=2.0619999995687976, ssl=-1.0, comment=null], serverIPAddress=null, connection=31193, comment=null], HarEntry [pageref=page_2, startedDateTime=2016-01-18T08:50:23.971Z, time=12.46499999979278, request=GET http://www.baidu.com/img/baidu_jgylogo3.gif HTTP/1.1, response=HTTP 200 (OK), cache=com.sangupta.har.model.HarCache@665e2517, timings=HarTiming [blocked=0.743999999031075, dns=2.062999999907335, connect=3.28100000115228, send=0.11999999878752998, wait=5.31500000033698, receive=0.9420000005775808, ssl=-1.0, comment=null], serverIPAddress=null, connection=32311, comment=null], HarEntry [pageref=page_2, startedDateTime=2016-01-18T08:50:23.972Z, time=15.82599999892409, request=GET http://www.baidu.com/img/gs.gif HTTP/1.1, response=HTTP 200 (OK), cache=com.sangupta.har.model.HarCache@2ed53d82, timings=HarTiming [blocked=0.84199999946577, dns=1.9300000003568099, connect=3.2869999995455204, send=0.08600000001024011, wait=7.40299999961276, receive=2.277999999932989, ssl=-1.0, comment=null], serverIPAddress=null, connection=32312, comment=null]], comment=null]]
~~~
## 总结
我们得到Har信息,可以做的就很多了,我们通过har文件,解析出来所有的url和参数,这样就可以得到一批接口信息。那么实际能做什么呢,静待后续。
获取APP的接口har文件
最后更新于:2022-04-01 09:43:33
> 之前的录制方式都是PC端的访问,但是如果我们想录制我们自己APP后台请求接口的信息呢,如果获得这个har文件呢?其实也很简单,就是通过Charles,让手机的访问请求走这个Charles代理就行了
## Charles方式
### 开启Charles代理
[iOS开发工具——网络封包分析工具Charles](http://www.infoq.com/cn/articles/network-packet-analysis-tool-charles/)
根据这个文章的配置,将手机连接到pc到的代理
### 开启录制
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb17ecd00.jpg "")
点击上图红框标注的第二个按钮,就可以开启/关闭录制,第一个为清空数据按钮。
我们这次开启这个录制功能。然后操作我们手机端的APP,Charles的客户端会刷新出很多数据,这些数据都是手机端的请求。
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb192ac6e.jpg "")
### 保存为har文件
选择你想要保存的url数据,然后点击`File->Export`选择文件类型为HAR文件即可。
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb198e015.jpg "")
录制har文件
最后更新于:2022-04-01 09:43:31
> 如有转载,请注明来源与`testerhome.com`
昨天我们用selenium自动化的方式,获得了har文件,今天我们找一个普通,不懂代码的业务测试也能录制case的方式
## 原理
原理是用`browsermob-proxy`可执行文件作为本地代理,监听某个端口,然后在系统中设置web服务器的代理url,让每一次的web请求都先走我们本地的代理,这样数据会先在代理服务器上保存数据,我们通过RESTAPI获得这些har数据保存到本地
## 步骤
### 启动代理服务
上一篇[文章](http://blog.csdn.net/itfootball/article/details/50517659)的结尾,我讲解了如何安装启动`browsermob-proxy`服务器,默认你已经看过那篇文章了,现在我们启动该服务,命令为`sh browsermob-proxy -port 9090`,启动后
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb0ff21a4.jpg "")
如果是上图,信息表明我们的服务已经启动了,记住我们启动的端口,后续会用到。
### 创建代理
代理服务启动后,代理的实例还没有创建成功,需要我们自己创建一个,创建方式是通过`REST api`的方式,命令为`curl -X POST -d 'port=9099' http://localhost:9090/proxy`,其中红框标注的为我们刚才启动代理服务的端口号,参数`-d`后面的`9099`是我们代理的端口号,这个一定要理解清楚,命令执行成功后出返回一个`json`字符串,里面包含了`port`字段就是你设置的代理端口号。
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb11de175.jpg "")
创建成功后,在服务器端会输出如下信息:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb120be66.jpg "")
### 设置系统代理
用`Chrome`浏览器打开[代理设置](http://jingyan.baidu.com/article/15622f2474b91cfdfcbea501.html),我用的是`mac`,会弹出代理设置
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb124f43e.jpg "")
将`web`的两项设置全部进行如下更改,里面的信息要安装服务器显示的`host`和端口号来填。
- Web代理[HTTP]
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1282882.jpg "")
- 安全Web代理(HTTPS)
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb12ed5a7.jpg "")
设置完成后记得保存,如果你不想设置系统代理,看另外一种插件式的代理
### 浏览器插件设置代理
`SwitchySharp`插件,添加到`chrome`后,进行配置
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1344368.jpg "")
这样我们勾选后,就能让浏览器走代理了
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1483c25.jpg "")
现在我们在浏览器上访问的时候,会发现服务器是有反应的。
建议使用浏览器插件的方式设置代理,这样不影响其他的上网需求。
### 创建HAR进行数据记录
现在我们开启我们的代理服务器,以及开启了`9099`端口的代理,而且将浏览器的代理设置成这个`9099`端口的代理,现在我们的网络访问就会走`9099`这个代理了。
### 开启录制
命令:`curl -X PUT -d 'initialPageRef=Doctorq' http://localhost:9090/proxy/9099/har`上面的命令将这次录制的`case`页面名称定为了`Doctorq`,这样我这条`case`就可以通过`Doctorq`来找到,这个命令执行后,我们的录制功能已经开启了,这个时候你在网页上的请求,就会被我们的代理捕获,数据也会被保存。
### 获取HAR信息
命令:`curl http://localhost:9090/proxy/9099/har`,这个时候命令行会输出`har`的信息:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb14b3363.jpg "")
如果你觉得看的不太清楚,你可以通过保存到本地文件:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1732460.jpg "")
这样我们可以在har查看工具中查看该文件的信息:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb1752659.jpg "")
## SSL
对于`https`的请求,需要自己安装`ssl`证书。
browsermob-proxy
最后更新于:2022-04-01 09:43:28
> 参考文章:
[browsermob-proxy](https://github.com/lightbody/browsermob-proxy#new-browsermobproxy-api)
[lightbody](http://bmp.lightbody.net/)
[selenium](http://wenku.baidu.com/link?url=WbKRY4nmP8VQUkwn8sKRYm97yfFab2aOlkgPFzOKo6-XvDfum3uwPXqpcXzqPHsPq2tPvwbTdvuYAfRpakrhRmRqmVL4pa8dW8bEnoHmouS)
## browsermob-proxy是什么
提供命令行的方式或者嵌入到Java项目中通过api方式生成HAR文件的插件,属于selenium的一个子项目。具体的流程有点类似与Flidder或Charles。原理开启一个端口监控某个端口下的所有HTTP请求,进行数据抓取。
## Java API
### 依赖
~~~
compile 'net.lightbody.bmp:browsermob-core-littleproxy:2.1.0-beta-4'
compile 'org.seleniumhq.selenium:selenium-java:2.49.0'
~~~
### 代码
~~~
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start();
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
WebDriver driver = new FirefoxDriver(capabilities);
proxy.newHar("http://www.baidu.com");
driver.get("http://www.baidu.com");
Har har = proxy.getHar();
har.writeTo(new File("baidu.com.har"));
driver.close();
~~~
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb0d238b2.jpg "")
运行过程如下:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb0d3e319.jpg "")
## 命令行
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb0f53b5b.jpg "")
下载release版本后,解压,进入该目录bin目录下,执行命令`sh browsermob-proxy`输出如下信息:
~~~
58deMacBook-Pro-7:bin wuxian$ sh browsermob-proxy
Running BrowserMob Proxy using LittleProxy implementation. To revert to the legacy implementation, run the proxy with the command-line option '--use-littleproxy false'.
[INFO 2016-01-14T19:23:50,254 net.lightbody.bmp.proxy.Main] (main) Starting BrowserMob Proxy version 2.1.0-beta-4
[INFO 2016-01-14T19:23:51,510 org.eclipse.jetty.util.log] (main) jetty-7.x.y-SNAPSHOT
[INFO 2016-01-14T19:23:51,546 org.eclipse.jetty.util.log] (main) started o.e.j.s.ServletContextHandler{/,null}
[INFO 2016-01-14T19:23:52,463 org.eclipse.jetty.util.log] (main) Started SelectChannelConnector@auto.58corp.com:8080
~~~
HAR
最后更新于:2022-04-01 09:43:26
> 参考文章
[雪球的 HttpApi 接口测试框架设计](https://testerhome.com/topics/3614)
[HAR(HTTP Archive)规范](http://weizhifeng.net/har-12-spec-chinese-edtion.html)
[神器——Chrome开发者工具(一)](http://segmentfault.com/a/1190000000683599)
## HAR是什么
一句话:关于HTTP所有的信息的一种文件保存格式
## HAR获取
我用的是`chrome`浏览器,按`Option+Command+I`来打开开发者选项,选择`Network`选项:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb0958c9a.jpg "")
这个时候我们看不到关于网络相关的信息,我们需要重新刷新下url地址栏,重新发起一次请求,这个时候`Network`会刷新出信息:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb098bee5.jpg "")
这个时候我们在输出区点击右键,会出现一个菜单,找到`Save as HAR with Content`按钮
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb09bc7bd.jpg "")
会将当次请求的信息全部保存为har格式的文件,我们就将HTTP相关的信息保存到本地了
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb0a88440.jpg "")
## 查看HAR文件
### 信息内容
如果你想看看HAR里到底保存了啥,方法很容易,直接将该文件拖拽到浏览器中,可以看到如下JSON信息:
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb0b0563c.jpg "")
### RD自查
但是如果RD想查看当时url的问题,可以通过专业的HAR查看器来查看,比如[Chrome HAR Viewer](http://ericduran.github.io/chromeHAR/):
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-23_56cbdb0bc9f1c.jpg "")
## 总结
如果想看看HAR各个信息代表的啥意思,我参考我最上面的参考文章,里面有详细的解释。好了,我继续向下学习了。
前言
最后更新于:2022-04-01 09:43:24
> 原文出处:[接口测试](http://blog.csdn.net/column/details/dqappinterface.html)
作者:[itfootball](http://blog.csdn.net/itfootball)
**本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!**
# 接口测试
> 接口测试在2015年掀起了一股风暴,2016年上半年这股风必将继续挂着,所以研究接口测试很有必要