工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务moduleName查找对应表单,运用第三方库requests请求接口,根据结果和期望值进行断言,根据输出报告判断接口测试是否通过。

1. 数据准备
  • 数据插入(容易实现的测试场景下所需外部数据)
  • 准备sql (接口需要重复使用,参数一定得是变量)
2.集成部署(运维相关了解即可)
  • 平滑升级验证脚本加入自动化
3.自动化框架实现
  • 调用mysql
  • excel遍历测试用例
  • requests实现接口调用
  • 根据接口返回的code值和Excel对比
  • 报告反馈
  • 暴露服务

写一个简单登录的接口自动化测试

代码的分层如下图:
 
代码结构

一、写一个封装的获取excel表格的模块

 
excel.png

代码实现如下:

 # !/usr/bin/python
# -*- coding: UTF-8 -*-
# author: 赫本z
# 基础包: excel的封装 import xlrd
workbook = None def open_excel(path):
"""
打开excel
:param path: 打开excel文件的位置
"""
global workbook
if (workbook == None):
workbook = xlrd.open_workbook(path, on_demand=True) def get_sheet(sheetName):
"""
获取页名
:param sheetName: 页名
:return: workbook
"""
global workbook
return workbook.sheet_by_name(sheetName) def get_rows(sheet):
"""
获取行号
:param sheet: sheet
:return: 行数
"""
return sheet.nrows def get_content(sheet, row, col):
"""
获取表格中内容
:param sheet: sheet
:param row: 行
:param col: 列
:return:
"""
return sheet.cell(row, col).value def release(path):
"""释放excel减少内存"""
global workbook
workbook.release_resources()
del workbook
# todo:没有验证是否可用

代码封装后当成模块引用,这还是最开始呢。

二、引用log模块获取日志

准备工作:
需要一个日志的捕获,包括框架和源码抛出的expection。
代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# author: 赫本z
# 基础包: 日志服务
import logging def get_logger():
global logPath
try:
logPath
except NameError:
logPath = ""
FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
logging.basicConfig(level=logging.INFO, format=FORMAT)
return logging

三、引用requests模块接口测试

准备工作:
需要的请求类型和执行测试的方法。绝大多数公司使用Post和Get请求,一部分公司还在使用Restful API设计方案,可以因材施教。
代码如下:

#!/usr/bin/python
#-*- coding: UTF-8 -*-
# 基础包:接口测试的封装 import requests
import core.log as log
import json logging = log.get_logger() def change_type(value):
"""
对dict类型进行中文识别
:param value: 传的数据值
:return: 转码后的值
"""
try:
if isinstance(eval(value), str):
return value
if isinstance(eval(value), dict):
result = eval(json.dumps(value))
return result
except Exception, e:
logging.error("类型问题 %s", e) def api(method, url, data ,headers):
"""
自定义一个接口测试的方法
:param method: 请求类型
:param url: 地址
:param data: 数据
:param headers: 请求头
:return: code码
"""
global results
try:
if method == ("post" or "POST"):
results = requests.post(url, data, headers=headers)
if method == ("get" or "GET"):
results = requests.get(url, data, headers=headers)
# if method == "put":
# results = requests.put(url, data, headers=headers)
# if method == "delete":
# results = requests.delete(url, headers=headers)
# if method == "patch":
# results == requests.patch(url, data, headers=headers)
# if method == "options":
# results == requests.options(url, headers=headers)
response = results.json()
code = response.get("code")
return code
except Exception, e:
logging.error("service is error", e) def content(method, url, data, headers):
"""
请求response自己可以自定义检查结果
:param method: 请求类型
:param url: 请求地址
:param data: 请求参数
:param headers: 请求headers
:return: message信息
"""
global results
try:
if method == ("post" or "POST"):
results = requests.post(url, data, headers=headers)
if method == ("get" or "GET"):
results = requests.get(url, data, headers=headers)
if method == ("put" or "PUT"):
results = requests.put(url, data, headers=headers)
if method == ("patch" or "PATCH"):
results = requests.patch(url, data, headers=headers)
response = results.json()
message = response.get("message")
result = response.get("result")
content = {"message": message, "result": result}
return content
except Exception, e:
logging.error("请求失败 %s" % e)

四、关于function模块

主要调用二次封装的代码,结合业务做一个通用代码。如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 业务包:通用函数 import core.mysql as mysql
import core.log as log
import core.request as request
import core.excel as excel
import constants as cs
from prettytable import PrettyTable logging = log.get_logger() class ApiTest:
"""接口测试业务类"""
filename = cs.FILE_NAME def __init__(self):
pass def prepare_data(self, host, user, password, db, sql):
"""数据准备,添加测试数据"""
mysql.connect(host, user, password, db)
res = mysql.execute(sql)
mysql.close()
logging.info("Run sql: the row number affected is %s", res)
return res def get_excel_sheet(self, path, module):
"""依据模块名获取sheet"""
excel.open_excel(path)
return excel.get_sheet(module) def get_prepare_sql(self, sheet):
"""获取预执行SQL"""
return excel.get_content(sheet, cs.SQL_ROW, cs.SQL_COL) def run_test(self, sheet, url):
"""再执行测试用例"""
rows = excel.get_rows(sheet)
fail = 0
for i in range(2, rows):
testNumber = str(int(excel.get_content(sheet, i, cs.CASE_NUMBER)))
testData = excel.get_content(sheet, i, cs.CASE_DATA)
testName = excel.get_content(sheet, i, cs.CASE_NAME)
testUrl = excel.get_content(sheet, i, cs.CASE_URL)
testUrl = url + testUrl
testMethod = excel.get_content(sheet, i, cs.CASE_METHOD)
testHeaders = eval(excel.get_content(sheet, i, cs.CASE_HEADERS))
testCode = excel.get_content(sheet, i, cs.CASE_CODE)
actualCode = request.api(testMethod, testUrl, testData, testHeaders)
expectCode = str(int(testCode))
failResults = PrettyTable(["Number", "Method", "Url", "Data", "ActualCode", "ExpectCode"])
failResults.align["Number"] = "l"
failResults.padding_width = 1
failResults.add_row([testNumber, testMethod, testUrl, testData, actualCode, expectCode]) if actualCode != expectCode:
logging.info("FailCase %s", testName)
print "FailureInfo"
print failResults
fail += 1
else:
logging.info("Number %s", testNumber)
logging.info("TrueCase %s", testName)
if fail > 0:
return False
return True

五、关于参数中constans模块

准备工作:
所有的参数和常量我们会整理到这个文件中,因为设计业务和服务密码、数据库密码这里展示一部分。
代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 通用包:常量 CASE_NUMBER = 0 # 用例编号
CASE_NAME = 1 # 用例名称
CASE_DATA = 2 # 用例参数
CASE_URL = 3 # 用例接口地址
CASE_METHOD = 4 # 用例请求类型
CASE_CODE = 5 # 用例code
CASE_HEADERS = 6 # 用例headers SQL_ROW = 0 # 预执行SQL的行号
SQL_COL = 1 # 预执行SQL的列号 FILE_NAME = 'test.xlsx'

六、写一个run文件:只是用来执行的,业务和代码剥离。

代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 验证包:接口测试脚本 import core.log as log
from function.func import ApiTest func = ApiTest()
logging = log.get_logger() """1.外部输入参数""" module = 'user'
url = 'http://127.0.0.1:8080' """2.根据module获取Sheet"""
logging.info("-------------- Execute TestCases ---------------")
sheet = func.get_excel_sheet(func.filename, module) # """3.数据准备"""
# logging.info("-------------- Prepare data through MysqlDB --------------")
# sql = func.get_prepare_sql(sheet)
# func.prepare_data(host=host, user=user, password=password, db=db, sql=sql) """4.执行测试用例"""
res = func.run_test(sheet, url)
logging.info("-------------- Get the result ------------ %s", res)

七、查看测试报告(部署到jenkins会通过控制台查看)

 
报告.png

Python Api接口自动化测试框架 excel篇的更多相关文章

  1. Python Api接口自动化测试框架 代码写用例

    公司新来两个妹子一直吐槽这个接口测试用例用excel维护起来十分费脑费事,而且比较low(内心十分赞同但是不能推翻自己),妹子说excel本来就很麻烦的工具,于是偷偷的进行了二次改版. 变更内容如下: ...

  2. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

  3. python之接口自动化测试框架

    梳理python+unittest接口自动化测试框架的思路: 1.确定目录: cases:存放测试用例的py文件:config:存放一些数据库,环境地址等固定不变的信息: core:核心的文件, ca ...

  4. python版接口自动化测试框架源码完整版(requests + unittest)

    python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...

  5. 基于Python接口自动化测试框架(初级篇)附源码

    引言 很多人都知道,目前市场上很多自动化测试工具,比如:Jmeter,Postman,TestLink等,还有一些自动化测试平台,那为啥还要开发接口自动化测试框架呢?相同之处就不说了,先说一下工具的局 ...

  6. 【接口自动化】Python+Requests接口自动化测试框架搭建【一】

    公司项目启用新框架,前后端分离,所以接口测试成为测试工作中不可缺失的一个环节,现在将从0开始搭建接口自动化测试框架的路程,一步步记录下来. 开发语言我们采用Python+第三方库Requests,测试 ...

  7. python 做接口自动化测试框架设计

    1,明确什么叫自动化测试,什么叫接口自动化测试,如何设计接口测试用例,已登录为例 自动化测试:解放人力来自动完成规定的测试. 自动化测试分层模型:UI层,不论WEB端还是移动端,都是基于页面元素的识别 ...

  8. python+requests接口自动化测试框架实例详解教程

    1.首先,我们先来理一下思路. 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果(有的需要数据 ...

  9. 基于Python的接口自动化测试框架

    项目背景 公司内部的软件采用B/S架构,目的是进行实验室的数据存储.分析.管理. 大部分是数据的增删改查,但是由于还在开发阶段,所以UI的变化非常快,难以针对UI进行自动化测试,那样会消耗大量的精力与 ...

随机推荐

  1. wordpress搬家 更换域名

    结论:wordpress网站文件夹是和域名相关联的 wordpress,备份了数据库 然后用另一个新域名新建站,直接从wordpress官网直接下载的网站压缩包,没有用之前的网站文件夹. 然后把原来的 ...

  2. 迁移学习(Transformer),面试看这些就够了!(附代码)

    1. 什么是迁移学习 迁移学习(Transformer Learning)是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中.迁移学习是通过从已学习的相 ...

  3. 一个有趣的 5 X 5 方阵一笔画问题

      这个问题是在我上小学时同学告诉我的,当时觉得好玩,就随便瞎画这玩儿,不过从小学到大学,没有一次画成功过.这个问题起初同学告诉我的时候,图不是这样画的,我只是为了好表达,将问题抽象成网格了,原问题是 ...

  4. Hibernate自动执行更新方法

    问题场景:在执行查询时,没有对对象A调用save或者update操作,控制台显示却执行过一次update 问题原因:在执行查询之前 对A中的某一个关联对象 one-one one-many 等 字段 ...

  5. ubuntu 开机进入grub rescue> 解决办法(nvme固态硬盘)

    起因: 我是在windows下格式化了ubuntu的盘,然后重新安装ubuntu就出现了这种问题.卸载ubuntu的正确姿势,要去查一下,千万不要直接格式化. 解决方法: 1.  先使用ls命令,找到 ...

  6. IDEA部署 java Web项目 常见配置

    前言 从eclipse上转到idea上,第一次使用idea部署web项目,真折磨人,写了一个 helloworld 5分钟,了解idea部署web项目5小时. 我使用的是idea 2019.1版本,其 ...

  7. ZooKeeper 相关概念以及使用小结

    Dubbo 通过注册中心在分布式环境中实现服务的注册与发现,而注册中心通常采用 ZooKeeper,研究注册中心相关源码绕不开 ZooKeeper,所以学习了 ZooKeeper 的基本概念以及相关 ...

  8. 分布式事务TransactionScope所导致几个坑

    记录一下,个人见解,欢迎指正 错误: 1.该伙伴事务管理器已经禁止了它对远程/网络事务的支持. (异常来自 HRESULT:0x8004D025)2.事务已被隐式或显式提交,或已终止3.此操作对该事务 ...

  9. 12_goto语句的使用

    1.goto是一个关键字,其作用是运行到goto语句进行跳转,立即执行goto后面所对应标签的语句2.结构:goto 标签名(任意起)3.goto语句尽量不要跨函数使用,否则会使代码看起来非常乱,可读 ...

  10. JS高级(摘自简书)

    JS高级 1. 访问对象属性(方法也是属性)的通用方式:obj['属性名'] 1. 属性名包含特殊字符,如"-".空格,访问:obj['content-type'] 2. 属性名不 ...