最近两周都在做接口测试,刚开始是使用 Postman进行接口测试,发现多个接口串联且之间有参数传递的时候用postman进行测试就比较麻烦,所以在网上搜索了一下,发现可以用python进行接口测试。
python接口测试
1.安装python环境
2.下载python IDE(pyCharm)
下载:http://www.jetbrains.com/pycharm/,选择Download,进入下载页面。
3.下载 安装 requests第三方模块
注:
requests是python的HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说的:
python的标准库urllib2提供了大部分需要的HTTP功能,但API太逆天了,一个简单的功能需要一大堆代码。而requests比较简洁,能用更少的代码实现。
下面就进行接口测试
要使用 requests 首先需要在文件中引用
import requests
import json
# url:接口地址
# data: 接口需要的数据
# headers:接口需要的传递的headers数据
# files:若是接口中需要上传文件则需要用到该参数
r = requests.post(url, data=data, headers=headers)
r = requests.post(url, data=data, headers=headers, files=files)
# 获取 接口返回的数据信息并解析(如果返回的是json格式的话)
json_data = json.loads(r.text)
4.搭建接口测试框架
在百度搜索 接口自动化测试框架 发现 https://blog.csdn.net/qq_41782425/article/details/91841130 的文章写得非常详细,便根据文章思路及代码进行了实现,以下记录此次学习所得
思路:把接口基础信息录入excel文件中,接口请求数据录入json文件中,通过读取excel中的数据进行接口测试
该项目使用的是 python2.7
使用第三库:PyYAML、colorlog、configparser、requests、xlrd、xlwt
项目构成部分
caseData
caseData:存放接口基础数据(分别为excel、json、yaml(项目中未用到))
excelData中存放的是接口基础数据,存在多个excel文件时需要在config.ini中进行配置;excel中每一行一个接口数据,url栏的数据为对应json文件名称,请求数据栏中的数据为对应json文件中的key(为all时读取全部数据)
jsonData中存放的是接口的请求数据,在代码中是通过接口名称读取json文件中的数据 故 json文件名称必须与接口名称一致(如:接口:192.168.1.77:8080/test/qrygoodslist,那么对应的接口的数据接送文件为qrygoodslist.json)
manage.xls
addOrModGoodsType.json
common
common:存放公共方法,操作数据库、读取配置文件、写token、发送邮件等
askway.py
接口请求方法封装
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
# 封装请求
class AskWay:
def __init__(self, url, data=None, headers=None):
self.url = url
self.data = data
self.headers = headers
# 查
def m_get(self, pt):
if self.data != '' or self.data is not None:
if pt == 1:
result = requests.get(url=self.url, params=self.data, headers=self.headers).json()
else:
d_url = self.url + "/"
for i in self.data.values():
d_url = d_url + i + "/"
result = requests.get(url=d_url[:-1], headers=self.headers).json()
else:
result = requests.get(url=self.url, headers=self.headers).json()
return result
# 新增/修改
def m_post(self, pt):
if pt == 1:
result = requests.post(url=self.url, data=self.data, headers=self.headers).json()
else:
result = requests.post(url=self.url, json=self.data, headers=self.headers).json()
return result
# 新增/修改
def m_put(self, pt):
if pt == 1:
result = requests.put(url=self.url, data=self.data, headers=self.headers).json()
else:
result = requests.put(url=self.url, json=self.data, headers=self.headers).json()
return result
# 更新局部资源
def m_patch(self, pt):
if pt == 1:
result = requests.patch(url=self.url, data=self.data, headers=self.headers).json()
else:
result = requests.patch(url=self.url, json=self.data, headers=self.headers).json()
return result
# 删
def m_delete(self, pt):
if self.data != '' or self.data is not None:
if pt == 1:
result = requests.delete(url=self.url, params=self.data, headers=self.headers).json()
else:
d_url = self.url+"/"
for i in self.data.values():
d_url = d_url + i+"/"
result = requests.delete(url=d_url[:-1], headers=self.headers).json()
else:
result = requests.delete(url=self.url, headers=self.headers).json()
return result
def run_main(self, method, pt=1):
if method.lower() == 'get':
res = self.m_get(pt)
elif method.lower() == 'post':
res = self.m_post(pt)
elif method.lower() == 'put':
res = self.m_put(pt)
elif method.lower() == 'patch':
res = self.m_patch(pt)
elif method.lower() == 'delete':
res = self.m_delete(pt)
else:
return "what ?????"
return res
logg.py
日志方法封装
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import colorlog
import os
import time
log_colors_config = {
'DEBUG': 'lightgrey', # cyan white
'INFO': 'white',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
o_path = os.getcwd().encode('utf-8')
# o_path = os.path.dirname(os.p