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. Camera2使用surface支持

    surfaceview是运行在子线程,可以为相机提供不断的刷新 public class MainActivity extends AppCompatActivity { public void on ...

  2. Solr入门-Solr服务安装(windows系统)

    安装Solr 首先保证已经正确安装了Java 下载Solr,当前最新版6.1.0 Solr各个版本下载地址 Solr从6.0之后需要Java1.8所以如果使用Solr6.0及其以上版本,请确保Java ...

  3. 【DeepLearning】LeNet-5

    手写字体识别模型LeNet5诞生于1994年,是最早的卷积神经网络之一.原文地址为Gradient-Based Learning Applied to Document Recognition,感谢网 ...

  4. 任务管理器中arcsom.exe和arcsoc.exe的个数问题

    转载链接:http://blog.newnaw.com/?p=78 安装了ArcGIS Server的机器,当打开任务管理器的时候,会看到里面有arcsom.exe和arcsoc.exe进程,但它们的 ...

  5. 【总结】jvm

    一.jvm体系结构 1.jvm整体结构 jvm总体上是由类装载子系统(ClassLoader).运行时数据区.执行引擎三个部分组成. (jvm本质上就是一个java进程) 2.jvm生命周期 (1)j ...

  6. NB-IoT技术适合在哪些场景应用

    LPWAN,Low Power Wide Area Network,低功耗广域网.名字里就有它的两个最重要的特点:低功耗.广覆盖.目前比较主流的有:NB-IoT.LoRa.Sigfox.eMTC.NB ...

  7. IOCP 模型2 AcceptEx

    // IOCP2.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...

  8. IDEA 搭建 Spark 源码 (Ubuntu)

    版本:Spark 2.4.3/JDK 1.8/Scala 2.11.0 1.选择Spark版本.压缩包下载. 2.IDEA中左下角Terminal下输入: mvn -DskipTests clean ...

  9. 使用rabbitmq实现集群im聊天服务器消息的路由

    这个地址图文会更清晰:https://www.jianshu.com/p/537e87c64ac7 单机系统的时候,客户端和连接都有同一台服务器管理.   image.png 在本地维护一份userI ...

  10. simulink产生周期矩形波和8421码

    初次入门simulink,由于学习了数字逻辑,试图进行仿真,首先需要的就是8421码,但是没找到simulink里面相关模块,如果各位知道怎么弄可以评论告诉我分享分享哈哈 我用的是matlab2016 ...