使用Python做接口测试
来源:互联网 发布:js加密 java解密 编辑:程序博客网 时间:2024/05/17 18:29
写接口的时候需要对接口进行测试,一般会选用postman这种工具,但是需要一个一个的用鼠标去点他,尤其有些返回值需要手动去更新就更麻烦了,使用脚本自动去测试可以减轻一定的工作量.反正闲着也是闲着,在代码开发的同时脚本也能基本写完了.
我在写接口的时候的基本任务是:登陆获取登陆后的token通过json返回,使用token进行后续的操作
问题1传递数据进行登陆
我们是使用json进行传递的数据,最开始只传递一个类似
jsonStr:{'mobile':'13312345678','pwd':'password'}这样我需要自己编写head头,并提交获得response
def getResponse(url, val): json = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n " \#数据的分界线,一个数据一个 "Content-Disposition: form-data; name=\"jsonStr\"" \#jsonStr就是key的键值,和Java代码中的那个是对应的,使用getJsonStr获得 "\r\n\r\n%s\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--" % val#结束符号多了2个'--' head = {#头记录数据类型,分割线标记 'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", 'cache-control': "no-cache" }#使用urllib2提交并获得request,调用URLopen获得response,我们的返回值就在里面 request = urllib2.Request(url=url, headers=head, data=json) return urllib2.urlopen(request)response = getResponse(url, val)jsObj = response.read()#获得返回的数据,我返回的是json类型的字符串ret = json.loads(jsObj)#json转换成Python数据#也许我下次测试的需要的数据就在这个ret中,这个ret是个Python的字典,辣么...我在写下次jsonStr的时候有#假设ret={'token':'....etc.....','etc':'...'}data = "jsonStr:{'token':'%(token)s'}" % ret #->>"jsonStr:{'token':'....etc.....'}"#这样我就可以直接往下写了,不用关心其他的了
后来需求改成,key1:val1,key2:val1这种形式的,之前的那种形式不能使用了,把原来数据改成字典形式太累.
只用修改分割的形式变成
分割线+内容+name1+val1+分割线+内容+name2+val2.....分割线--这个样子就可以了
稍微修改下上面的修改字符串的方式就行,没啥好说的.
原来的val需要稍微多修改点,其实无非就是2次分割,第一次将原来的字符串以','(逗号)进行分割,第二次用':'(冒号)分割,
我是形成类型[[k1,v1],[k2,v2],[k3,v3]]
def split_val(self, val): sli = val.strip().lstrip('{').rstrip('}').split(',') f = lambda x: x.strip().split(':') ret = [f(x) for x in sli] return ret#这样就不用修改原来的最讨厌的数据了#附上完整代码
import randomimport urllib2import jsonimport sysclass singleRun: def __init__(self, url, val, con): self.__url__ = url self.__split__flag__ = "------WebKitFormBoundary7MA4YWxkTrZu0gW" self.__split__end__ = self.__split__flag__ + "--" self.__json__ = '' self.__make__(val) self.__head__ = { 'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", 'cache-control': "no-cache", 'postman-token': "df471615-292b-a328-0c06-f3f3e2e795c8" } self.__convertInfo__ = con self.ret = {} def __str__(self): return self.__json__ def __one_json__(self, k, v): return self.__split__flag__ + "\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n" % (k, v) #再换JSON传递的格式只用把这个函数修改了就好 def __split_val__(self, val): sli = val.strip().lstrip('{').rstrip('}').split(',') f = lambda x: x.strip().split(':') ret = [f(x) for x in sli] return ret def __component__(sli): for i in sli: if len(i) != 2: continue self.__json__ += self.__one_json__(i[0].strip("'").strip('"'), i[1].strip("'").strip('"')) def __make__(self, val): sli = self.__split_val__(val) self.__component__(sli) self.__json__ += self.__split__end__ def __get_response__(self): request = urllib2.Request(url=self.__url__, headers=self.__head__, data=self.__json__) return urllib2.urlopen(request) def run(self): self.name = self.__convertInfo__[self.__url__.split('/')[-1]].decode('utf8') response = self.__get_response__() jsObj = response.read() self.ret = json.loads(jsObj) return ret, jsObj def err_status(self): return '200' != str(self.ret.get('status'))class test_runer: convertInfo = {'personal': "获取个人信息", 'schedule': "排班"} def __init__(self, host=r"http://127.0.0.1/"): self.__json_data__ = []#用列表来保证插入的顺序 self.__host__ = host def __setitem__(self, pattern, data): key = self.__host__ + pattern.lstrip('/') self.__json_data__.append((key, data))#需求在变的时候直接改singleRun处理就行 def run_tests(self): ret = {} cnt = 0 for url, json in self.__json_data__: cnt += 1 if "TOKEN" in ret: json % ret try: single = singleRun(url, json, test_runer.convertInfo, cnt) ret,js = single.run() print js if single.err_status(): print json except Exception, e: print e.messagedef test_run(mobile='13312341001', pwd='pwd123'): host = "http://127.0.0.1:8080/" test_instance = test_runer(host) test_instance['personal'] = "'token':'%(TOKEN)s', 'data':'shuju', 'pwd':'{0}'".format(pwd) test_instance['schedule'] = "'token':'%(TOKEN)s', 'month':'201705'" test_instance.run_tests()if __name__ == "__main__": test_run()
1 0
- 使用python做接口测试
- 使用Python做接口测试
- 使用postman做接口测试
- 使用postman做接口测试
- 使用Poster做接口测试
- 使用postman做接口测试
- Jenkins + python(requests)做接口自动化测试
- Python做接口测试生成测试报告失败
- python 使用unittest 测试接口
- 使用python进行接口测试
- 接口测试 使用 Jmeter 做 Web 接口测试
- 使用loadrunner做接口自动化测试
- 使用 Jmeter 做 Web 接口测试
- 使用 Jmeter 做 Web 接口测试
- 使用Jmeter 做接口测试
- win7使用jmeter做接口压力测试
- 使用 Jmeter 做 Web 接口测试
- python requests做接口测试对json的处理
- 仿ios进度条,应该是最佳解决方案吧
- mgo EnsureIndex注意事项
- Oracle Active DataGurad和Data Guard的区别
- 协议的注册与维护——ndpi源码分析
- JavaScript ----JQuery
- 使用Python做接口测试
- Glide使用,踩过的坑
- .gitignore 文件的配置
- VxWorks+Tornado从听说到入门
- Detection物体检测及分类方法总结(RFCN/SSD/RCNN/FastRCNN/FasterRCNN/SPPNet/DPM/OverFeat/YOLO)
- ndpi源码分析一--几个重要的结构体
- ajax 删除数据并提示删除结果需要注意的
- hibernateTemplate以及spring中的hibernateDaosupport的配置
- "知识图谱在股权投资领域的尝试"读后感