Alamofire-UT测试Api

最近两天更新ES6学习文集,因为在搞Swift的UT测试。大致要实现的内容如下:

因为App在调用Api的时候,其实会出现一些错误,这些错误可能是网络原因,也可能是服务器问题,所以这就需要App来模拟这些错误的出现,从而达到测试的目的。但是这又不能过分依赖于后端,因为后端不可能配合你去修改服务器,而让你去测试,所以这就需要App本地模拟这些网络问题。

然后有因为App使用的是Alamofire来实现的Http请求,所以花了点时间来实现这个基础Alamofire的Api测试。


具体实现的逻辑主要是使用了URLProtocol,这个协议会拦截你App中的所有请求,有一些webview页面的缓存也是基于这个协议来实现的。具体的可以看代码:

Alamofire-UT测试Api_第1张图片

这个段代码是我对Alamofire的一个封装类的一部分,主要是通过设置SessionManager来实现Alamofire请求。

第18行代码是用来判断当前是否是测试环境,如果是跑UT那么这个判断则是true。

第24~28行代码就创建了一个URLSessionConfiguration,里面注册了我们自己的URLProtocol,CustomHttpProtocol就继承了URLProtocol。一旦注册了我们自己的URLProtocol,每一次请求就会被我们的CustomHttpProtocol拦截,这样我们就可以做自己的事情了。


CustomHttpProtocol继承自URLProtocol,URLProtocol这个类怎么用,可以在网上搜,主要是要实现几个方法。来拦截请求,例如,你可以统一的加Header信息在Request里面等等,然后再来发送请求,因为我们是要模拟网络错误,所以我们这里没有发送实际的网络请求,而是根据请求的url和需要的错误类型,将相应的错误信息直接返回Response。如下面的代码:

Alamofire-UT测试Api_第2张图片

第84行代码通过请求的url来获取请求参数(注意这里有一个坑,就是URLProtocol并不能获取到request请求的Body里面的参数,这是由于苹果认为参数可能很大,所以它就不返回给你了,导致你要想一个办法来获取到相应的参数,我这里是使用url作为key来保存到一个Map里面来获取的)

第86行代码我就是根据具体参数来mock相应的返回值给Response,例如,某个参数为空了,或者错误了,那么我就会返回服务器应该相应的Response给前端,这样就可以不用访问具体的服务器,App内部就可以模拟这种网络请求和错误。


通过这种方式可以本地App内部自己模拟这种网络错误,二不依赖于服务器,这样就可以在开发和测试的时候,处理各种错误从而降低代码的出错率和奔溃率。

而且这种方式也可以更好的写UT代码,而不用修改正常业务的处理逻辑,只需要修改底层Api请求的代码就可以了。

你可能感兴趣的:(Alamofire-UT测试Api)