APP和服务器通讯为什么要用接口

APP和服务器通讯为什么要用接口,第1张

服务器和app之间通过接口来访问,主要有2点作用。

1、app客户端太大,不利于复用。

如果没有接口,app客户端是可以直接请求数据的,这个是可以做到,但是相当于接口的全部工作在app端写了,这样会造成app端比较大。比如,访问数据库的代码,Android要写,iOS也要写,太不利于复用。高质量代码的标准是可维护、可复用、可扩展、灵活性高。所以,如果有了接口,接口就可以对数据进行封装和业务处理,然后给app端。

2、不利于数据库安全。

接口可以把关安全性。因为客户端在客户手里,可以破解,可以反编译,整个架构下,

整个客户端都是V,数据库直接暴漏出来,别人可以扫描你的数据库端口,很危险。所以一般数据库,外部是不给访问的,你只能通过接口,而接口,会要求你登

录,登录后,根据你的身份。分配身份标记,再决定你能请求多少东西,每次请求都是由接口判断一次是否合法,就是根据SessionString,也可以是

cookie。其实cookie就是SessionString的ID。即使被破解,拿到一个,也是一个用户的数据被盗,其他用户不受影响。

1.先准备软件Fiddler

2.选择英文版或者汉化版打开,进行配置Tools->Fiddle options...完成下面两张图的配置

3.查看电脑的IP地址,并记录

4.打开手机Wifi使电脑和手机处于同一个Wifi下。手机长按该Wifi选择修改网络,勾选显示高级选项,在代理一栏选择手动,在服务器主机名中输入上面查看到的电脑IP地址,服务器端口输入8888点击保存。

5.修改完成后打开手机浏览器输入“http://ipv4.fiddler:8888”进入该网页,点击FiddlerRoot certificate下载Fiddler的证书。

6.下载完成之后打开手机设置->安全和隐私->从Sd卡安装->选择刚刚下载的证书->为证书命名->再点击受信用的凭据->用户->如果出现DO_NOT_TRUST列表项表示证书安装成功。

7.配置完成之后在手机端使用App电脑端的Fiddler就能捕捉到应用的请求接口。右键该接口选择Copy->just Url就可以复制该接口。在浏览器中粘贴使用即可获取数据(POST请求需要使用接口测试工具打开,Get无限制)

健壮性测试又称容错测试,主要是用于测试系统在出现故障时,是否能够自动恢复或者忽略故障继续运行。我们这里要讲的就是,在接口数据返回异常时,APP可以继续运行,不崩溃。

1、为什么要做app对服务端接口数据的容错测试?

1.1、首先考虑一个问题:App客户端的数据来源是什么?

1)本地数据(读取本地文件、代码中配置等)

2)网络请求的数据

App客户端网络请求的数据,一般都是以开发时约定好的json格式的形式来传输,如下(当然,也会有不是json的情况):

1.2、既然都是约定好的,那会有什么问题?

情况1:客户端开发认为:我请求了,就一定会给我结果,写代码时,就没有考虑到请求不返回的情况

情况2:客户端开发认为:我请求了,就一定会给我正确的格式,写代码时,就没有考虑到请求返回的格式不正确的情况,比如上图的json结构发生变化

情况3:接口返回的某个字段的value值,需要客户端进行二次处理,开发在处理时,没有考虑到一些异常值的情况,比如上图的code,msg等值为空或者NULL等等

1.3、以上情况,可能会有什么后果?

情况1:始终处于loading加载中,未做超时处理

情况2、3、4:空指针或数组越界报错,导致直接闪退

以上几种情况,如果不进行专门的容错测试,从测试直到上线,可能都是没问题的,但突然有一天,服务器接口修改或者其他情况,导致接口数据返回出现异常,线上就出现很多严重的崩溃问题,bug率急剧飙升,这就是因为客户端没有进行很好的容错处理。

2、app对服务端接口数据的容错测试的测试方法

测试工具:fiddler、charles或其他抓包工具,下面以fiddler为例

情况1测试方法:

1、手机设置代理,但是不开启fiddler(模拟开启了wifi,但是却无法上网的情况)

2、进入相应的界面,查看现象,如果一直处于loading,就说明没有加超时处理

情况2、3、4测试方法:

1、手机设置代理,开启fiddler

2、将要测试的接口断点(bpu + url)

3、在app中进行操作,使之请求该接口

4、拦截到请求后,修改请求,并使之返回给app

在这个界面就可以修改响应,比如我们要测每一个value的类型,就去修改他,修改完后点击run

5、查看当前界面及后续界面的操作,看有无卡死问题或闪退问题

需要修改成哪些场景进行测试?

1、改成404、500等异常返回状态

2、改成非预期格式(比如预期整个数据是json,那就把整个数据改成非json格式)

3、依次删除每一个key

4、依次修改每一个value的类型(string、int、array、object、null这五个类型之间相互修改)

5、依次修改每一个value的值(类型不变)

3、app对服务端接口数据的容错测试的几个原则:

1)每个新增的接口,理论上都要进行测试,评估工期的时候要预留出测试时间

2)修改了接口返回数据后,会造成客户端一些功能不可用,这是正常的现象,我们测试的原则是,不能有卡死或闪退的严重问题,如果开发不愿意改,必须坚持原则

3)修改value的测试数据时,应该与业务相结合来选取,测试前要搞清楚每个字段是用来干什么的

4)当前app界面如果测试发现不会闪退,但可能点击界面上的某个元素会造成闪退,因此也需要测试当面界面上点击后续元素是否会造成闪退(比如一个书籍列表页,返回的某个书籍元素id格式不正确,列表页不会闪退,但点击这本书籍,进入下个界面时,可能会造成闪退)

4、使用AutoResponder自动mock

也有人可能想到我一个个在fiddler上修改岂不是很麻烦,fiddler这边提供了一些快捷的方法。

右键要测试的接口—SAVE—response body,就可以保存json文件到本地,用nodepad++等工具打开就可以直接编辑修改。再开启AutoResponder,选择本地的json就可以自动mock,模拟返回数据。

我们只要在文档里修改好数据,每一次访问接口就可以自动mock

5、使用脚本自动修改测试。

如果我的json嵌套很多,那我一个个手动测试岂不是很麻烦?这里我们可以采用脚本来进行取代这些重复的步骤。

我这里使用的是python。

1.在你电脑上建立一个txt文件,把该文件地址配置到下面这行,到时候测试时,把待测接口拿到的原始数据,复制到这个文件里保存即可。

2. 使用fiddler的autoresponse功能,把待测接口的自动返回改成以下这个你设置的本地路径

3.使用脚本把把测试json数据写入到testjson.txt文件中,以供fiddler进行autoresponse测试

我这里设置的是每按一次回车执行一次测试,我们执行后可以查看app看是否崩溃。

import json

class RobTest:

def __init__(self):

self.ori_json = {}

self.test_datas= ["--RobTestString--", 0, [1], {"--RobTestKey--": "--RobTestValue--"}, None]

# 读取本地txt中的测试数据,并转换为json对象

def get_ori_txt(self):

# 在你电脑上建立一个txt文件,把该文件地址配置到下面这行,到时候测试时,把待测接口拿到的原始数据,复制到这个文件里保存即可。

f = open('D:/orijson.txt', 'r')

line = f.readline()

res = ""

while line:

res += line

line = f.readline()

f.close

res = res.encode('utf-8').decode('utf-8', errors='ignore').encode('utf-8') # 解决json文件里带中文时会报错的问题

self.ori_json = json.loads(res)

return self.ori_json

# 把测试json数据写入到testjson.txt文件中,以供fiddler进行autoresponse测试

def write_test_file(self, key_name = None):

self.test_jsontxt = json.dumps(self.ori_json)

if key_name:

self.test_jsontxt = self.test_jsontxt.replace("\"" + key_name + "\"", '"---ROBTEST---"')

print (self.test_jsontxt)

# 使用fiddler的autoresponse功能,把待测接口的自动返回改成以下这个你设置的本地路径

with open('D:/testjson.json', 'w') as f:

f.write(self.test_jsontxt)

#提示用户输入回车,进行下一条case的测试

input("-------输入回车后,可以继续测试下一个case-------")

# 执行测试

def do_test(self, testjson):

a = testjson

for key in list(a.keys()):

# 测试key不存在

self.write_test_file(key)

# 测试value改变的各种情况

tempvalue = a[key]

for testData in self.test_datas:

a[key] = testData

self.write_test_file()

a[key] = tempvalue

# 如果当前键值对的value值是string,还需要测试空字符串的情况

if isinstance(a[key],str):

# 测试空字符串的情况

a[key] = ""

self.write_test_file()

a[key] = tempvalue

# 如果当前键值对的value值是dict,还需要测试空dict的情况,并且需要递归测试

if isinstance(a[key], dict):

# 测试空dict的情况

a[key] = {}

self.write_test_file()

a[key] = tempvalue

#递归测试

self.do_test(a[key])

#如果当前键值对的value是list,还需要测试空dict的情况,并且如果第一个元素是dict,需要递归测试

if isinstance(a[key], list) and len(a[key]) >0:

# 测试空list的情况

a[key] = []

self.write_test_file()

a[key] = tempvalue

# 递归测试

if isinstance(a[key][0], dict):

self.do_test(a[key][0])

if __name__ == "__main__":

t = RobTest()

t.get_ori_txt()

t.do_test(t.ori_json)

print("测试完毕")


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/262933.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-17
下一篇2023-04-17

发表评论

登录后才能评论

评论列表(0条)

    保存