物业系统自主研发接口测试框架

1、自主研发框架整体设计

1.1、什么是测试框架?

在了解什么是自动化测试框架之前,先了解一下什么叫框架?框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面,而后者是从目的方面给出的定义。从框架的定义可以了解,框架可以是被重用的基础平台;框架也可以是组织架构类的东西。其实后者更为贴切,因为框和架本来就是组织和归类所用的。

所以自动化测试框架的定义为:由一个或多个自动化测试基础模块、自动化测试管理模块自动化测试统计模块等组成的工具集合。

框架的定义来分,自动化测试框架可以分为:基础功能测试框架、管理执行框架;按不同的测试类型来分,可以分为:功能自动化测试框架、性能自动化测试框架;按测试阶段来分,可以分为:单元自动化测试框架、接口自动化测试框架、系统自动化测试框架;按组成结构来分,可以分为:单一自动化测试框架、综合自动化测试框架;按部署方式来分,可以分为:单机自动化测试框架、分布式自动化测试框架。

看到这里,也许大家看完也不清楚上面到底讲的是什么。因为没有实际接触过,不知道具体功用,只是用一种抽象解释另一种抽象,另外只是描述了结论,没有描述推演的过程。

1.2、那么如何打破阻碍呢?

方法如下:

1、工作遇到了什么问题,需要使用XX技术?

2、这个技术能解决当下的工作问题吗?解决到什么程度呢?

3、这个技术能做什么,不能做什么?

4、具体如何实现的过程?

当前有下面的脚本需要接入到框架中。

要有以终为始的逆向思维方式,从最下面往上面分析。

1.3、框架测试报告初期规划:

执行时间,执行人,执行环境..

XXX时间:执行了XXX接口,接口执行结果

XXX时间:脚本报错信息

框架脚本整体执行情况统计

把框架测试结果发给相关责任人

1.4测试框架驱动设计

1、设置全局环境数据结构

2、读取测试框架配置文件

3、按照配置文件制定内容执行对应的测试脚本

4、创建测试报告,并写入总体初始化内容

5、若执行完所有的测试脚本,输出最终的测试报告,否则继续执行下一个脚本

6、写入新的测试报告内容

7、保存测试报告。

1.5 测试框架整体结构

本次测试框架分为三个层。分别为驱动层test_driver,报告层test_report,测试脚本层test_script。

其中config.csv是存放的测试脚本及路径 。

driverV1.py是驱动的执行程序。

report1.py存放的是测试报告

testcase_report1.txt存放的是单个用例不同数据的执行结果。

2、登录接口自研框架实践_global+csv+system文件

driver通过读取config.csv里面的信息,读取脚本名,再到test_script下面去找对应的脚本执行。

驱动读取框架配置文件

3、自研框架类图及流程图设计梳理

框架整体流程图:

config.csv内容

3.1 驱动类设计

进行实例化对象

#导入类库
import csv,os
import datetime
# 试验1:普通全局变量的使用
import pymysqlglobal glob_url
glob_url='https://svr-6-9009.share.51env.net/prod-api'
print(glob_url)
# 封装成一个驱动类
class driver_run():#读取配置文件,获取py文件名def run_testpy(self):# 设置脚本程序对应的路径path = "..\\test_script\\"csvfile=open("config.csv",'r')rows=csv.reader(csvfile)# 跳过标题行next(rows)# 逐行读取配置文件内容for row in rows:print(row[2])self.number=row[0]self.name = row[1]# 判断是否创建测试用例报告头部if row[4]=='Y':if row[3] == '1':self.create_testcase_report()# 调用指定的接口脚本文件os.system("python "+path+row[2])# return row[0],row[1]  不能用面向过程的方法,要用面向对象的方法# 调用报告写入内容方法self.write_report()self.endtime=datetime.datetime.now()# 获取当前框架程序运行的总时长,如果时长已经大于50分钟了,# 主动调用登录接口,重新更新tokenrtime = self.endtime - self.starttime# 判断时间差是否超过50分钟if (rtime.seconds // 60) >= 50:# 调用登录接口os.system("..\\test_script\\loginV4.py")# 定义创建测试报告并写入头部公共信息def create_report(self):self.starttime = datetime.datetime.now()# print(self.starttime)# 时间进行格式化starttime = self.starttime.strftime("%Y-%m-%d %H:%M:%S")print(starttime)# 将时间戳写入txt文件txtReport = open('..\\test_report\\report1.txt', "w")txtReport.write("*****************************************************************""\n")txtReport.write("智慧物业系统接口测试框架"+"\n")txtReport.write(starttime+"         shangshang"+"       "+"\n")txtReport.write("接口测试执行环境说明:"+glob_url+"\n")txtReport.write("*****************************************************************"+"\n")txtReport.close()# 定义创建测试用例报告并写入头部公共信息def create_testcase_report(self):starttime = datetime.datetime.now()print(starttime)# 时间进行格式化starttime = starttime.strftime("%Y-%m-%d %H:%M:%S")print(starttime)# 将时间戳写入txt文件txttestReport = open('..\\test_report\\testcase_report1.txt', "w")txttestReport.write("*****************************************************************""\n")txttestReport.write("该测试用例运行开始时间:"+starttime+"\n")txttestReport.write("接口编号"+self.number+"          ")txttestReport.write('接口名称'+self.name+"\n")txttestReport.write("*****************************************************************"+"\n")txttestReport.close()def write_report(self):txtReport = open('..\\test_report\\report1.txt', "a")txtReport.write("接口编号:"+self.number+"    接口名称:"+self.name)# 读取comresult文件中的测试结果comfile=open("commonresult.txt", 'r')for result in comfile:txtReport.write("       接口测试结果:"+result+"\n")comfile.close()txtReport.close()def write_commonresult(self,result):# 写入接口测试结果到公共文件中comfile = open("..\\test_driver\\commonresult.txt", 'w')# 把result存入data文件中comfile.write(result)comfile.close()#取出token文件中的token的值def get_token(self):tokenfile=open("..\\test_driver\\token.txt","r")for token in tokenfile:tokenvalue=tokenreturn tokenvalue#连接数据库进行查询返回查询结果def db_connect(self,sql):# 打开数据库连接db=pymysql.connect(host='vip.51env.net',user='readonly',password='******',port=30001,db='******',charset='utf8')# 用cursor()方法获取操作游标cursor = db.cursor()# 使用execute方法执行SQL语句cursor.execute(sql)# 使用fetchall()方法获取一条数据db_result=cursor.fetchall()# 关闭数据库连接db.close()# 返回查询结果return db_resultif __name__ == '__main__':#实例化驱动类的对象objdriver=driver_run()# 创建测试报告头部objdriver.create_report()# 调用接口文件objdriver.run_testpy()

3.2 登录类

实例化登录类

# ********************************************************************************
# 登录接口V5.0脚本实现
# 功能:1、调用图片验证码接口获取uuid
#      2、将获取到的uuid传入登录接口中
#       3、分别对两个功能进行面向对象封装
# 修改内容: 增加token属性,为其他接口提供验证
# ********************************************************************************
#  导入类库
import requests
import json
# 定义一个类:包含两个方法和一个属性
from test_driver.driverV1 import driver_run,glob_urlclass login_interface():# 定义一个属性def __init__(self):self.uuid=''#增加token属性self.token=''#方法1:获取验证码对应的uuiddef getuuid(self):# 取验证码图片接口uuid# 定义获取验证码接口地址CaptchaURL = 'https://svr-6-9009.share.51env.net/prod-api/captchaImage'# 发送请求response = requests.get(CaptchaURL).json()# 获取uuid# print(type(response))# 全局uuid引用说明# global uuidself.uuid = response['uuid']# print(self.uuid)# return uuid# 执行登录接口的测试def login_test(self):# 定义接口地址url = "https://svr-6-9009.share.51env.net/prod-api/login"# 定义接口参数# print("登录方法中", self.uuid)userinfo = {"username": "admin","password": "admin123","code": "51testing","uuid": self.uuid}# print(type(userinfo))# 将字典类型转化为json类型userjson = json.dumps(userinfo)# print(type(userjson))# 发送接口请求response = requests.post(url, data=userjson, headers={"Content-Type": "application/json"}).json()# print(response)# print(response["msg"])# 对比实际和预期结果if response["msg"] == '操作成功' and response["username"] == 'admin':result="登录接口成功"self.token=response["token"]tokenfile=open("..\\test_driver\\token.txt","w")tokenfile.write(self.token)tokenfile.close()else:result="登录接口失败"return result# 进行实例化调用
if __name__ == '__main__':# 实例化对象loginObj=login_interface()# 调用其中的方法loginObj.getuuid()result=loginObj.login_test()print(result)# 实例化驱动类对象objdriver=driver_run()# 调用写入公共文件方法objdriver.write_commonresult(result)

3.3 获取用户信息接口

代码:

# **********************************************************
# 获取登录用户信息接口V3.0脚本实现
# 功能:常量参数传递
# 问题1:引用登录接口类
# 问题2:运行登录接口类,并获取最新的token
# 问题3:用面向对象的方法将获取到的最新的token传入获取用户信息接口
# ***********************************************************
# 引入登录接口类
from test_driver.driverV1 import glob_url,driver_run
# 导入类库
import requests# **************************************************class GetUserInfo():def getuser_test(self,token):# 定义接口地址url=glob_url+'/getInfo'header={'Authorization':'Bearer '+token}# 发送请求并获取self.response=requests.get(url,headers=header).json()print(self.response)def getuser_check(self):# 进行检查点的验证# 提取msgmsg=self.response['msg']# print(msg)# 通过assert断言进行msg的验证# 提取电话phone=self.response['user']['phonenumber']# print(phone)# 提取邮箱email=self.response['user']['email']# print(email)# 提取用户名username=self.response['user']['userName']# print(username)#对assert进行异常捕获try:assert msg == '操作成功'assert phone=='13800138000'assert email=='13800138000@139.com'assert username=='admin'except:result="获取用户信息接口测试失败"else:result = "获取用户信息接口测试成功"return  resultif __name__ == '__main__':objdriver=driver_run()token=objdriver.get_token()print(token)#实例化获取用户信息对象类objgetuser=GetUserInfo()objgetuser.getuser_test(token)result=objgetuser.getuser_check()# 将测试执行结论放入comresult.txt中objdriver.write_commonresult(result)

3.4 创建商铺接口

#创建商铺接口V1.0接口脚本实现
#功能:常量参数传递
#*************************************************************************
# 导入类库
import datetime
import jsonimport requests
import pymysqlfrom test_driver.driverV1 import glob_url, driver_runclass createhouse_interface():def createhouse_test(self,token):# 打开测试用例报告文件txttestReport = open('..\\test_report\\testcase_report1.txt', "a")# 定义接口地址url=glob_url+'/baseconfig/House'for i in range(1,3):# 传入接口参数,获取实际返回值self.code='05-09-'+str(i)housedata={"block": "01","code": self.code,"buildingsquare": "100","usesquare": "50","state": "empty","floor": "12","rentFee": "12000","remark": "test"}housejson=json.dumps(housedata)# 传入token参数header = {'Authorization': 'Bearer ' + token,"Content-Type":"application/json"}# 比对结果1:接口返回值response=requests.post(url,data=housejson,headers=header).json()print(response['msg'])# 比对结果:直接比对接口返回msgself.msg=response['msg']if self.msg=='新建成功':result='创建商铺接口测试用例'+self.code+"接口测试用例成功"else:result = '创建商铺接口测试用例' + self.code + "接口测试用例失败"# 将接口测试用例的执行结果及数据内容写入对应的测试用例报告中# 写入是第几次测试,测试商铺编号,测试结论txttestReport.write('测试用例编号:'+str(i))txttestReport.write("    创建商铺的编号为:"+self.code)txttestReport.write("    测试用例执行结果:"+result+"\n")txttestReport.write("*****************************************************************" + "\n")#共执行多少条数据txttestReport.write("共执行" + str(i) +"条测试用例"+ "\n")# 获取系统时间,来写入结束时间endtime = datetime.datetime.now()# 时间进行格式化endtime = endtime.strftime("%Y-%m-%d %H:%M:%S")# 时间格式进行格式化txttestReport.write('该接口测试执行结束时间:'+endtime+"\n")txttestReport.close()#连接后台数据库进行ID的检查,并给出测试结论def createhouse_checkCode(self):id='5c7100ce60d044768223daf1546b3b61'sql="SELECT * FROM `config_house` WHERE id ='"+id+"'"dbresult=objdriver.db_connect(sql)print(dbresult)db_code=dbresult[0][1]print(db_code)# #判断是否执行成功if db_code==self.code and self.msg=='新建成功':result="创建商铺列表接口测试通过"print(self.code)else:result="创建商铺列表接口测试失败"print(self.code)return resultif __name__ == '__main__':objdriver = driver_run()token = objdriver.get_token()print(token)# 实例化创建商铺接口类对象objcreatehouse = createhouse_interface()objcreatehouse.createhouse_test(token)# 调用数据库检查点result=objcreatehouse.createhouse_checkCode()# 将测试执行结论放入comresult.txt中objdriver.write_commonresult(result)

4、框架报告+测试用例报告

愿每个测试都能成为测试开发,提高职业技能,成为前1%的存在,为社会创造更大的价值,为公司节约更多的成本,为自己和家庭谋求更高的收入,所有人不受职业年龄限制,越老越吃香,直至财富自由;愿测试技术越来越进步,软件质量进一步得到提高,效率提高。愿祖国更加美好,人民更加幸福。多喜乐,常安宁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 主从复制,集群与高可用

虽然Redis可以实现单机的数据持久化,但无论是RDB也好或者AOF也好,都解决不了单点宕机问题,即一旦单台 redis服务器本身出现系统故障、硬件故障等问题后,就会直接造成数据的丢失 此外,单机的性能也是有极限的,因此需要使用另外的技…

捷配生产笔记-细间距芯片的表面处理工艺:OSP与沉金工艺的重要性

在现代电子制造领域,随着技术的进步,电子设备变得越来越小型化和高性能化。细间距芯片作为实现这一目标的关键组件,其制造工艺要求极为严格。在这些要求中,表面处理工艺尤为关键,因为它直接影响到芯片的焊接质量和长期…

实验7 数据查询(2)

一、实验目的 学习SQL语言的定义、操纵功能熟悉通过SQL语言对数据库进行查询操作,包括单表查询、多表查询、嵌套查询、集合查询 二、实验软件 MySQL三、实验内容和要求 给定四个关联表,其定义和数据加载如下: 学生表 Student create tab…

Cesium中实现图层组

图层组 某天领导找我,说业务中可能存在多个影像服务为一个图层组,并且需要同时加载和同时在图层列表中上下移动的需求。 例如一些专题地图,包含所有学校、医院、公交站等图层,而这些图层都是单独发布的。 在 Cesium 中确实存在…

前端与嵌入式开发通信之QWebChannel(Qt)

前端与嵌入式开发通信之QWebChannel 最近开发中需要用到和c开发的操作台进行通信的的需求,就找到了这个技术,记录一下 首先需要安装导入 qwebchannel npm i qwebchannel import { QWebChannel } from "qwebchannel"; 初始化qwebchannel并封…

myeclipse开发ssm框架项目图书管理系统 mysql数据库web计算机毕业设计项目

摘 要 随着计算机的广泛应用,其逐步成为现代化的标志。图书馆的信息量也会越来越大,因此需要对图书信息、借书信息、还书信息等进行管理,及时了解各个环节中信息的变更,要对因此而产生的单据进行及时的处理,为了提高高…

智充科技营收增速放缓:经营成本飙升,应收账款大幅增长

《港湾商业观察》黄懿 6月10日, XCHG Limited 智能充电有限公司(下称:智充科技)在美国证监会(SEC)更新招股书,拟在美国纳斯达克上市,其股票代码为“XCH”。北京智充科技有限公司为其国内运营主体(下称“北京智充科技”…

Linux-shell编程入门基础

文章目录 前言Shell编程bash特性shell作用域变量环境变量$特殊变量$特殊状态变量 $特殊符号(很重要)其他内置shell命令shell语法的子串截取统计 指令执行时间练习shell特殊扩展变量父子shell的理解内置和外置命令区别 数值计算双括号(())运算letexprexpr模式匹配 bcawk中括号 s…

数据结构(Java):Stack相关OJ习题

1、括号匹配问题 . - 力扣(LeetCode) 1.1 思路分析 根据栈的先进后出原则,我们可以这样解决问题: 遍历字符串,遇见左括号就将左括号push入栈;遇见右括号就pop出栈,将出栈的元素和该右括号比较…

最简单的vue3组件之间传值

localStorage 是 HTML5 引入的一个 Web Storage API 的一部分,它允许网页在用户的浏览器上存储数据。localStorage 提供了一种持久化的本地存储方案,数据不会因为浏览器关闭而丢失,除非用户或脚本显式地删除它们。 localStorage 是一种非常实…

批量提取网页表格内容至excel文件

问题背景 将网页的表格内容(5237个股票信息)复制粘贴到excel文件中 网址:A股上市公司名单-A股上市公司名录-A股上市公司大全-商业计划书-可研报告-中商产业研究院数据库-中商情报网 实现代码 # 导入包 import pandas as pd import time# 创…

超越传统:3D生物打印如何利用扩散创造奇迹?

超越传统:3D生物打印如何利用扩散创造奇迹? 组织工程和再生医学领域迫切需要能够模拟人体组织结构和功能的体外模型和组织替代物。然而,传统的体外模型和组织替代物往往难以满足高度特异性、复杂性和功能性的要求。3D生物打印技术应运而生&a…

Base64文件流查看下载PDF方法-CSDN

问题描述 数票通等接口返回的PDF类型发票是以Base64文件流的方式返回的&#xff0c;无法直接查看预览PDF发票&#xff0c; 处理方法 使用第三方在线工具&#xff1a;https://www.jyshare.com/front-end/61/ 在Html代码框中粘贴如下代码 <embed type"application/pd…

技术开发分享:商品详情APP原数据实时接口代码解析

商品详情app端原数据实时接口代码解析主要包括以下几个步骤&#xff1a; 获取商品ID&#xff1a;首先需要从淘宝的分享链接中提取商品ID&#xff0c;可以通过正则表达式匹配的方式获取。 构建请求URL&#xff1a;根据商品ID构建请求URL&#xff0c;通常包括淘宝的商品详情API地…

未来互联网的新篇章:深度解析Web3技术

随着技术的不断演进&#xff0c;Web3正逐渐成为引领未来互联网发展的关键驱动力。本文将深入探讨Web3技术的核心概念、关键特征以及其对未来互联网生态的深远影响&#xff0c;旨在帮助读者全面理解和把握这一新兴技术的发展方向和潜力。 1. Web3的基本概念和演进 Web3并非简单…

为什么键盘上F和J这两个键有两个凸起的横线呢?

不知道小伙伴们有没有注意过&#xff0c;我们常用的电脑键盘上&#xff0c;为什么F和J这两个键总是有两个凸起的横线的呢&#xff1f; 首先&#xff0c;让我们来回顾一下这位陪伴我们多年的老朋友——键盘。从最初的打字机到现在的机械键盘、薄膜键盘&#xff0c;键盘的形态和…

新书速览|Vue.js 3.x+Express全栈开发:从0到1打造商城项目

《Vue.js 3.xExpress全栈开发&#xff1a;从0到1打造商城项目》 1 本书内容 《Vue.js 3.xExpress全栈开发 : 从0到1打造商城项目》是一本详尽的全栈开发教程&#xff0c;旨在通过Vue.js和Express框架引导读者从零开始构建一个完整的电商项目。内容覆盖电商项目的基本结构&…

C++——map和set类用法指南

一、前言 1.1 关联式容器 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key,value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。 1.2 键值对 用来表示具有一一对应关系的一种结构&#xff0c;该结构中一般…

Redis如何高效实现定时任务

写在文章开头 redis通过单线程结合非阻塞事件轮询机制实现高效的网络IO和时间事件处理&#xff0c;这篇文章我们将从源码的角度深入分析一下redis时间事件的设计与实现。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CS…

项目三层架构详情

三层架构 三层架构就是为了符合“高内聚&#xff0c;低耦合”思想&#xff0c;把各个功能模块划分为表示层&#xff08;UI&#xff09;、业务逻辑层&#xff08;BLL&#xff09;和数据访问层&#xff08;DAL&#xff09;三层架构&#xff0c;各层之间采用接口相互访问&#xf…