http接口测试框架-python

简单分解一下

接口测试框架设计:

主入口 -> 遍历接口/用例 -> 发送请求+接收响应 ->结果的对比 -> 生成报告 ->发送email

分成几大类:
主入口的py文件

src-核心代码文件
    遍历case,发送请求和接收响应

存放case的
    2、数据库里维护
    3、excel里维护
        包括的字段:编号,接口名称,地址前缀,请求地址,请求方法,请求数据类型,请        求数据,检查点,是否运行,测试结果,响应参数

公共函数:被多次重复调用,且没有依赖性
commans-存放公共函数库文件
    2、数据库里维护
    3、excel里维护
        包括的字段:

reports存放报告
    excel

放插件的目录

log日志目录

1\先编写请求类,requests库里各类请求的封装

#! /usr/bin/env python
#coding=utf-8

import requests
import json

#定义请求类
class Interface_Request:
    def req_get(self,url,params,headers):
        try:
            r = requests.get(url,params=params,headers=headers)
            #转换为python类型的字典格式,json包的响应结果,调用json(),转换成python类型
            json_r = r.json()
            return json_r
        except BaseException as e:
            print("请求不能完成:",str(e))

    def post_kv(self,url,data,headers):
        try:
            r = requests.post(url,data=data,headers=headers)
            #转换为python类型的字典格式,json包的响应结果,调用json(),转换成python类型
            json_r = r.json()
            #print(json_r)
            return json_r
        except BaseException as e:
            print("请求不能完成:",str(e))

    def post_json(self,url,data,headers):
        try:
            #python类型转化为json类型
            data = json.dumps(data)
            r = requests.post(url,data=data,headers=headers)
            json_r = r.json()
            return json_r
        except Exception as e:
            print("请求不能完成:",str(e))

‘‘‘
下面为测试代码
url = "http://v.juhe.cn/laohuangli/d"
params = {"key":"e711bc6362b3179f5a28de7fd3ee4ace","date":"2016-5-14"}
headers = {}

req = Interface_Request()
req.req_get(url,params,headers)
req.post_kv(url,params,headers)
req.post_json(url,params,headers)
‘‘‘

2\接口类编写,完成调用请求并接受响应然后对结果进行对比,对结果和响应的写入

import requests
import re
import sys
sys.path.append("C:/Users/Administrator/Desktop/接口自动化测试/common")
from laohuangli_requests import Interface_Request

‘‘‘
class InterfaceTest(object):
    def 方法名称(self):
        请求类的调用,发送请求,获取响应
        re.search(检查点,响应内容)
        re.search(rro_code:‘0‘,r)#匹配到就返回Ture,没有就返回False
        if re.search(rro_code:‘0‘,r):
            print("xxxxxx")
        else:
            print(xxxxxx)
‘‘‘

‘‘‘
class InterfaceTest:
    def testGet(self):
        url = "http://v.juhe.cn/laohuangli/d"
        params = {"key":"e711bc6362b3179f5a28de7fd3ee4ace","date":"2016-5-14"}
        headers = {}

        req = Interface_Request()
        req_get = req.req_get(url,params = params,headers = headers)
        print(str(req_get))
        if(re.search("‘error_code‘: 0",str(req_get))):
            print("pass")
        else:
            print("fail")

it = InterfaceTest()
it.testGet()
‘‘‘

class InterfaceTest:
    def testrequest(self,url,uri,params,reqform,dataform,checkpoint,headers,i,sheet,num,name,log):
        #可选
        ‘‘‘
        headers = {‘Content-Type‘:‘application/x-www-form-urlencoded;charset=UTF-8‘}
        headers = {‘Content-Type‘:‘application/json;charset=utf-8‘}
        ‘‘‘
        #生成请求类的对象
        req = Interface_Request()
        #req_get = req.req_get(url,params = params,headers = headers)
        #请求前缀和接口地址的拼接
        full_url = url + uri

        #判断请求类型
        if(reqform == ‘GET‘):
            #调用请求类的函数,得到返回结果
            self.req_test = req.req_get(full_url,params,headers)
        elif(reqform == ‘POST‘ and dataform == ‘Form‘):
            self.req_test = req.post_kv(full_url,params,headers)
        elif(reqform == ‘POST‘ and dataform == ‘Json‘):
            headers = {‘Content-Type‘:‘application/json;charset=utf-8‘}
            self.req_test = req.post_json(full_url,params,headers)
        else:
            print("请求不通过,请检查case用例配置")
        print(self.req_test)

        #检查点与响应数据做对比
        if(re.search(checkpoint,str(self.req_test))):
            sheet.cell(row = i,column = 11).value = "成功" #row是通过遍历case类传递的
            sheet.cell(row = i,column = 12).value = str(self.req_test)
            log.info("用例编号"+ str(num) + " " + name + "接口执行成功")
        else:
            sheet.cell(row = i,column = 11).value = "失败"
            sheet.cell(row = i,column = 12).value = str(self.req_test)
            log.error("用例编号"+ str(num) + " " + name + "接口执行失败")

‘‘‘
#请求前缀
url = "http://v.juhe.cn/"
#接口地址
uri = "laohuangli/d"
params = {"key":"e711bc6362b3179f5a28de7fd3ee4ace","date":"2016-5-14"}
headers = {}
#请求类型
reqform = ‘post‘
#数据类型
dataform = ‘json‘
#检查点
checkpoint = "‘error_code‘: 0"

it = InterfaceTest()
it.testrequest(url,uri,params,reqform,dataform,checkpoint,headers)
‘‘‘

3\遍历case,读取数据,传入数据给接口类,得到请求类的数据,实际结果与预期结果做对比,填写case,得到报告

#! /usr/bin/env python
#coding=utf-8

import openpyxl

import sys
sys.path.append("C:/Users/Administrator/Desktop/接口自动化测试/src")
from laohuangli_InterfaceTest import InterfaceTest

sys.path.append("C:/Users/Administrator/Desktop/接口自动化测试/common")
from log import Log
#避免转义,将\写成/
#path = "C:/Users/Administrator/Desktop/laohuangli-testcase.xlsx"

class ReadCase:
    def get_case(self,path1,path2):
        log = Log(‘C:/Users/Administrator/Desktop/接口自动化测试/logs/test.log‘)
        try:
            #打开excel文件,返回标记位给wb
            wb = openpyxl.load_workbook(path1)
            log.info("打开测试用例成功!")
        except BaseException as e:
            log.info("打开测试测试用例失败:",str(e))
        #获取sheet(第二个sheet)
        sheet = wb.get_sheet_by_name("TestCase")
        print("获取指定的工作表:",sheet.title)

#for循环遍历case
        for i in range(2,sheet.max_row + 1):
            if sheet.cell(row = i,column = 10).value.replace(‘\n‘,‘‘).replace(‘r‘,‘‘) != ‘Yes‘:
                continue

            request_data1 = sheet.cell(row = i,column = 1).value
            print(type(request_data1),request_data1)

            request_data2 = sheet.cell(row = i,column = 2).value
            print(type(request_data2),request_data2)

            request_data3 = sheet.cell(row = i,column = 3).value
            print(type(request_data3),request_data3)

            request_data4 = sheet.cell(row = i,column = 4).value
            print(type(request_data4),request_data4)

            request_data5 = sheet.cell(row = i,column = 5).value
            print(type(request_data5),request_data5)

            request_data6 = sheet.cell(row = i,column = 6).value
            print(type(request_data6),request_data6)

            request_data7 = sheet.cell(row = i,column = 7).value
            #excel里取出来的是字符串,需要用eval函数转换
            #取的是字符串,转换成字典
            request_data7 = eval(request_data7)
            print(type(request_data7),request_data7)

            request_data8 = sheet.cell(row = i,column = 8).value
            print(type(request_data8),request_data8)

            request_data9 = sheet.cell(row = i,column = 9).value
            print(type(request_data9),request_data9)

            #调用接口类
            headers = {}
            it = InterfaceTest()
            it.testrequest(request_data3,request_data4,request_data7,request_data5,request_data6,request_data8,headers,i,sheet,request_data1,request_data2,log)

#保存数据,excel另存为
        wb.save(path2)

‘‘‘
#测试用例地址
path1 = "C:/Users/Administrator/Desktop/laohuangli-testcase.xlsx"
path2 = "C:/Users/Administrator/Desktop/laohuangli-testreport.xlsx"
readcase1 = ReadCase()
readcase1.get_case(path1,path2)

    if sheet.cell(row = i,column = 10).value.replace(‘\n‘,‘‘).replace(‘r‘,‘‘) != ‘Yes‘:
        continue
    request_data1 = sheet.cell(row = i,column = 2).value.replace(‘\n‘,‘‘).replace(‘r‘,‘‘)
    #excel里取出来的是字符串,需要用eval函数转换
    print(type(request_data1))

    request_data1 = eval(request_data1)
    print(request_data1)
‘‘‘

4\发送邮件的代码封装成类

#! /usr/bin/env python
#coding=utf-8

import smtplib
import email.mime.multipart
import email.mime.text

from email.mime.application import MIMEApplication

‘‘‘
先来想下发送邮件需要填写什么,还需要有什么条件
1.与邮件服务器建立连接,用户名和密码
2.发邮件:发件人\收件人\主题\内容\附件
3.发送
‘‘‘

class SendMail:

    def send_mail(self,sender,receiver,title,attach_xlsx,attach_jpg):
        msg=email.mime.multipart.MIMEMultipart()#生成包含多个邮件体的对象
        msg[‘from‘]=sender
        msg[‘to‘]=receiver
        msg[‘subject‘]= title
        content=‘‘‘
        Hi all,
        这是一封huipaodexiong自动化测试发送的邮件
        QQ:361702852
        博客:xxxxxxxxxxxxxx
        微信号:361702852
        带附件
        ‘‘‘
        print(‘成功1‘)
        #邮件正文,将文件正文当成附件发送,当正文内容很多时,提高效率
        txt=email.mime.text.MIMEText(content)
        msg.attach(txt)
        print(‘成功2‘)

        #excel附件--固定格式
        xlsxpart = MIMEApplication(open(attach_xlsx, ‘rb‘).read())
        xlsxpart.add_header(‘Content-Disposition‘, ‘attachment‘, filename=‘laohuangli-testcase1.xlsx‘)
        msg.attach(xlsxpart)

        #jpg图片附件
        jpgpart = MIMEApplication(open(attach_jpg, ‘rb‘).read())
        jpgpart.add_header(‘Content-Disposition‘, ‘attachment‘, filename=‘接口测试框架.jpg‘)
        msg.attach(jpgpart)

        #发送邮件
        smtp=smtplib
        smtp=smtplib.SMTP()
        smtp.set_debuglevel(1)#设置为调试模式,console中显示
        print(‘成功3‘)
        smtp.connect(‘smtp.126.com‘,‘25‘) #链接服务器,smtp地址+端口
        print(‘成功4‘)
        smtp.login(‘[email protected]‘,‘xxxxxx‘) #登录,用户名+密码
        print(‘成功5‘)
        smtp.sendmail(sender,receiver,str(msg)) #发送,from+to+内容
        smtp.quit()
        print(‘发送邮件成功‘)

"""
sender = ‘[email protected]‘
receiver = ‘[email protected]‘
title = ‘测试文件‘
attach_xlsx = ‘C:/Users/Administrator/Desktop/laohuangli-testcase1.xlsx‘
attach_jpg = ‘C:/Users/Administrator/Desktop/接口测试框架.jpg‘

mail = SendMail()
mail.send_mail(sender,receiver,title,attach_xlsx,attach_jpg)
"""

5\主文件入口

调用遍历case类,并传递相关参数(case文件,report文件)

调用发送邮件的类,并传递相关参数(发件人,收件人,主题,附件)

#! /usr/bin/env python
#coding=utf-8
import sys
sys.path.append("C:/Users/Administrator/Desktop/接口自动化测试/src")
from readCase import ReadCase

sys.path.append("C:/Users/Administrator/Desktop/接口自动化测试/common")
from sendMail import SendMail

path1 = "C:/Users/Administrator/Desktop/接口自动化测试/case/laohuangli-testcase.xlsx"
path2 = "C:/Users/Administrator/Desktop/接口自动化测试/report/laohuangli-testreport.xlsx"

rc = ReadCase()
rc.get_case(path1,path2)

sender = ‘[email protected]‘
receiver = ‘[email protected]‘
title = ‘测试文件‘

attach_jpg = ‘C:/Users/Administrator/Desktop/接口自动化测试/report/接口测试流程图.jpg‘

mail = SendMail()
mail.send_mail(sender,receiver,title,path2,attach_jpg)
print("成功")

6\日志类,关键地方打印日志

接口判断,调用请求,请求结果\....等等一些重要地方打印日志

#! /usr/bin/env python
#coding=utf-8
import logging
import os

#实现,让日志信息既在控制台,也在指定路径的文件中输出
#日志级别等级 CRITICAL > ERROR > WARNING > INFO > DEBUG
class Log():
    def __init__(self,log_file):
        #创建一个logger,顶级的根目录getlogger,有两个分支,一个是FileHander,一个是StreamHandler
        self.logger = logging.getLogger(‘mylogger‘)
        self.logger.setLevel(logging.INFO)

        #创建一个handler,将log写入文件
        fh = logging.FileHandler(log_file,mode = ‘w‘)
        fh.setLevel(logging.INFO)

        #再创建一个handler,将log输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.INFO)

        #设置输出格式
        log_format = "%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s: %(message)s"
        #把格式添加进来
        formatter = logging.Formatter(log_format)
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)

        #把handler添加到logger里,其实你理解为汇报给大领导即可
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

    def info(self,content):
        self.logger.info(content)

    def error(self,content):
        self.logger.error(content)

‘‘‘
log1 = Log(‘D:/接口自动化测试/logs/test.log‘)
log1.info("测试")
‘‘‘
‘‘‘
logger.error(‘下雨了‘)
logger.info(‘打雷了‘)
logger.debug(‘收衣服了‘)
‘‘‘

简单的运行结果:

时间: 2024-10-06 00:29:15

http接口测试框架-python的相关文章

初探接口测试框架--python系列7

点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期待的方向,有更多兴趣的欢迎切磋,我们微信订阅号,联系方式如下: 更多书籍,敬请期待 背景说明 python系列课程也有段时间了,我们坚持,一步步来,今天是最后一课的分享,看看接口测试框架的神秘,小怪带领着大家一起完成第7课,希望能看完知识点,自己动手练习,然后和给出的例子代码对比,最后看看作业

初探接口测试框架--python系列1

点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期待的方向,有更多兴趣的欢迎切磋,我们微信订阅号,联系方式如下: 更多书籍,敬请期待 背景说明 我们清楚的知道自动化测试包含UI自动化.接口自动化.单元自动化,其中接口自动化测试可以说是性价比比较高的,我们今天不讲如何开展接口自动化测试,而是来看看接口测试框架的神秘.小怪带领着大家一起简单轻松的

[python测试框架] http接口测试框架

https://testerhome.com/topics/5631 Http 接口测试框架 (思路 + 实现中 + 开源 + 可能难产) Http 接口测试框架疑问解答 Fiddler 保存会话 (请求) 说明 由于部分内容涉及公司机密,已用字母替换,不影响阅读 实际效果 验证1000个接口平均耗时6s(看机器配置及网速) 第一次投入使用,马上发现5个接口异常并且该验证过程不到30s的时间 框架的下一步 目前已兼容我们公司所有app response body全字段验证(含字段类型) 已有思路

基于Python的接口测试框架实例

文章来源:http://www.jb51.net/article/96481.htm 下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 背景 最近公司在做消息推送,那么自然就会产生很多接口,测试的过程中需要调用接口,我就突然觉得是不是可以自己写一个测试框架? 说干就干,由于现有的接口测试工具Jmeter.SoupUI等学习周期有点长,干脆自己写一个吧,不求人,所有功能自己都能一清二楚. 当然,写工具造轮子只是

Python接口测试实战4(上) - 接口测试框架实战

如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战2 - 使用Python发送请求 Python接口测试实战3(上)- Python操作数据库 Python接口测试实战3(下)- unittest测试框架 Python接口测试实战4(上) - 接口测试框架实战 Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

主流接口测试框架对比

公司计划系统的开展接口自动化测试,需要我这边调研一下主流的接口测试框架给后端测试(主要测试接口)的同事介绍一下每个框架的特定和使用方式.后端同事根据他们接口的特点提出一下需求,看哪个框架更适合我们. ### 需求: 1.接口编写方便. 2.方便调试接口. 3.支持数据初始化. 4.生成测试报告. 5.支持参数化. #### robot framework 优点 关键字驱动,自定义用户关键字. 支持测试日志和报告生成. 支持系统关键字开发,可扩展性好. 支持数据库操作. 缺点 接口测试用例写起来不

基于HttpRunner,解析swagger数据,快速生成接口测试框架

使用HttpRunner默认生成的项目是这样的 命令:httprunner --startproject  项目名称 so,根据这个项目的目录结构,使用python解析swagger接口参数,可以快速生成api.testcases.testsuites文件夹中用到的json文件 运行后的目录是这样的 api目录 按swagger中的tags区分为多个文件夹,每个文件夹下包含各自的api文件 testcases目录 按swagger中的tags区分为不同的json文件,每个文件包含所有的api接口

yamlapi接口测试框架

1.思路: yamlapi支持unittest与pytest两种运行模式, yamlapi即为yaml文件+api测试的缩写, 可以看作是一个脚手架工具, 可以快速生成项目的各个目录与文件, 测试人员只需维护一份或者多份yaml文件即可, 不需要大量写代码. 2.安装: https://pypi.org/ 可在首页搜索“yamlapi”, 或者直接访问项目主页: https://pypi.org/project/yamlapi/ pip install yamlapi # 安装 yamlapi

web框架python

22.python笔记之web框架 一.web框架本质 1.基于socket,自己处理请求 #!/usr/bin/env python3 #coding:utf8 import socket def handle_request(client): #接收请求 buf = client.recv(1024) print(buf) #返回信息 client.send(bytes('<h1>welcome liuyao webserver</h1>','utf8')) def main(