MockWebServer是一个可脚本化的用于测试HTTP客户端的Web服务器。
主要用于测试你的应用在进行HTTP、HTTPS请求时是否按照预期的行为动作。使用该工具,你可以验证应用的请求是否符合预期,你可以选择返回的响应。

MockWebServer包含了所有的HTTP栈,所以可以测试所有的事。甚至可以直接将真实Web服务器中的HTTP响应内容复制过来,以创建相应的测试用例。此外,还可以测试应用在糟糕的网络环境下的表现,比如500错误或者响应返回缓慢。

http://blog.csdn.net/shensky711/article/details/52771797

mockwebserver包进行网络测试,关于该包的详细资料见 https://github.com/square/okhttp/tree/master/mockwebserver

官方文档中对http的使用方式给出了详细的说明,在此只记录https的使用方式:

MockWebServer serverhttps = new MockWebServer();
serverhttps.useHttps(SslContextBuilder.localhost().getSocketFactory(), false);
// Schedule some responses.
serverhttps.enqueue(new MockResponse()
        .setResponseCode(200)
        .addHeader("Content-Type", "application/json;charset=UTF-8")
        .setBody("bodystring"));
// Start the server.
serverhttps.start();

注意在使用此包时需要对bcprov-jdk15on-154.jar包进行配置,网上搜一下有很多配置方法
---------------------
MockWebServer使用方法和Mockito类似,按照如下步骤。

编写模拟脚本
    运行应用程序代码
    验证做出的请求是否符合预期

下面是官方给的示例代码:

public void test() throws Exception() {
    // 创建一个 MockWebServer
    MockWebServer server = new MockWebServer();

// 设置响应
    server.enqueue(new MockResponse().setBody("hello, world!"));
    server.enqueue(new MockResponse().setBody("sup, bra?"));
    server.enqueue(new MockResponse().setBody("yo dog"));

// 启动服务
    // Start the server.
    server.start();

// 设置服务端的URL,客户端请求中使用
    HttpUrl baseUrl = server.url("/v1/chat");

// 运行你的应用程序代码,进行HTTP请求
    // 响应会按照上面设置中放入队列的顺序被返回
    Chat chat = new Chat(baseUrl);

chat.loadMore();
    assertEquals("hello, world!", chat.message());

chat.loadMore();
    chat.loadMore();
    assertEquals(""
                + "hello, world!\n"
                + "sup, bra?\n"
                + "yo dog", chat.message());

// 可选:确认你的应用做出了正确的请求
    RecordedRequest request1 = server.takeRequst();
    assertEquals("/v1/chat/messages/", request1.getPath());
    assertNotNull(request1.getHeader("Authorization"));

RecordedRequest request2 = server.takeRequest();
    assertEquals("/v1/chat/message/2", request.getPath());

RecordedRequest request3 = server.takeRequest();
    assertEquals("/v1/chat/message/3", request.getPath());

// 关闭服务,因为不能重用
    server.shutdown();
}

单元测试时候,可以把 server 作为一个字段,然后在 tearDown() 方法中关闭服务。
Api接口
模拟Response(MockResponse)

MockResponse 可以默认返回http code是200的response,相依可以设置字符串、输入流、字节数组,设置可以设置Header。

MockResponse response = new MockResponse()
    .addHeader("Content-Type", "application/json,charset=utf-8")
    .addHeader("Cache-Control", "no-cache")
    .setBody("{}");

MockResponse还可以模拟低速率网络的情况。这一点在测试超时和交互式测试时非常有用。

response.throttleBody(1024, 1, TimeUnit.SECONDS);
记录请求(RecordedRequest)

校验请求的请求方法、路径、HTTP版本、请求体、请求头。

RecordedRequest request = server.takeRequest();
assertEquals("POST /v1/chat/send HTTP/1.1", request.getRequestLine());
assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type"));
assertEquals("{}", request.getUtf8Body());

转发器(Dispatcher)

默认情况下 MockWebServer 使用队列来指定响应。另外,可以根据需要使用另外一种响应策略,可以通过转发器来处理器,可以通过请求的路径来选择转发策略。比如,我们可以过滤请求替代 server.enqueue()。

final Dispatcher dispatcher = new Dispatcher() {

@Override
    public MockResponse dispatch(RecordedRequest request) throws InterruptedException {

if (request.getPath().equals("/v1/login/auth/")){
            return new MockResponse().setResponseCode(200);
        } else if (request.getPath().equals("v1/check/version/")){
            return new MockResponse().setResponseCode(200).setBody("version=9");
        } else if (request.getPath().equals("/v1/profile/info")) {
            return new MockResponse().setResponseCode(200).setBody("{\\\"info\\\":{\\\"name\":\"Lucas Albuquerque\",\"age\":\"21\",\"gender\":\"male\"}}");
        }
        return new MockResponse().setResponseCode(404);
    }
};
server.setDispatcher(dispatcher);

集成

Gradle

testCompile 'com.squareup.okhttp3:mockwebserver:(insert latest version)'

Maven

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>mockwebserver</artifactId>
  <version>(insert latest version)</version>
  <scope>test</scope>
</dependency>

1.为什么要搭建mock-server?

为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个 web 容器,这个本地环境就是 mock-server。

目前很多前端 mock 数据的方案的基本流程都是使用 node.js 来模拟 http 请求,配置 router 返回 mock 数据。

一个比较好的 mock-server 该有的能力:

1.与线上环境一致的接口地址,每次构建前端代码时不需要修改调用接口的代码

2.所改即所得,具有热更新的能力,每次增加 /修改 mock 接口时不需要重启 mock 服务,更不用重启前端构建服务

3.能配合 Webpack

4.mock 数据可以由工具生成不需要自己手动写

5.能模拟 POST、GET 请求

6.简单(包括:文件结构简单、编写代码简单)

2.我们mock server 服务器

1.就是一个基于Node的 Express web 搭建的一个本地server。

2.数据mock的思路就是在这个本地server端进行,Promise 发出http请求,通过 router 返回mock数据。

3.与线上环境一致,前端代码构建和接口服务是分开独立的

app.listen(3001, () => {

debug(`The fake API server is listening on ${'3001'.rainbow}.`)

}) //启动一个服务并监听从 3001 端口进入的所有API连接请求

在webpack 配置中, 比较简单:

proxy: {

'/api/*': {

target: `http://${host}:3001`,

secure: false,

},

将匹配 ‘/api/*’ 这种格式的API的域名重定向为 http://${host}:3001

4.具有热更新的能力,每次增加 /修改 mock 接口(入口api/index.js)时自动重启 mock 服务

nodemon 自动重启的工具 启动 mock server

5.mock 数据可以由工具生成不需要自己手动写,还能模拟 POST、GET 请求

用到LowDB,LowDB 基于Lo-Dash 中间件, 基于Node的纯Json文件数据库,LowDB支持 JSON Server 和 JSONPlaceholder.

dbs[entry] = low(`${entries[i]}/data.json`)

返回或者创建一个Lo-Dash包裹数组。然后,您可以使用这些方法: where, find, filter, sortBy, groupBy, ...和来自Underscore.db的方法

目录结构,根据大模块划分了mock数据目录结构,

每一个模块下,都有个schemas/*.js  Object类型 default 数据定义,然后JSON.stringify(data)转为JSON 字符串,同步写入data.json文件中。用到Faker.js 的一些API。 (mock一些不变的数据)

每一个模块下,都有routes/*.js , 每个模块都对应创建了 express.Router() 实例,在具体app.get(‘/’, (req, res)) 对应的URL 或 路由 来模拟POST 或者GET 请求 以及PUT和DELETE请求,固定的status code 对应了不同的error。

6.简单(包括:文件结构简单、编写代码简单)

如何在src (业务代码) 中调用mock server呢?

在src 下modules/*.js 中定义Promise 请求

export const myFun = () => ({

  type: MYFUN,

  promise: (dispatch, getStore, api) => api.get(URL.myFun)

})

URL 对应配置了不同环境的url 请求, 生产环境(真实),开发环境 (mock server 路由),测试环境(unit test)

MockWebServer--环境的更多相关文章

  1. MockWebServer使用指南

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52771797 本文出自: [HansChen的博客] MockWebServer介绍 ...

  2. MockWebServer使用指南(转载)

    转载自(http://blog.csdn.net/shensky711/article/details/52771797 ) MockWebServer介绍 MockWebServer是square出 ...

  3. 配置android sdk 环境

    1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/

  4. Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境

    一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...

  5. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  6. win10 环境 gitbash 显示中文乱码问题处理

    gitbash 是 windows 环境下非常好用的命令行终端,可以模拟一下linux下的命令如ls / mkdir 等等,如果使用过程中遇到中文显示不完整或乱码的情况,多半是因为编码问题导致的,修改 ...

  7. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  8. 总结:Mac前端开发环境的搭建(配置)

    新年新气象,在2016年的第一天,我入手了人生中第一台自己的电脑(大一时好友赠送的电脑在一次无意中烧坏了主板,此后便不断借用别人的或者网站的).macbook air,身上已无分文...接下来半年的房 ...

  9. Android Studio 多个编译环境配置 多渠道打包 APK输出配置

    看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...

  10. [APUE]UNIX进程的环境(下)

    一.共享库 共享库使得可执行文件中不再需要包含常用的库函数,而只需在所有进程都可存取的存储区中保存这种库例程的一个副本.程序第一次执行的时候或第一次调用某个库函数的时候,用动态链接方法将程序与共享库函 ...

随机推荐

  1. JAVAORM框架之Mybatis (Ibatis) 详解

    目录 Mybatis基础概念 Mybatis开放方式演进 Mybatis框架核心要点 关联查询 延迟加载(懒加载) 动态SQL Mybatis缓存 Mybatis逆向工程 PageHelper分页插件 ...

  2. 统计Java项目的代码行数

    Java项目谈论行数多少有点无聊,但是有的时候就想看看一个开源的代码的量级,用Shell命令统计再合适不过了 去掉空行和注释: find . -name "*.java" |xar ...

  3. Python开发一个多并发的FTP SERVER

    允许同时支持多用户在线 用户认证 用户空间配额 权限限制 可上传下载,上传下载中显示进度条 用户可远程切换目录,查看服务端文件列表等 可断点续传

  4. hdu1540 Tunnel Warfare【线段树】

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  5. java 中形参与实参的转换

    java中有两个参数,一个是形参,一个是实参. 形参:在函数定义中,整个函数体内部都可以使用,离开了该函数就不能继续使用. 实参:出现在主函数中,进入被调函数后,实参变量也就不能继续使用. publi ...

  6. JDBC及Filter

    JNDI容器:Java Naming Directory Interface,java命名目录接口EJB:javaEE服务器端组件模型,Enterprise JavaBean,设计目标与核心应用是建立 ...

  7. MySQL命令:创建数据库、插入数据

    简介: 学习mysql环境为ubantu,下面记录一些基本的创建数据库和插入数据的口令 打开MySQL 服务并使用 root 登录: --打开 MySQL 服务 sudo service mysql ...

  8. Visual Studio 2017 调试 windows server 2016 Docker Container

    网上很多文章都是在win10下,用Docker for windows工具进行Docker的安装部署的.用知道windows server 2016已经原生支持Docker了,其windows Con ...

  9. pyqt5 主界面打开新主界面、打开Dialog、打开提示框的实现模板

    import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ###### ...

  10. dedecms调用副栏目文章怎么操作

    最近ytkah的网站进行改版,添加了一些新栏目,做更精准的着陆页,有些文章比较简短并且很早以前就发布过了,如果再添加这样的文档就有点重复了,于是就想着用文章副栏目的属性,可却调不出来,怎么办?查找官方 ...