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

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.mfbz.cn/a/793849.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【趣味数学】求阴影部分面积

题 解法1: 中位线法 既然是中点,就可以用起来,横着不行,竖着来,扩展做辅助线 E是中点S(AED) 1/4 S(ABCD) 6 做图中辅助延长线,因为E中点,所以S(MEB)S(AED) 6 同理E也是…

css预编译器--sass

Sass Sass 提供了 变量(variables)、嵌套规则(nested rules)、 混合(mixins)、 函数(functions),目前我使用最多的还是变量和嵌套规则,貌似目前css也支持嵌套…

Jenkins设置开机自启(以war包方式启动jenkins)

配置环境:Centos7.6/Jenkins 2.452.2/jdk-21.0.3 jenkins启动命令: nohup java -jar jenkins.war > /dev/null 2>&1 & 1、创建sh脚本文件 # jenkins.war包,放在了/root/software目录 cd /root/software vim jenkins-start.sh …

若依 ruoyi-vue SpringBoot highlight-textarea 输入框敏感词关键词高亮标红(二)

参考文章,非常感谢大佬的分享 实现可高亮的输入框 — HighlightTextarea GitHub:highlight-textarea 可看作者上一篇文章 若依 ruoyi-vue SpringBoot聊天敏感词过滤sensitive-word(一) 效果图 审核时,输入框高亮敏感词&#xff…

暑假第一次作业

第一步:给R1,R2,R3,R4配IP [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1-Serial4/0/0]ip address 15.0.0.1 24 [R2-GigabitEthernet0/0/0]ip address 192.168.2.1 24 [R2-Serial4/0/0]ip address 25.0.0.1 24 [R3-GigabitEthernet0/0/0]ip address 192.…

【爬虫】解析爬取的数据

目录 一、正则表达式1、常用元字符2、量词3、Re模块4、爬取豆瓣电影 二、Xpath1、Xpath解析Ⅰ、节点选择Ⅱ、路径表达式Ⅲ、常用函数 2、爬取豆瓣电影 解析数据,除了前面的BeautifulSoup库,还有正则表达式和Xpath两种方法。 一、正则表达式 正则表达式…

Gitlab CI/CD介绍

基本概念 GitLab CI/CD(持续集成/持续部署)流水线是GitLab平台提供的一项强大功能,旨在通过自动化构建、测试和部署过程,提高开发团队的效率和软件发布的质量。 CI(Continuous Integration):持续…

starRocks搭建

公司要使用新的大数据架构,打算用国产代替国外的大数据平台。所以这里我就纠结用doris还是starrocks,如果用doris,因为是开源的,以后就可以直接用云厂商的。如果用starrocks就得自己搭建,但是以后肯定会商业化&#xf…

初学51单片机之UART串口通信

CSDN其他博主的博文(自用)嵌入式学习笔记9-51单片机UART串口通信_51uart串口通讯-CSDN博客 CSDN其他博主的博文写的蛮好,如果你想了解51单片机UART串口可以点进去看看: UART全称Universal Asynchronous Receiver/Transmitter即通…

Codeforces Round 957 (Div. 3)(A~E题解)

这次比赛只能用抽象来形容,前五道题都没有什么算法,都是思维加模拟都能过,然后第四题卡住了,第五题不知道为什么做出来的人那么少,就是纯暴力就能过,但是没抓住上分的机会,有些可惜,…

Python编写的俄罗斯方块小游戏

文章目录 游戏页面实现代码 游戏页面 左右键移动方块位置,上键切换方块形态。 实现代码 import pygame import random# 初始化 Pygame pygame.init()# 定义颜色 colors [(0, 0, 0), # 黑色(255, 0, 0), # 红色(0, 255, 0), # 绿色(0, 0, 255), # 蓝色(255,…

差分约束——AcWing 362. 区间

差分约束 定义 差分约束系统是一种在计算机科学和运筹学中用于解决特定类型优化问题的工具。它主要用于处理一类线性不等式组,这些不等式描述了变量之间的相对大小关系,而不是直接的绝对值大小。差分约束系统通常用于路径寻找、调度、资源分配等问题。…

接口幂等性和解决方案

针对前端重复发起相同请求的解决方案: 注意: Redis保证了在相同key的情况下,只会保留一条数据,这就保证了多次请求只会消费一条数据。 并且需要注意的是,生成/获取token和携带token发送请求的过程需要是两个不同的过…

AI克隆声音,基于函数计算部署GPT-Sovits语音生成模型

阿里云的 https://developer.aliyun.com/adc/scenario/808348a321844a62b922187d89cd5077 还是 函数计算 FC (aliyun.com) 选择 语音克隆生成 GPT-SOVITS 通过访问域名就能访问 就可以上传个人的声音,然后进行输出 。

极狐Gitlab使用(2)

目录 1. Gitlab命令行修改管理员密码 2. Gitlab服务管理 3. 公司的开发代码提交处理流程 4. Gitlab 备份与恢复 数据备份 测试数据恢复 5. 邮箱配置 1. Gitlab命令行修改管理员密码 [roottty01 ~]# gitlab-rails console -e production # 启动GitLab的Rails控制…

FastAPI 学习之路(四十一)定制返回Response

接口中返回xml格式内容 from fastapi import FastAPI, Responseapp FastAPI()# ① xml app.get("/legacy") def get_legacy_data():data """<?xml version"1.0"?><shampoo><Header>Apply shampoo here.</Header&…

Day1每日编程题日记:数字统计、两个数组的交集、点击消除

前言&#xff1a;该篇用于记录自看。曾回看昨天的做题代码&#xff0c;竟然会觉得陌生&#xff0c;这竟然是我写的&#xff0c;细细读了一下&#xff0c;原来我当时是这么想的。因此我觉得记代码没有实际用处&#xff0c;重点是领悟了思想&#xff0c;这样子代码就在心中&#…

java虚拟机

JVM的运行机制 运行过程 Java源文件被编译器编译成字节码文件JVM将字节码文件编译成相应操作系统的机器码机器码调用相应操作系统的本地方法库执行相应的方法 类加载器用于将编译好的.Class文件加载到JVM中即时编译器&#xff1a;将Java字节码编译成具体的机器码 多线程 JV…

小米开放式耳机怎么样?小米、西圣、漫步者王者pk测评角逐

我们常说的开放式耳机&#xff0c;就是一种采用开放式设计的音频设备&#xff0c;能够给用户带来更加自然且广阔的音质体验&#xff0c;相比与传统的入耳式耳机&#xff0c;开放式耳机无需入耳&#xff0c;在佩戴方面更加的舒适&#xff0c;在音质方面开放式耳机的听感会更加自…

Flat Ads:金融APP海外广告投放素材的优化指南

在当今全球化的数字营销环境中,金融APP的海外营销推广已成为众多金融机构与开发者最为关注的环节之一。面对不同地域、文化及用户习惯的挑战,如何优化广告素材,以吸引目标受众的注意并促成有效转化,成为了广告主们亟待解决的问题。 作为领先的全球化营销推广平台,Flat Ads凭借…