工作原理: 测试用例在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. 在centos6系列vps装Tomcat8.0

    In the following tutorial you will learn how to install and set-up Apache Tomcat 8 on your CentOS 6 ...

  2. Servlet 常用API学习(二)

    Servlet常用API学习 一.HTTP简介 WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议. HTTP是 hypertext transfer pr ...

  3. Leetcode之深度优先搜索(DFS)专题-515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)

    Leetcode之深度优先搜索(DFS)专题-515. 在每个树行中找最大值(Find Largest Value in Each Tree Row) 深度优先搜索的解题详细介绍,点击 您需要在二叉树 ...

  4. Java中指令重排

    /** * 指令重排:代码执行顺序与预期不一致 (发生在前后行代码无联系时) * 目的:提高性能 * */ public class HappenBefore { private static int ...

  5. ST算法 Sliding Window algorithm template

    ST算法(Sliding Window):A easy way to slove the substring problems algorithm template to slove substrin ...

  6. 【管理学】SMART

  7. 2019年牛客多校第一场 B题 Integration 数学

    题目链接 传送门 思路 首先我们对\(\int_{0}^{\infty}\frac{1}{\prod\limits_{i=1}^{n}(a_i^2+x^2)}dx\)进行裂项相消: \[ \begin ...

  8. CF - 652 D Nested Segments

    题目传送门 题解: 可以将所有线段按照左端点优先小,其次右端点优先大进行排序. 然后对于第 i 条线段来说, 那么第 i+1 ---- n 的线段左端点都一定在第i条线段的右边, 接下来就需要知道 i ...

  9. hdu3746(kmp最小循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 题意:问在一个字符串末尾加上多少个字符能使得这的字符串首尾相连后能够循环 题解:就是利用next ...

  10. @PathVariable性能损耗分析

    前端时间参与了一次业务线排障,是接口服务并发性能比较差,性能损耗大的问题,我经过几次研究分析和压测,确定了故障源是@PathVariable耗时过长引起的. @PathVariable使用形式: @R ...