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年上半年这股风必将继续挂着,所以研究接口测试很有必要
';