api4excel - 接口自动化测试excel篇

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

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

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

代码的分层如下图:

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

代码实现如下:

 # !/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模块接口测试

准备工作: 需要的请求类型和执行测试的方法。 代码如下:

#!/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会通过控制台查看)

api4excel - 接口自动化测试excel篇的更多相关文章

  1. Python Api接口自动化测试框架 excel篇

    工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务moduleName查找对应表单,运用第三方库req ...

  2. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  3. java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)

    简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...

  4. Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)

    废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...

  5. 接口自动化测试unittest+request+excel(一)

    注: 学习python自动化测试,需要先学习python基础,主要还是多敲代码,多联系,孰能生巧,你也会是一名合格的程序员 python基础学习: http://c.biancheng.net/pyt ...

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

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

  7. 手把手教你接口自动化测试 – SoapUI & Groovy

    手把手教你接口自动化测试 – SoapUI & Groovy http://www.cnblogs.com/wade-xu/p/4236295.html 关键词:SoapUI接口测试,接口自动 ...

  8. 接口自动化测试框架 (一) :APIAutoTest框架

    前言 随着测试技术的发展,接口自动化测试逐渐成为各大公司投入产出比最高的测试技术.介入时间早,执行效率高,稳定性高的优点,让越来越多的公司引入接口自动化测试. 框架简介 APIAutoTest是处理A ...

  9. python3+requests+unittest:接口自动化测试(一)

    转载请表明出处:https://www.cnblogs.com/shapeL/p/9179484.html 简单介绍框架的实现逻辑,参考代码的git地址: https://github.com/zha ...

随机推荐

  1. # ThreeJS学习7_裁剪平面(clipping)

    ThreeJS学习7_裁剪平面(clipping) 目录 ThreeJS学习7_裁剪平面(clipping) 1. 裁剪平面简介 2. 全局裁剪和局部裁剪 3. 被多个裁剪平面裁剪后 4. 被多个裁剪 ...

  2. 关于c++ string类的一些使用

    主要最近要用的上 才整理一下 用string类别忘了导入头文件 #include <string> 注意这个细节:cout 可直接输出 string 类的对象的内容 但是printf不可以 ...

  3. Java面试题集(一)问题清单

    java基础篇: 1.1.Java基础 (1)面向对象的特性:继承.封装和多态 (2)final.finally.finalize 的区别 (3)Exception.Error.运行时异常与一般异常有 ...

  4. codefroces中的病毒,这题有很深的trick,你能解开吗?

    大家好,欢迎阅读周末codeforces专题. 我们今天选择的问题是contest 1419的C题,目前有接近8000的人通过了本题.今天这题的难度不大,但是真的很考验思维,一不小心就会踩中陷阱,我个 ...

  5. EasyExcel使用心得

    最近项目中用到了阿里easyExcel做导入导出功能 下面是我写的一个工具类,带泛型的.拿来即用,有需求的小伙伴可以看看. 同时也欢迎大佬提出修改意见. 一.首先先写一个生成Excel表头的DTO类, ...

  6. 在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 数据库)

    搭建 SonarQube 和 PostgreSQL 服务 本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方文档中声明 7.9 版本之后就不再支持使用 MySQL 数据 ...

  7. CSP-S 2020模拟训练题1-信友队T1 四平方和

    题意简述 \(n\)是正整数,其四个最小的因子分别为\(d_1,d_2,d_3,d_4\). 求对于所有的\(n \le m\)满足 \[d_1^2+d_2^2+d_3^2+d_4^2=n \] 的\ ...

  8. 浅谈querySelector和getElementById之间的区别

    前言: 最近学到前端一些知识,看到很多视频上许多老师都用的是querySelector而部分老师用的是getElementById,我就很疑惑,这两有啥区别,都是选择器,于是百度了一下明白了,quer ...

  9. Luogu P1856 [USACO5.5]矩形周长Picture

    线段树+扫描线 经典的扫描线问题 首先将一个矩形看作由竖着的两条边和横着的两条边构成 那分成两次考虑,一次考虑竖边,一次考虑横边 首先考虑横边 如图两个矩形,现将横边擦去,留下竖边,将平面划分成3个区 ...

  10. 【kata Daily 190905】What's a Perfect Power anyway?(完美幂)

    原题: A perfect power is a classification of positive integers: In mathematics, a perfect power is a p ...