目录

接口自动化框架目录

基础类封装概览

基础类封装方法详解

Log.py文件

Request.py文件


Python是目前主流的接口自动化脚本语言之一。

本专栏将联系业务介绍使用python接口自动化脚本范例。

适合对象:已有一定python基础,对自动化感兴趣的小伙伴。

接口自动化框架目录

目录说明:

在Project目录下新建你的项目,里面再次拆分出本项目的相关配置公共模块、接口层、用例层。

公共模块功能:存放配置、封装公共调用方法

接口层功能:封装调用接口

用例层功能:调用封装的接口,传入不同参数校验、场景模式校验,设置断言

基础类封装概览

将公共的模块封装为基础类,比如发送请求的request、log日志封装等等。

这些模块是每个业务线或者接口都需要使用到的,故将其放在Common下面进行编写封装。

基础类封装方法详解

Log.py文件

目的:用例执行过程中打印日志,定位问题。

小tips:

导入模块,如果有标红显示,说明你的lib下面没有这个第三方的资源了,可以在Terminal下面使用命令直接下载 pip install colorama

下面为封装Log日志的方法:

# -*- coding: utf-8 -*-"""
封装log方法"""import logging
import os
import time
import stat
import datetime
from hashlib import md5
from colorama import Fore, StyleTRACE_ID_LIST = []
LEVELS = {'debug': logging.DEBUG,'info': logging.INFO,'warning': logging.WARNING,'error': logging.ERROR,'critical': logging.CRITICAL
}logger = logging.getLogger()
level = 'default'def set_file_permission(filename):# 设置日志目录文件及权限path = filename[0:filename.rfind('/')]if not os.path.isdir(path):os.makedirs(path)if not os.path.isfile(filename):return Nonetry:# 赋予文件777的权限,防止不同用户访问时报错os.chmod(filename, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)return Trueexcept Exception as e:print('设置日志文件权限错误,error:{}'.format(e))return Falsedef set_handler(levels):# 日志文件内写入内容if levels == 'error':set_file_permission(MyLog.err_file)logger.addHandler(MyLog.err_handler)set_file_permission(MyLog.log_file)logger.addHandler(MyLog.handler)def remove_handler(levels):if levels == 'error':logger.removeHandler(MyLog.err_handler)logger.removeHandler(MyLog.handler)def get_current_time():return datetime.datetime.now().strftime(MyLog.date)class MyLog:backup_count = 5path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))local_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))log_file = path + '/Log/info.log'err_file = path + '/Log/error.log'logger.setLevel(LEVELS.get(level, logging.NOTSET))date = '%Y-%m-%d %H:%M:%S.%f'from logging.handlers import TimedRotatingFileHandler#分割日志记录handler = TimedRotatingFileHandler(filename=log_file, when="MIDNIGHT", interval=1, backupCount=backup_count,encoding='utf-8')err_handler = TimedRotatingFileHandler(filename=err_file, when="MIDNIGHT", interval=1, backupCount=backup_count,encoding='utf-8')@staticmethoddef debug(log_meg):set_handler('debug')logger.debug("[DEBUG " + get_current_time() + "]" + str(log_meg))print(Fore.LIGHTGREEN_EX + "[DEBUG]" + str(log_meg) + Style.RESET_ALL)remove_handler('debug')@staticmethoddef info(log_meg):set_handler('info')logger.info("[INFO " + get_current_time() + "]" + str(log_meg))print("[INFO]" + str(log_meg))remove_handler('info')@staticmethoddef warning(log_meg):set_handler('warning')logger.warning("[WARNING " + get_current_time() + "]" + str(log_meg))print(Fore.LIGHTYELLOW_EX + "[WARNING]" + str(log_meg) + Style.RESET_ALL)remove_handler('warning')@staticmethoddef error(log_meg):try:raise RuntimeErrorexcept RuntimeError:import sysf = sys.exc_info()[2].tb_frame.f_backdatas = 'The error source: ' + f.f_code.co_filename + ' ' + f.f_code.co_name + ' ' + str(f.f_lineno)set_handler('error')logger.error("[ERROR " + get_current_time() + "]" + str(log_meg), exc_info=True)logger.error(datas)print(Fore.LIGHTRED_EX + "[ERROR]" + str(log_meg) + Style.RESET_ALL)print(datas)remove_handler('error')@staticmethoddef critical(log_meg):set_handler('critical')logger.critical("[CRITICAL " + get_current_time() + "]" + str(log_meg))print(Fore.RED + "[CRITICAL]" + str(log_meg) + Style.RESET_ALL)remove_handler('critical')

Request.py文件

# -*- coding: utf-8 -*-
"""
封装request
"""
import requests
from retry import retry
from requests.adapters import HTTPAdapter
from Common.Log import MyLog
import urllib3
import jsonclass Request:def __init__(self):self.log = MyLog@retry((Exception, requests.RequestException), tries=3, delay=1, backoff=2, max_delay=4)def base_request(self, url, data=None, header=None, method=None, time_out=None, body_json=None, params=None):"""客户端请求基础方法:param url: 完整的请求url,包括url和path:param data: 请求的数据:param header: 请求头:param method 请求方式,支持POST和GET方式请求:param time_out 请求超时时间:param body_json : 以json进行传参:param params: GET请求的时直接传参:return:"""header = {} if header is None else headermethod = 'POST' if method is None else methodtime_out = 60 if time_out is None else time_out# 定义user_agentuser_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'user_agent_header = {'User-Agent': user_agent}if header.get('User-Agent') is None:header.update(user_agent_header)if header.get('Content-Type') is None and type(data) is str:header.update({'Content-Type': 'application/json;charset=utf-8'})# 将请求body字典转化为json格式,并去除其中的空格if (type(data) is dict or type(data) is list) and 'application/json' in str(header.get('Content-Type')):data = json.dumps(data, separators=(',', ':'))self.log.info('请求的url: %s' % str(url))if data:self.log.info('请求的data: %s' % str(data))if params:self.log.info(f'请求的params: {params}')if body_json:self.log.info(f'请求的body_json: {body_json}')self.log.info('请求的header: %s' % str(header))self.log.info('请求的method: %s' % str(method))# 关闭警告urllib3.disable_warnings()# 增加失败重试session = requests.Session()session.mount('http://', HTTPAdapter(max_retries=1))session.mount('https://', HTTPAdapter(max_retries=1))try:res = session.request(method=method, url=url, params=params, data=data, json=body_json, headers=header, timeout=time_out, verify=False, proxies=None, stream=False)except requests.RequestException as e:self.log.info('%s%s' % ('RequestException url: ', url))self.log.info(e)raise RuntimeError(e)except Exception as e:self.log.info('%s%s' % ('Exception url: ', url))self.log.info(e)raise RuntimeError(e)# time_consuming为响应时间,单位为毫秒time_consuming = res.elapsed.microseconds / 1000# time_total为响应时间,单位为秒time_total = res.elapsed.total_seconds()response_dicts = dict()response_dicts['code'] = res.status_codetry:response_dicts['body'] = res.json()except Exception as e:self.log.info('解析响应json异常:{}'.format(e))response_dicts['body'] = ''self.log.info('响应text:{}'.format(res.text))response_dicts['time_consuming'] = time_consumingresponse_dicts['time_total'] = time_totalresponse_dicts['text'] = res.textresponse_dicts['headers'] = res.headersresponse_dicts['cookies'] = dict(res.cookies)self.log.info('响应码:%s' % response_dicts['code'])self.log.info('响应体:%s' % response_dicts['body'])self.log.info('请求总耗时:%s' % response_dicts['time_total'])return response_dicts

如果写的不错,来个三连行~~~

Python接口自动化脚本业务框架总概(一)相关推荐

  1. python接口自动化实战(框架)

    python接口测试的原理,就不解释了,百度一大堆. 先看目录,可能这个框架比较简单,但是麻雀虽小五脏俱全. 各个文件夹下的文件如下: 一.理清思路 我这个自动化框架要实现什么 1.从excel里面提 ...

  2. python接口自动化整体设计框架(基础-operate_yaml模块)四

    operate_yaml这个模块就是打基础的模块,之后的读取接口数据,config配置项等都需要用到.因为我们这些数据都是存在yaml文件中 首先还是引入库: import yaml import o ...

  3. 如何在项目中搭建python接口自动化框架?

    文章目录 前言 一.框架目录介绍 1.common模块 读取Excel代码 读取yaml代码(支持场景关联) jsonpath断言封装代码 requests二次封装(get.post) configp ...

  4. python 基于unittest写接口自动化脚本

    已过时.如感兴趣,请移步这篇文章 https://blog.csdn.net/tomoya_chen/article/details/121550706 python 基于unittest写接口自动化 ...

  5. python接口自动化实战(框架)_python接口自动化框架实战

    python接口测试的原理,就不解释了,百度一大堆. 先看目录,可能这个框架比较简单,但是麻雀虽小五脏俱全. 各个文件夹下的文件如下: 一.理清思路 我这个自动化框架要实现什么 1.从excel里面提 ...

  6. python教学视频p_python接口自动化28requestshtml爬虫框架

    前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...

  7. Python接口自动化之logging封装及实战

    VOL 124 15 2020-05 今天距2021年230天 这是ITester软件测试小栈第124次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上  ...

  8. Python接口自动化之logging日志

    VOL 122 11 2020-05 今天距2021年234天 这是ITester软件测试小栈第122次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上  ...

  9. Python接口自动化之登录接口测试

    VOL 117 29 2020-04 今天距2020年246天 这是ITester软件测试小栈第117次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上  ...

最新文章

  1. ATS和闰秒那些事儿
  2. Python基础教程:列表字典的键值修改
  3. spring 循环依赖注入
  4. c语言扩展运算符是什么,扩展运算符(spread)是三个点(…)
  5. IDEA设置注释模板
  6. 矩阵基变换和坐标变换
  7. Cypress使用教程
  8. javascript趣味钢琴小游戏(附源码)js+css+html
  9. 再谈Spring(一):Bean的作用域
  10. Bloxorz POJ3322
  11. 银行卡资费转帐汇款取款_收费标准参考_中行_建行_工行_农行_招行_兴业等
  12. 【热门收藏】iOS开发人员必看的精品资料(100个)
  13. (转)MVS-OS390系统管理-第二章 大型服务器外存管理
  14. 「诗云科技」获IDG资本领投数百万美元Pre-A轮融资,研发内容生成引擎Surreal Engine
  15. 最短路(两种常用算法!!!)
  16. Anemometer适应新版pt-query-digest需要的调整
  17. openGL学习笔记三十七:绘制简单地图
  18. java中shutdownoutput_Java Socket shutdownOutput和shutdownInput是否为“Duplicate ACK#:1”
  19. h3c 静态链路聚合及动态链路聚合
  20. 一些多元逐步回归的注意事项

热门文章

  1. matlab实现sobel边缘检测图像,基于Sobel算子图像边缘检测的MATLAB实现
  2. 计算机组成原理基础题库,计算机组成原理自习题库.docx
  3. Delphi多线程总结
  4. wpf datagrid设置右键菜单打开时选中项的背景色
  5. 医咖会免费STATA教程学习笔记——日志文件
  6. 认识计算机硬件.ppt,认识计算机硬件资料课件.ppt
  7. LeetCode基础
  8. 学习日记--JAVA篇--搭建maven SpringMVC工程
  9. activiti5 流程文件中使用java 方法
  10. epub格式的电纸书