51Testing软件测试论坛
标题:
简单实现接口自动化测试(基于python+unittest)
[打印本页]
作者:
梦幻小丑灯
时间:
2018-6-15 14:50
标题:
简单实现接口自动化测试(基于python+unittest)
简介
本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增
加基本的结果判断,讲解Python自带的Unittest框架调用,期望各位可以通过本文对接口自动化测试有一
个大致的了解。
引言
为什么要做接口自动化测试?
在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回
归。但接口自动化测试因其实现简单、维护成本低,容易提高覆盖率等特点,越来越受重视。
为什么要自己写框架呢?
使用Postman调试通过过直接可以获取接口测试的基本代码,结合使用requets + unittest很容易实现接口
自动化测试的封装,而且requests的api已经非常人性化,非常简单,但通过封装以后(特别是针对公司内
特定接口),可以进一步提高脚本编写效率。
一个现有的简单接口例子
下面使用requests + unittest测试一个查询接口
接口信息如下
请求信息:
<p>
</p><p>Method:POST</p><p>
</p><p>URL:api/match/image/getjson</p><p>
</p><p>Request:</p><p>
</p><p>{</p><p>"category": "image",</p><p>"offset": "0",</p><p>"limit": "30",</p><p>"sourceId": "0",</p><p>"metaTitle": "",</p><p>"metaId": "0",</p><p>"classify": "unclassify",</p><p>"startTime": "",</p><p>"endTime": "",</p><p>"createStart": "",</p><p>"createEnd": "",</p><p>"sourceType": "",</p><p>"isTracking": "true",</p><p>"metaGroup": "",</p><p>"companyId": "0",</p><p>"lastDays": "1",</p><p>"author": ""</p><p>}</p><p>Response示例:</p><p>
</p><p>{</p><p>"timestamp" : xxx,</p><p>"errorMsg" : "",</p><p>"data" : {</p><p>"config" : xxx</p><p>}</p><p>Postman测试方法见截图:</p><p>
</p><p>图片名称</p><p>
</p><p>测试思路</p><p>1.获取Postman原始脚本</p><p>
</p><p>2.使用requests库模拟发送HTTP请求**</p><p>
</p><p>3.对原始脚本进行基础改造**</p><p>
</p><p>4.使用python标准库里unittest写测试case**</p><p>
</p><p>原始脚本实现</p><p>
</p><p>未优化</p><p>
</p><p>该代码只是简单的一次调用,而且返回的结果太多,很多返回信息暂时没用,示例代码如下</p><p>
</p><p>import requests</p><p>
</p><p>url = "http://cpright.xinhua-news.cn/api/match/image/getjson"</p><p>
</p><p>querystring = {"category":"image","offset":"0","limit":"30","sourceId":"0","metaTitle":"","metaId":"0","classify":"unclassify","startTime":"","endTime":"","createStart":"","createEnd":"","sourceType":"","isTracking":"true","metaGroup":"","companyId":"0","lastDays":"1","author":""}</p><p>
</p><p>headers = {</p><p> 'cache-control': "no-cache",</p><p> 'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"</p><p> }</p><p>
</p><p>response = requests.request("POST", url, headers=headers, params=querystring)</p><p>
</p><p>print(response.text)</p><p>优化 第一版</p><p>
</p><p>调整代码结构,输出结果Json出来,获取需要验证的response.status_code,以及获取结果校验需要用到的results['total']</p><p>
</p><p>#!/usr/bin/env python</p><p>#coding: utf-8</p><p>'''</p><p>unittest merchant backgroud interface</p><p>@author: zhang_jin</p><p>@version: 1.0</p><p>@see:http://www.python-requests.org/en/master/</p><p>'''</p><p>
</p><p>import unittest</p><p>import json</p><p>import traceback</p><p>import requests</p><p>
</p><p>
</p><p>url = "http://cpright.xinhua-news.cn/api/match/image/getjson"</p><p>
</p><p>querystring = {</p><p> "category": "image",</p><p> "offset": "0",</p><p> "limit": "30",</p><p> "sourceId": "0",</p><p> "metaTitle": "",</p><p> "metaId": "0",</p><p> "classify": "unclassify",</p><p> "startTime": "",</p><p> "endTime": "",</p><p> "createStart": "",</p><p> "createEnd": "",</p><p> "sourceType": "",</p><p> "isTracking": "true",</p><p> "metaGroup": "",</p><p> "companyId": "0",</p><p> "lastDays": "1",</p><p> "author": ""</p><p>}</p><p>
</p><p>headers = {</p><p> 'cache-control': "no-cache",</p><p> 'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"</p><p> }</p><p>
</p><p>#Post接口调用</p><p>response = requests.request("POST", url, headers=headers, params=querystring)</p><p>
</p><p>#对返回结果进行转义成json串</p><p>results = json.loads(response.text)</p><p>
</p><p>#获取http请求的status_code</p><p>print "Http code:",response.status_code</p><p>
</p><p>#获取结果中的total的值</p><p>print results['total']</p><p>#print(response.text)</p><p>优化 第二版</p><p>
</p><p>接口调用异常处理,增加try,except处理,对于返回response.status_code,返回200进行结果比对,不是200数据异常信息。</p><p>
</p><p>#!/usr/bin/env python</p><p>#coding: utf-8</p><p>'''</p><p>unittest merchant backgroud interface</p><p>@author: zhang_jin</p><p>@version: 1.0</p><p>@see:http://www.python-requests.org/en/master/</p><p>'''</p><p>
</p><p>import json</p><p>import traceback</p><p>import requests</p><p>
</p><p>
</p><p>url = "http://cpright.xinhua-news.cn/api/match/image/getjson"</p><p>
</p><p>querystring = {</p><p> "category": "image",</p><p> "offset": "0",</p><p> "limit": "30",</p><p> "sourceId": "0",</p><p> "metaTitle": "",</p><p> "metaId": "0",</p><p> "classify": "unclassify",</p><p> "startTime": "",</p><p> "endTime": "",</p><p> "createStart": "",</p><p> "createEnd": "",</p><p> "sourceType": "",</p><p> "isTracking": "true",</p><p> "metaGroup": "",</p><p> "companyId": "0",</p><p> "lastDays": "1",</p><p> "author": ""</p><p>}</p><p>
</p><p>headers = {</p><p> 'cache-control': "no-cache",</p><p> 'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"</p><p> }</p><p>
</p><p>
</p><p>try:</p><p> #Post接口调用</p><p> response = requests.request("POST", url, headers=headers, params=querystring)</p><p>
</p><p> #对http返回值进行判断,对于200做基本校验</p><p> if response.status_code == 200:</p><p> results = json.loads(response.text)</p><p> if results['total'] == 191:</p><p> print "Success"</p><p> else:</p><p> print "Fail"</p><p> print results['total']</p><p> else:</p><p> #对于http返回非200的code,输出相应的code</p><p> raise Exception("http error info:%s" %response.status_code)</p><p>except:</p><p> traceback.print_exc()</p><p>优化 第三版</p><p>
</p>
复制代码
作者:
v_jjiazhang
时间:
2018-6-22 15:04
11
作者:
izhaojun
时间:
2018-11-5 15:14
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2