51Testing软件测试论坛

标题: 简单实现接口自动化测试(基于python+unittest) [打印本页]

作者: 梦幻小丑灯    时间: 2018-6-15 14:50
标题: 简单实现接口自动化测试(基于python+unittest)
简介
本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增
加基本的结果判断,讲解Python自带的Unittest框架调用,期望各位可以通过本文对接口自动化测试有一
个大致的了解。

引言
为什么要做接口自动化测试?

在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回
归。但接口自动化测试因其实现简单、维护成本低,容易提高覆盖率等特点,越来越受重视。

为什么要自己写框架呢?

使用Postman调试通过过直接可以获取接口测试的基本代码,结合使用requets + unittest很容易实现接口
自动化测试的封装,而且requests的api已经非常人性化,非常简单,但通过封装以后(特别是针对公司内
特定接口),可以进一步提高脚本编写效率。

一个现有的简单接口例子
下面使用requests + unittest测试一个查询接口

接口信息如下

请求信息:
  1. <p>
  2. </p><p>Method:POST</p><p>
  3. </p><p>URL:api/match/image/getjson</p><p>
  4. </p><p>Request:</p><p>
  5. </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>
  6. </p><p>{</p><p>"timestamp" : xxx,</p><p>"errorMsg" : "",</p><p>"data" : {</p><p>"config" : xxx</p><p>}</p><p>Postman测试方法见截图:</p><p>
  7. </p><p>图片名称</p><p>
  8. </p><p>测试思路</p><p>1.获取Postman原始脚本</p><p>
  9. </p><p>2.使用requests库模拟发送HTTP请求**</p><p>
  10. </p><p>3.对原始脚本进行基础改造**</p><p>
  11. </p><p>4.使用python标准库里unittest写测试case**</p><p>
  12. </p><p>原始脚本实现</p><p>
  13. </p><p>未优化</p><p>
  14. </p><p>该代码只是简单的一次调用,而且返回的结果太多,很多返回信息暂时没用,示例代码如下</p><p>
  15. </p><p>import requests</p><p>
  16. </p><p>url = "http://cpright.xinhua-news.cn/api/match/image/getjson"</p><p>
  17. </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>
  18. </p><p>headers = {</p><p>    'cache-control': "no-cache",</p><p>    'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"</p><p>    }</p><p>
  19. </p><p>response = requests.request("POST", url, headers=headers, params=querystring)</p><p>
  20. </p><p>print(response.text)</p><p>优化 第一版</p><p>
  21. </p><p>调整代码结构,输出结果Json出来,获取需要验证的response.status_code,以及获取结果校验需要用到的results['total']</p><p>
  22. </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>
  23. </p><p>import unittest</p><p>import json</p><p>import traceback</p><p>import requests</p><p>
  24. </p><p>
  25. </p><p>url = "http://cpright.xinhua-news.cn/api/match/image/getjson"</p><p>
  26. </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>
  27. </p><p>headers = {</p><p>    'cache-control': "no-cache",</p><p>    'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"</p><p>    }</p><p>
  28. </p><p>#Post接口调用</p><p>response = requests.request("POST", url, headers=headers, params=querystring)</p><p>
  29. </p><p>#对返回结果进行转义成json串</p><p>results = json.loads(response.text)</p><p>
  30. </p><p>#获取http请求的status_code</p><p>print "Http code:",response.status_code</p><p>
  31. </p><p>#获取结果中的total的值</p><p>print results['total']</p><p>#print(response.text)</p><p>优化 第二版</p><p>
  32. </p><p>接口调用异常处理,增加try,except处理,对于返回response.status_code,返回200进行结果比对,不是200数据异常信息。</p><p>
  33. </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>
  34. </p><p>import json</p><p>import traceback</p><p>import requests</p><p>
  35. </p><p>
  36. </p><p>url = "http://cpright.xinhua-news.cn/api/match/image/getjson"</p><p>
  37. </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>
  38. </p><p>headers = {</p><p>    'cache-control': "no-cache",</p><p>    'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"</p><p>    }</p><p>
  39. </p><p>
  40. </p><p>try:</p><p>    #Post接口调用</p><p>    response = requests.request("POST", url, headers=headers, params=querystring)</p><p>
  41. </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>
  42. </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