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

news2024/9/9 1:23:00

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 pymysql

global 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分钟了,
                # 主动调用登录接口,重新更新token
                rtime = 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=token
            return 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_result



if __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_url


class login_interface():
    # 定义一个属性
    def __init__(self):
        self.uuid=''
        #增加token属性
        self.token=''
    #方法1:获取验证码对应的uuid
    def 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 uuid
        self.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):

        # 进行检查点的验证
        # 提取msg
        msg=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  result

if __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 json


import requests
import pymysql

from test_driver.driverV1 import glob_url, driver_run


class 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'])
            # 比对结果:直接比对接口返回msg
            self.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 result

if __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.coloradmin.cn/o/1917401.html

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

相关文章

【小白也能看的懂】想要玩转AI大模型,这4招你得知道

前言 对于大部分人来说,能够灵活使用AI工具,并对自己每个常用的AI工具优劣势很清楚,就已经足够了。不过,毕竟AI发展实在太快,多了解一些相关的知识点,以全局的视角去看AI,可以避免管中窥豹&…

用SmartEDA点亮电路教学:传统课堂的革新之道

在数字化浪潮的推动下,教育领域也迎来了前所未有的变革。特别是在电路教学这一专业领域,传统的黑板加课本的教学模式已难以满足现代学生的需求。今天,我们就来探讨一下,如何利用SmartEDA电路仿真软件来补充传统教学,为…

Oracle 23ai 中的重要新特性 VECTOR 数据类型

Oracle 23ai 中的 VECTOR 数据类型是 Oracle 数据库在 AI 领域的一个重要新特性,它允许用户以向量的形式存储数据,并在这些向量的基础上进行高效的搜索和分析。以下是对 Oracle 23ai VECTOR 数据类型的详细解析: 参考官方文档地址 https://d…

Python机器学习推理工程化落地步骤指南

目录 一、引言 二、数据准备 2.1 数据收集 2.2 数据清洗 2.3 特征工程 2.4 数据分割 三、模型训练 3.1 选择算法 3.2 训练模型 3.3 模型评估 3.4 模型调优 四、模型部署 4.1 模型序列化 4.2 构建推理服务 4.3 部署与监控 五、总结 在当今科技飞速发展的时代…

【SVN的使用-通过xCode使用SVN-SVN的目录结构 Objective-C语言】

一、接下来,我们来通过xcode使用SVN啊 1.我先把小明这个目录下,wechat这个文件夹都删了, 我现在小明新入职了,但是呢,我现在不喜欢用命令行,我也不喜欢用Corner Stone,我要用xcode, 作为小明,我入职以后,第一件事儿,要把代码checkout下来, 那首先呢,打开你的xc…

从3D扫描到CAD模型【逆向工程】

有时,你无法访问零件原始生产中的原始设计文档。逆向工程(reverse engineering)使你能够分析物理零件并探索其最初的制造方式,以复制、创建变体或改进设计。目标是最终创建一个用于制造的新 CAD 模型。 虽然逆向工程的概念非常简…

Linux--安装VMware步骤

安装VMware VMware Desktop Hypervisors for Windows, Linux, and Mac 复制链接打开浏览器下载即可 从官网下载软件,完成后为确保后续正常使用,需要检查虚拟网卡是否安装完成 检查虚拟网卡的安装步骤 Windows--设置--高级设置--网络适配器--看是否有显…

录屏软件免费推荐,拥有这4款,不花一分钱

在这个充满创意与活力的数字时代,录屏软件早已成为我们探索世界、分享生活的必备神器。但市面上却存在很多收费的录屏软件,让人望而却步。那么有没有一些录屏软件免费帮助我们轻松开启录影人生,尽情展现创意与才华呢? 本文就将带…

【错题集-编程题】kotori 和 n 皇后(哈希表)

牛客对应题目链接&#xff1a;kotori和n皇后 (nowcoder.com) 一、分析题目 算法思路&#xff1a;使用哈希表标记行列以及两个对角线。 注意&#xff1a;输出的时候提前判断⼀下。 二、代码 //值得学习的代码 #include <iostream> #include <unordered_set>using n…

旷野之间14 - 常见的AI面试题解答

​​​​​ 1. 什么是大型语言模型(LLM)以及它如何工作? 大型语言模型 (LLM),例如 GPT-3 或 BERT,是具有理解和生成类似人类的文本能力的高级机器学习模型。 核心组件和操作: 编码器-解码器框架:用于 GPT-3(单向)和 BERT(双向)等模型。Transformer 架构:利用具有…

N-(4-Azido-2-nitrophenyl)-N‘‘-biotinylnorspemidine

​一、基本信息 常用名&#xff1a;N-(4-Azido-2-nitrophenyl)-N-biotinylnorspemidine 英文名&#xff1a;N-(4-Azido-2-nitrophenyl)-N-biotinylnorspemidine CAS号&#xff1a;786609-83-4 分子式&#xff1a;C22H33N9O4S 分子量&#xff1a;519.62 二、结构特点 该化…

【深海王国】小学生都能玩的语音模块?ASRPRO打造你的第一个智能语音助手(9)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督继续为大家带来系列——小学生都能玩的语音模块&#xff0c;帮你一周内快速学会语音模块的使用方式&#xff0c;打造一个可用于智能家居、物联网领域的语音助…

如何下载git上的代码到本地

第一步&#xff1a;第一步&#xff1a;进入所在项目&#xff0c;右击打开"Git Bash Here" 第二步&#xff1a;git clone https://gitee.com/xxx/xxxx #文件地址链接 完结&#xff1a;

TCP协议双向网络通讯---Python实现

本篇文章是博主在人工智能、网络通讯等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在Python…

基于uni-app与图鸟UI的知识付费小程序模板

一、项目概述 在知识经济蓬勃发展的背景下&#xff0c;移动互联网成为知识传播与消费的重要渠道。本项目旨在利用前沿的前端技术栈——uni-app及高效UI框架图鸟UI&#xff0c;打造一款集多功能于一体的、面向广大求知者的知识付费平台移动端模板。该模板旨在简化开发流程&…

《大明混一图》: 令人叹为观止的古代世界地图

关注我们 - 数字罗塞塔计划 - 《大明混一图》是我国目前保存尺寸最大、最完整、年代最久远&#xff0c;且由中国人自己绘制的世界地图&#xff0c;2003年10月被列入《中国档案文献遗产名录》&#xff0c;现保存于中国第一历史档案馆。据学者们研究&#xff0c;这幅地图大约是…

【SD教程】全网最详细的AI绘画提示词语法讲解!(附提示词插件包)

AI绘画提示词如何写&#xff1f;对于入门的小伙伴来说这是一个大问题&#xff0c;提示词写的好&#xff0c;才能有高质量的作品&#xff0c;那今天给大家详细讲解一下&#xff0c;建议点赞收藏&#xff01; 文末附提示词插件 一、SD提示词基础 AI绘画提示词基本规则 1、提示…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及负荷时空特性的高速公路链式微网光-储-充容量优化配置方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

政企单位光纤资源高效管理与优化策略

引言 随着信息技术的飞速发展&#xff0c;政企单位对于通信基础设施的管理要求日益提高。然而&#xff0c;传统的管理模式&#xff0c;如Excel表格记录和纸质审批流程&#xff0c;已难以满足当前复杂多变的业务需求。在此背景下&#xff0c;我们实施了光纤管理的数字化转型项目…

仕考网:公务员如何备考申论

在备战公务员考试的申论部分时&#xff0c;掌握一定的技巧&#xff0c;遵循特定的步骤是至关重要的。以下是一些备考策略&#xff0c;希望能帮助到大家&#xff1a; 1. 掌握考试大纲和命题趋势 在考试大纲中明确了题目的类型和可能涉及的主题范围&#xff0c;考生可以聚焦到关…