测试与API交互的HTTP调用是一件令人生厌的复杂事情。测试一个真实的Web服务器时,一大堆问题随之产生:脆性测试(brittle test,因为网络或API本身的问题而导致的测试失败)、速度减慢测试(slow test,每一次HTTP调用都要花费好几秒)和不完全测试(“如何触发一个速率限制越界用例?想一想,我只希望速率限制会起作用……”)。

像Android这样的平台HTTP理应是异步调用,问题会变得更加复杂。如果在这些测试组合中添加计时器,那么你就准备好在测试API调用上认输吧。

解决这些问题并且练习这些HTTP调用的一个绝妙方法是,使用一个很好的Mockito(一个Java测试双库 double library)通用程序:ArgumentCaptor。

ArgumentCaptor与混合测试双有几分相似;有点类似存根(stub),也有点类似侦听程序(spy),但不完全是其中任何一个。可以使用参数捕获器捕获并存储传给mock/stub的参数。然而这里真正的亮点是对捕获的参数进行方法调用,对于像Retrofit回调有很大帮助。

译注:Retrofit是一个Android & Java的类型安全REST客户端。

有了Retrofit,我们可以发起一个API调用并提供一个回调方法。当服务器做出响应时,Mockito会使用响应数据执行回调方法。

下面这些代码使用Github API查询用户代码仓库:

这里有三个我们想要测试的用例:理想路径(happy path,获取一些代码仓库并把传递给适配器)、错误路径(error path,向用户提示服务器错误)、特殊用例(special case, 向用户提示没有代码仓库错误)。

如果你的测试依赖于在真实的API服务器,那么第二和第三个用例会很复杂。我了解到最近GitHub有一些DDOS问题,但你肯定不能依赖它们来测试你的错误用例!

然而我们可以通过ArgumentCaptor捕获回调参数,进而完全控制发送的数据。

看一下对理想路径的测试(我用的是Robolectri,建议你也尝试一下):

captor(cb)捕获到回调,调用getValue()方法以后,通过success方法向它传递一些伪对象(dummy object)。

你可能会感叹“啊哈(原来可以这么简单)”。呵呵,如果没有也没关系。接下来可以看一下对错误路径的测试:

像之前一样,我们捕获了回调。但是这一次我们调用了failure方法,它模拟了一个API错误。如果我们需要更有针对性的错误处理(例如:如果返回状态是401,就重定向再登陆;如果是500, 弹出一条普通的系统错误消息),可以通过创建合适RetrofitError对象作为failure调用的参数。

目前为止,ArgumentCaptor的威力真的很赞。我们完全控制了捕获到的对象,并且能够给这些对象设置任意的数据或者触发任意想要测试的错误。

为了让内容更加丰富,下面是对一个特殊用例的测试:

(你可以在GitHub上找到示例的全部源码和工程文件)。

有一个特殊细节要注意:如果在声明捕获器时使用了Mockito注解,

请确保在设置中的某个地方添加了下面代码:

这种测试方法完全符合书中提到的所有特点:快速、健壮、易于使用。我们还可以通过它很容易地测试项目中很少出现的边缘情况(会话超时、服务器维护、特殊值),确保我们的应用正常运行。

虽然本文示例是专门针对某种栈(Android、Robolectric、Retrofit、Mockito),但是类似的方法几乎适用于任何应用。

祝测试愉快!

android服务器接口测试,使用Retrofit和Mockito进行可靠的Android API测试相关推荐

  1. android服务器接口测试,Android单元测试:网络接口测试

    在平日的开发中,我们用后台写好给我们接口去获取数据.虽然我们有一些请求接口的工具,可以快速的拿到返回数据.但是在一些异常情况的处理上就不太方便了.我列出以下几个痛点: 快速的查看返回数据与数据的处理. ...

  2. Android之全面解析Retrofit网络框架封装库

    转载请标明出处:[顾林海的博客] 前言 Retrofit是Square公司推出的一个HTTP的框架,主要用于Android和Java,Retrofit会将每一个HTTP的API请求变成一个Java的接 ...

  3. Android进阶知识:Retrofit相关

    1.前言 Retrofit是什么?Retrofit是一个遵循RESTful设计的进行HTTP网络请求框架的封装,是现在Android端最火的进行网络请求的库.就像Volley是谷歌官方对HttpURL ...

  4. 基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流

    基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流 实现效果 引库 推流流程 代码实现 初始化 createPeerConnectionFac ...

  5. 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )

    文章目录 安卓直播推流专栏博客总结 一. 服务器搭建 二. 手机端推流 三. 电脑端观看直播 四. RTMP 服务器端状态 安卓直播推流专栏博客总结 Android RTMP 直播推流技术专栏 : 0 ...

  6. Android应用架构之Retrofit

    Retrofit 可以自动解析Json为bean 是squareup公司出品,还有okhttp,picasso 可以配合RxJava实现网络请求 用法: 1.获取Retrofit.Builder创建过 ...

  7. Android 网络框架之Retrofit源码解析,flutter边框特效

    Retrofit的构建使用了建造者模式,这个模式的优点就是可以构造复杂的对象,方便扩展,并且看起来代码比较简洁,美观: 在开始之前,我们先来看一下Retrofit的成员变量: 这里的变量并不是很多,我 ...

  8. android so调用java,AndServer+Service打造Android服务器实现so文件调用

    so 文件调用 随着 Android 移动安全的高速发展,不管是为了执行效率还是程序的安全性等,关键代码下沉 native 层已成为基本操作. native 层的开发就是通指的 JNI/NDK 开发, ...

  9. AndServer+Service 打造 Android 服务器实现 so 文件调用

    "NightTeam",一个值得加星标的公众号. 正文共:5623 字 26 图 预计阅读时间:15 分钟 作者:  妄为 so 文件调用 随着 Android 移动安全的高速发展 ...

最新文章

  1. 一个隐马尔科夫模型的应用实例:中文分词
  2. python上的数据库sqlite3——插入多行数据
  3. Java实用面试题及参考答案分享
  4. java 关注公众号没有调接口_高频面试题:接口和抽象类的区别
  5. python测试电脑性能的代码_python编程测试电脑开启最大线程数实例代码
  6. JVM—调优参数学习
  7. Unix/Linux环境C编程入门教程(20) 搭建基于Mac的 Xcode 与 QT 开发环境
  8. 手机app测试用例考虑测试点
  9. HTML的Demo实例
  10. smart原则_用SMART原则,定位好副业目标
  11. 二叉树期权定价与BSM期权定价
  12. 中国十大计算机学院排名2015,中国计算机学院排名
  13. Server Tomcat v7.0 Server at localhost failed to start.
  14. 升级ios10默认ruby版本
  15. android+删除相片代码,android删除手机照片
  16. 最新的CC2642R与CC2640、CC2640R2F有什么改进?
  17. 面向对象之相关综合练习题
  18. python与php做网站_学Python对做网站用处大吗?
  19. (195)FPGA编程:双端口RAM(一)
  20. php快速实现二维码接口

热门文章

  1. 个人博客网页设计_不会代码如何打造个人博客?你需要这个简单、免费的搭建工具...
  2. python画好看的图-python如何画出漂亮的地图?
  3. python 入门基础-零基础入门Python,看这一篇就够了!
  4. 如何系统的自学python-应该怎样系统的学习Python标准库?
  5. 第U题:Java BigDecimal解决··Noder现在上初三了,正在开始复习中考。他每天要计算型如..............
  6. python多态_记录学习python第9天-继承/多态
  7. Vue前后端交互实现图书管理功能
  8. MySQL 8.0安装记录
  9. 【Mybatis笔记】mybatis实现mysql增删改查
  10. 【蓝桥杯】蓝桥杯日期类问题总结