51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2120|回复: 0
打印 上一主题 下一主题

MockNet -- Android网络接口开发与测试神器

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-4-28 14:58:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近写了一个轻量级的服务器框架 MockNet,可以在 Android 上或者 Java 平台快速搭建服务器,方便开发和测
试网络接口,不需要服务器知识就可以使用。

写这个框架的原因

平时写项目的时候,总会遇到这些情况

服务器接口还没有写好,Android 客户端只能先做一些界面的开发工作,遇到需要展示数据的地方只能先留着
或者用一些假数据填充,服务器接口写好以后,这些代码又得删掉或者再改。
在调试网络接口的时候,往往需要后台客户端一起配合,有时候会花不少时间确认是服务器还是客户端的问
题,之后联调也很花时间。
在没有网络但是又需要展示应用功能的时候,只能用一堆 if else 来添加假数据或者数据库里的数据。代码写
起来很不方便。
写这个框架就是想解决这些问题。

首先是网络接口开发的问题,通过 MockNet 这个库,无需后台接口完成就可以进行网络接口的开发,开发
流程要更顺畅一点。
其次是网络接口调试的问题,通过 MockNet 这个库,在没有后台同学的帮助下也可以对 Android 客户端网
络接口进行调试。
最后是没有网络需要展示功能的问题,通过 MockNet 这个库,没有网络一样可以展示应用的网络功能。
框架介绍

MockNet 是为了方便客户端网络接口的开发和测试而写的,简单来说就是在本地启动服务器用来响应客户
端的网络请求。但是不需要有服务器开发知识,几行代码就可以添加此功能。

库下载

Gradle

// 在模块的 gradle 文件中添加下面的代码  
  1. compile 'com.zy.mocknet:mocknet:1.0'
  2. Maven

  3. <dependency>
  4.   <groupId>com.zy.mocknet</groupId>
  5.   <artifactId>mocknet</artifactId>
  6.   <version>1.0</version>
  7.   <type>pom</type>
  8. </dependency>
复制代码

jar包下载
mocknet_1_0_0.jar

框架使用

使用示例
MockNet 使用简单,步骤如下:

修改网络访问 ip 为本地 ip (127.0.0.1:port 或 本地真实ip:port),因为服务器是在本地搭建的。
初始化。
// 创建 MockNet
MockNet mockNet = MockNet.create();
添加对请求的处理
MockNet 中对每一个 request 都会对应一个 response,request 和 response 和起来称为一个 MockConnection,
添加对请求的处理就是添加 MockConnection 实例。


MockConnection conn = MockConnectionFactory.getInstance()
.createGeneralConnection("/*", "general connection");
mockNet.addConnection(conn);
createGeneralConnection(String, String) 第一个参数是请求 url,例:/test,第二个参数是返回内容。这是最
简单的创建方式,更多的 MockConnection 创建方式可以参看 MockNet介绍 或者 java文档

启动服务
// 默认使用 8088 端口
mockNet.start();
// 使用指定的端口
mockNet.start(int port);
关闭服务
mockNet.stop();
以上就是 MockNet 的使用方法。还可以通过链式调用来写,代码更简洁。

  1. MockNet mockNet = MockNet.create()
  2.                 .addConnection(MockConnectionFactory.getInstance()
  3.                         .createGeneralConnection("/test", "{'res':'ok'}"))
  4.                 .addConnection(MockConnectionFactory.getInstance()
  5.                         .createGeneralConnection("/*", "{'res':'ok'}"))
  6.                 .start();
复制代码

进阶使用

上面是 MockNet 的简单使用,还有更多的扩展用法。

自定义 MockConnection
通过 MockConnection.Builder 生成 Builder,并通过 Builder 相关方法构建 MockConnection。Builder 常用的方
法可以参看文档:Builder
随机对请求做出响应
MockNet 内部通过 url 和 method(GET,POST等)来对请求做出区分,在 addConnection 时如果添加了多个
相同的 url 和 method 的 MockConnection,会通过 IConnectionSelector 来选择其中之一进行返回,默认使
用 RandomSelector 随机返回。
可以通过 实现 IConnectionSelector 接口并通过 MockNet.setSelector() 设置返回规则。
Log 设置
默认对每个 MockConnection 都会输出 Log 以帮助调试,如果想关闭 Log,可以在构建 MockConnection 时
设置 isLog(false)。
MockNet 的 Log 输出是由 Logger 和 Printer 完成的,默认设置了 AndroidPrinter 和 JavaPrinter,如果想自定
义 Log,可以实现 Printer 接口,并调用 Logger.init(yourPrinter) 设置,但是要在调用了 MockConnection.c
reate() 之后,否则设置会被覆盖为默认设置
自定义 Handler 对请求响应进行处理
MockNet 中对 Request 和 Response 的处理采用了责任链模式(可查看后面的框架介绍),通过添加 Handler
增加处理环节,框架自带的 Handler 有 BlockHandler,LogHandler,VerifyHeaderHandler,VerifyParamHa
ndler,ConnectionHandler。
如果想增加自己的处理环节,请实现 Handler 接口,并通过 MockNet.addHandler(Handler h) 来设置。具体
实现方法可参照框架默认实现的 Handler 代码。
支持 https
支持 https 可以通过下面代码来开启:


MockNet mockNet = MockNet.create();
mockNet.start(ServerSocketFactory.createHttpsServerSocket(int port, String jksPath, String storePwd));
动态处理数据
为了简化使用方法和加快开发速度,默认只支持了返回静态数据,暂时没有对数据进行动态处理。如果想动
态处理请求数据,可以继承 RequestExecutor 接口并实现 execute 方法。在 execute 方法中对请求进行动态
处理,并创建 Reponse 返回。
之后通过 Server 构造函数构造 Server 对象并传入实现 RequestExecutor 接口的类对象。
具体可以参考 MockRequestExecutor 的实现以及 Server 构造函数。
更多使用方法可查看 MockNet 和 java文档

框架架构

上面介绍了框架的使用,这里对框架的实现做一些介绍。
先上一张架构图。



自己认为整个架构还是不错的(-_-)。
整体可分为两层, Server 层和 Application 层。

Server 层
Server 层主要做的工作是 socket 通信和对 Request,Response 的解析。
Server 类主要是对端口的监听,接受 socket 请求并创建 RequestRunnable 处理请求。
RequestRunnable 创建后会加入到线程池中。RequestRunnable 类中对请求进行解析,并把请求发送到 Req
uestExecutor 去处理,RequestExecutor 会返回 Response,RequestRunnable 再负责把 Response 写入到
socket 中。

Application 层
Application 层工作是对 Request 的处理。通过实现 RequestExecutor 接口处理 Request 并返回 Response。
框架中默认实现 RequestRunnable 接口的是 MockRequestExecutor 类,用来返回静态消息,如果想动态处
理请求,需要自己实现 RequestExecutor 接口,框架后续看情况也可能会增加动态处理请求的功能。
MockRequestExecutor 中主要采用责任链模式处理请求,每一个 Handler 都是一个处理环节。这个链式的实
现是之前看过 OkHttp 代码学到的。这里贴代码来看一下。

  1. HandlerChain chain = new RealHandlerChain();

  2. public Response execute(Request request) {
  3.     for (Handler h : userHandlers) {
  4.         chain.addHandler(h);
  5.     }

  6.     if (initHandler) {
  7.         chain.addHandler(new BlockHandler());
  8.         chain.addHandler(new VerifyParamHandler());
  9.         chain.addHandler(new VerifyHeaderHandler());
  10.         chain.addHandler(new LogHandler());
  11.         chain.addHandler(new ConnectionHandler());
  12.     }

  13.     return chain.start(request);
  14. }
  15. 上面是 MockRequestExecutor 的 execute() 函数的实现,首先将 Handler 加入到 chain 中,之后调用 chain.start() 开始调用 Handler 进行处理。
  16. 再看一下 HandlerChain 的 start() 方法实现。

  17. public Response start(Request request) {
  18.     Handler handler = handlers.get(index);
  19.     Response response = handler.handle(request, this, index);
  20.     return response;
  21. }
复制代码

直接调用了 handler.handle()进行处理,在 Handler 的 handle 方法中需要调用下一个 Handler。
框架默认实现了几个 Handler:BlockHandler,VerifyParamHandler,VeriffyHeaderHandler,LogHandler,
ConnectionHandler。
这些通过名字可以看出功能,这里重点看一下 ConnectionHandler。

ConnectionHandler 是处理链调用的终点,负责生成 Response。
ConnectionHandler 的 handle 方法如下:

  1. String method = request.getMethod();
  2. String url = request.getRequestUri();
  3. MockConnection connection =
  4.     ConnectionStore.getInstance().getConnection(method, url);
  5. if (connection == null) {
  6.     return Response.create404Response();
  7. }
  8. Response response = new Response();
  9. // 省略对 Response 的设置
  10. return response;
复制代码

通过请求的 url 和 method 从 ConnectionStore 中获取到 MockConnection,之后用 MockConnection 中的
响应信息创建并填充 Response。
那 ConnectionStore 中的 MockConnection 是什么时候放进去的呢?就是在我们开始通过 MockNet.addCo
nnection() 添加的。

这样整个框架就差不多讲完了,具体的细节就请查看代码吧。感觉整个框架实现不难,模块化和扩展性都
还不错(自夸一下)。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-20 11:08 , Processed in 0.066047 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表