您的位置:首页 > 编程语言 > Python开发

python+requests 搭建api自动化测试框架(源码免费下载)

2017-03-31 18:19 344 查看
python中的unittest测试,确实很方便。但是只对每个api都要定义TestCase,这就很繁琐。

那要是针对每个api,做单独的配置,让测试自动运行就方便很多。

下面,我们用requests库来搭建自己的测试框架。

1.首先,定义需要配置的api的list。

url_prex='http://127.0.0.1:5000'

[{'request_id': 1,
'request_name': 'api_url',
'request_method': 'GET',#或者是post,put之类的
'request_url': url_prex + '/api/test',
'request_data': None,
'respone_status_code': 200,
'respone_data': "success"
},
{'request_id': 2,
'request_name': 'api_url',
'request_method': 'POST',#或者是post,put之类的
'request_url': url_prex + '/api/test',
'request_data': {'name':'testname'},
'respone_status_code': 200,
'respone_data': "success"
},
]


2.定义post方法需要的header

headers = {
'Accept': 'application/json',
'Content-Type': 'application/json,application/x-www-form-urlencoded'
}


3,先进行api登录,登录之后才可以对api进行调用

req = requests.session()
req.get('http://127.0.0.1:5000/auth/login',
data={'userName': 'admin', 'password': "admin"})

url_prex = 'http://99.1.15.23:8080'


4.封装requests的方法,实现单一的get,post,delete,put等方法的统一传值和调用。

def url_call(method, url, data):
try:
if not method or method.upper() == 'GET':
response = req.request('GET',
url,
params=data)
else:
response = req.request(method,
url,
headers=headers,
data=data)
except Exception as e:
raise e
return response


5,针对list的每一个api,进行测试

def test_result(url):
try:
rs = url_call(url['request_method'], url['request_url'],
url['request_data'])
if "<title>404 Not Found</title>" in rs.text:
return u'%s 测试结果为: %s!,原因:request_url 地址错误! request_id: %s,url:%s method:%s request_data:%s' % (
url['request_name'], 'FAIL', url['request_id'],
url['request_url'], url['request_method'],
change_request_data_str(url['request_data'])), False
if "Traceback <em>(most recent call last)" in rs.text:
return u'%s 测试结果为: %s!,原因:被调用的api发生了Exception! request_id: %s,url:%s method:%s request_data:%s' % (
url['request_name'], 'Api Exception', url['request_id'],
url['request_url'], url['request_method'],
change_request_data_str(url['request_data'])), False
if url['respone_status_code'] and rs.status_code != url[
'respone_status_code']:
return u'%s 测试结果为: %s!,原因:status_code不一致! request_id: %s, url:%s method:%s request_data:%s' % (
url['request_name'], 'FAIL', url['request_id'],
url['request_url'], url['request_method'],
change_request_data_str(url['request_data'])), False
if url['respone_data'] and url['respone_data'] not in rs.text:
return u'%s 测试结果为: %s!,原因:期待的数据不在结果中! request_id: %s ,url:%s method:%s request_data:%s' % (
url['request_name'], 'FAIL', url['request_id'],
url['request_url'], url['request_method'],
change_request_data_str(url['request_data'])), False
except Exception as e:
return u'%s 测试结果为: %s!,原因:测试程序发生了内部错误,%s! request_id: %s ,url:%s method:%s request_data:%s' % (
url['request_name'], 'FAIL', e.__str__(), url['request_id'],
url['request_url'], url['request_method'],
change_request_data_str(url['request_data'])), False
return u'%s 测试结果为: %s! request_id: %s ,url:%s metho
bc39
d:%s request_data:%s' % (
url['request_name'], 'Success', url['request_id'], url['request_url'],
url['request_method'],
change_request_data_str(url['request_data'])), True


6,对list进行遍历测试,并对结果进行统计

def url_test():
result_false_list = []
begin_time = time.time()
for url in url_map:
result_str, result_status = test_result(url)
print result_str
if not result_status:
result_false_list.append(result_str)
percent = float(
url_map.__len__() - result_false_list.__len__()) * 100 / float(
url_map.__len__())
print u"总用时:%s ,测试总数:%s,失败个数:%s,测试成功率为:%.2f%%" % (
time.time() - begin_time, url_map.__len__(),
result_false_list.__len__(), percent)
return result_false_list


7,用flask_script进行app封装,和调用,并把错误记录到fail_log日志

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys

from flask import Flask
from flask_script import Manager

reload(sys)
sys.setdefaultencoding('utf-8')

app = Flask(__name__)
manager = Manager(app)

@manager.command
def api():
from tests.api.requests_help import url_test
result = url_test()
if result:
import time
date_str = time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime(time.time())) + '\r\n'
log_str = '\r\n'.join(result) + '\r\n'
open('fail_log', 'a').write(date_str + log_str)

if __name__ == "__main__":
manager.run(default_command='runserver')


8,用命令python main.py api 进行api自动化测试,可以得到如下测试结果

test_ip_url 测试结果为: Success! request_id: 13 ,url:http://127.0.0.1:5000/api/test method:GET request_data:{'command': 'true', 'Name': 'office_pooxl'}
test_ip_url 测试结果为: FAIL!,原因:status_code不一致! request_id: 14, url:http://127.0.0.1:5000/api/test/name method:GET request_data:{'virtualName': 'NameServer', 'ip': '110.65.139.196'}

总用时:24.8880000114 ,测试总数:2,失败个数:1,测试成功率为:50.00%


最后,只要对list进行配置,就可以进行api的自动化测试,并得到想要的测试报告

**完整代码和具体的框架我放到了我的资源中,供大家免费使用。地址:http://download.csdn.net/detail/u010445540/9800522

封装了requests 写法,unittest写法 和页面selenium的测试,请进入我的github进行下载:。。。。。。。。**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐