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


    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 驱动类设计

    进行实例化对象

    1. #导入类库
    2. import csv,os
    3. import datetime
    4. # 试验1:普通全局变量的使用
    5. import pymysql
    6. global glob_url
    7. glob_url='https://svr-6-9009.share.51env.net/prod-api'
    8. print(glob_url)
    9. # 封装成一个驱动类
    10. class driver_run():
    11. #读取配置文件,获取py文件名
    12. def run_testpy(self):
    13. # 设置脚本程序对应的路径
    14. path = "..\\test_script\\"
    15. csvfile=open("config.csv",'r')
    16. rows=csv.reader(csvfile)
    17. # 跳过标题行
    18. next(rows)
    19. # 逐行读取配置文件内容
    20. for row in rows:
    21. print(row[2])
    22. self.number=row[0]
    23. self.name = row[1]
    24. # 判断是否创建测试用例报告头部
    25. if row[4]=='Y':
    26. if row[3] == '1':
    27. self.create_testcase_report()
    28. # 调用指定的接口脚本文件
    29. os.system("python "+path+row[2])
    30. # return row[0],row[1] 不能用面向过程的方法,要用面向对象的方法
    31. # 调用报告写入内容方法
    32. self.write_report()
    33. self.endtime=datetime.datetime.now()
    34. # 获取当前框架程序运行的总时长,如果时长已经大于50分钟了,
    35. # 主动调用登录接口,重新更新token
    36. rtime = self.endtime - self.starttime
    37. # 判断时间差是否超过50分钟
    38. if (rtime.seconds // 60) >= 50:
    39. # 调用登录接口
    40. os.system("..\\test_script\\loginV4.py")
    41. # 定义创建测试报告并写入头部公共信息
    42. def create_report(self):
    43. self.starttime = datetime.datetime.now()
    44. # print(self.starttime)
    45. # 时间进行格式化
    46. starttime = self.starttime.strftime("%Y-%m-%d %H:%M:%S")
    47. print(starttime)
    48. # 将时间戳写入txt文件
    49. txtReport = open('..\\test_report\\report1.txt', "w")
    50. txtReport.write("*****************************************************************""\n")
    51. txtReport.write("智慧物业系统接口测试框架"+"\n")
    52. txtReport.write(starttime+" shangshang"+" "+"\n")
    53. txtReport.write("接口测试执行环境说明:"+glob_url+"\n")
    54. txtReport.write("*****************************************************************"+"\n")
    55. txtReport.close()
    56. # 定义创建测试用例报告并写入头部公共信息
    57. def create_testcase_report(self):
    58. starttime = datetime.datetime.now()
    59. print(starttime)
    60. # 时间进行格式化
    61. starttime = starttime.strftime("%Y-%m-%d %H:%M:%S")
    62. print(starttime)
    63. # 将时间戳写入txt文件
    64. txttestReport = open('..\\test_report\\testcase_report1.txt', "w")
    65. txttestReport.write("*****************************************************************""\n")
    66. txttestReport.write("该测试用例运行开始时间:"+starttime+"\n")
    67. txttestReport.write("接口编号"+self.number+" ")
    68. txttestReport.write('接口名称'+self.name+"\n")
    69. txttestReport.write("*****************************************************************"+"\n")
    70. txttestReport.close()
    71. def write_report(self):
    72. txtReport = open('..\\test_report\\report1.txt', "a")
    73. txtReport.write("接口编号:"+self.number+" 接口名称:"+self.name)
    74. # 读取comresult文件中的测试结果
    75. comfile=open("commonresult.txt", 'r')
    76. for result in comfile:
    77. txtReport.write(" 接口测试结果:"+result+"\n")
    78. comfile.close()
    79. txtReport.close()
    80. def write_commonresult(self,result):
    81. # 写入接口测试结果到公共文件中
    82. comfile = open("..\\test_driver\\commonresult.txt", 'w')
    83. # 把result存入data文件中
    84. comfile.write(result)
    85. comfile.close()
    86. #取出token文件中的token的值
    87. def get_token(self):
    88. tokenfile=open("..\\test_driver\\token.txt","r")
    89. for token in tokenfile:
    90. tokenvalue=token
    91. return tokenvalue
    92. #连接数据库进行查询返回查询结果
    93. def db_connect(self,sql):
    94. # 打开数据库连接
    95. db=pymysql.connect(host='vip.51env.net',
    96. user='readonly',
    97. password='******',
    98. port=30001,
    99. db='******',
    100. charset='utf8')
    101. # 用cursor()方法获取操作游标
    102. cursor = db.cursor()
    103. # 使用execute方法执行SQL语句
    104. cursor.execute(sql)
    105. # 使用fetchall()方法获取一条数据
    106. db_result=cursor.fetchall()
    107. # 关闭数据库连接
    108. db.close()
    109. # 返回查询结果
    110. return db_result
    111. if __name__ == '__main__':
    112. #实例化驱动类的对象
    113. objdriver=driver_run()
    114. # 创建测试报告头部
    115. objdriver.create_report()
    116. # 调用接口文件
    117. objdriver.run_testpy()

    3.2 登录类

    实例化登录类

    1. # ********************************************************************************
    2. # 登录接口V5.0脚本实现
    3. # 功能:1、调用图片验证码接口获取uuid
    4. # 2、将获取到的uuid传入登录接口中
    5. # 3、分别对两个功能进行面向对象封装
    6. # 修改内容: 增加token属性,为其他接口提供验证
    7. # ********************************************************************************
    8. # 导入类库
    9. import requests
    10. import json
    11. # 定义一个类:包含两个方法和一个属性
    12. from test_driver.driverV1 import driver_run,glob_url
    13. class login_interface():
    14. # 定义一个属性
    15. def __init__(self):
    16. self.uuid=''
    17. #增加token属性
    18. self.token=''
    19. #方法1:获取验证码对应的uuid
    20. def getuuid(self):
    21. # 取验证码图片接口uuid
    22. # 定义获取验证码接口地址
    23. CaptchaURL = 'https://svr-6-9009.share.51env.net/prod-api/captchaImage'
    24. # 发送请求
    25. response = requests.get(CaptchaURL).json()
    26. # 获取uuid
    27. # print(type(response))
    28. # 全局uuid引用说明
    29. # global uuid
    30. self.uuid = response['uuid']
    31. # print(self.uuid)
    32. # return uuid
    33. # 执行登录接口的测试
    34. def login_test(self):
    35. # 定义接口地址
    36. url = "https://svr-6-9009.share.51env.net/prod-api/login"
    37. # 定义接口参数
    38. # print("登录方法中", self.uuid)
    39. userinfo = {
    40. "username": "admin",
    41. "password": "admin123",
    42. "code": "51testing",
    43. "uuid": self.uuid
    44. }
    45. # print(type(userinfo))
    46. # 将字典类型转化为json类型
    47. userjson = json.dumps(userinfo)
    48. # print(type(userjson))
    49. # 发送接口请求
    50. response = requests.post(url, data=userjson, headers={"Content-Type": "application/json"}).json()
    51. # print(response)
    52. # print(response["msg"])
    53. # 对比实际和预期结果
    54. if response["msg"] == '操作成功' and response["username"] == 'admin':
    55. result="登录接口成功"
    56. self.token=response["token"]
    57. tokenfile=open("..\\test_driver\\token.txt","w")
    58. tokenfile.write(self.token)
    59. tokenfile.close()
    60. else:
    61. result="登录接口失败"
    62. return result
    63. # 进行实例化调用
    64. if __name__ == '__main__':
    65. # 实例化对象
    66. loginObj=login_interface()
    67. # 调用其中的方法
    68. loginObj.getuuid()
    69. result=loginObj.login_test()
    70. print(result)
    71. # 实例化驱动类对象
    72. objdriver=driver_run()
    73. # 调用写入公共文件方法
    74. objdriver.write_commonresult(result)

    3.3 获取用户信息接口

    代码:

    1. # **********************************************************
    2. # 获取登录用户信息接口V3.0脚本实现
    3. # 功能:常量参数传递
    4. # 问题1:引用登录接口类
    5. # 问题2:运行登录接口类,并获取最新的token
    6. # 问题3:用面向对象的方法将获取到的最新的token传入获取用户信息接口
    7. # ***********************************************************
    8. # 引入登录接口类
    9. from test_driver.driverV1 import glob_url,driver_run
    10. # 导入类库
    11. import requests
    12. # **************************************************
    13. class GetUserInfo():
    14. def getuser_test(self,token):
    15. # 定义接口地址
    16. url=glob_url+'/getInfo'
    17. header={'Authorization':'Bearer '+token}
    18. # 发送请求并获取
    19. self.response=requests.get(url,headers=header).json()
    20. print(self.response)
    21. def getuser_check(self):
    22. # 进行检查点的验证
    23. # 提取msg
    24. msg=self.response['msg']
    25. # print(msg)
    26. # 通过assert断言进行msg的验证
    27. # 提取电话
    28. phone=self.response['user']['phonenumber']
    29. # print(phone)
    30. # 提取邮箱
    31. email=self.response['user']['email']
    32. # print(email)
    33. # 提取用户名
    34. username=self.response['user']['userName']
    35. # print(username)
    36. #对assert进行异常捕获
    37. try:
    38. assert msg == '操作成功'
    39. assert phone=='13800138000'
    40. assert email=='13800138000@139.com'
    41. assert username=='admin'
    42. except:
    43. result="获取用户信息接口测试失败"
    44. else:
    45. result = "获取用户信息接口测试成功"
    46. return result
    47. if __name__ == '__main__':
    48. objdriver=driver_run()
    49. token=objdriver.get_token()
    50. print(token)
    51. #实例化获取用户信息对象类
    52. objgetuser=GetUserInfo()
    53. objgetuser.getuser_test(token)
    54. result=objgetuser.getuser_check()
    55. # 将测试执行结论放入comresult.txt中
    56. objdriver.write_commonresult(result)

    3.4 创建商铺接口

    1. #创建商铺接口V1.0接口脚本实现
    2. #功能:常量参数传递
    3. #*************************************************************************
    4. # 导入类库
    5. import datetime
    6. import json
    7. import requests
    8. import pymysql
    9. from test_driver.driverV1 import glob_url, driver_run
    10. class createhouse_interface():
    11. def createhouse_test(self,token):
    12. # 打开测试用例报告文件
    13. txttestReport = open('..\\test_report\\testcase_report1.txt', "a")
    14. # 定义接口地址
    15. url=glob_url+'/baseconfig/House'
    16. for i in range(1,3):
    17. # 传入接口参数,获取实际返回值
    18. self.code='05-09-'+str(i)
    19. housedata={
    20. "block": "01",
    21. "code": self.code,
    22. "buildingsquare": "100",
    23. "usesquare": "50",
    24. "state": "empty",
    25. "floor": "12",
    26. "rentFee": "12000",
    27. "remark": "test"
    28. }
    29. housejson=json.dumps(housedata)
    30. # 传入token参数
    31. header = {'Authorization': 'Bearer ' + token,
    32. "Content-Type":"application/json"}
    33. # 比对结果1:接口返回值
    34. response=requests.post(url,data=housejson,headers=header).json()
    35. print(response['msg'])
    36. # 比对结果:直接比对接口返回msg
    37. self.msg=response['msg']
    38. if self.msg=='新建成功':
    39. result='创建商铺接口测试用例'+self.code+"接口测试用例成功"
    40. else:
    41. result = '创建商铺接口测试用例' + self.code + "接口测试用例失败"
    42. # 将接口测试用例的执行结果及数据内容写入对应的测试用例报告中
    43. # 写入是第几次测试,测试商铺编号,测试结论
    44. txttestReport.write('测试用例编号:'+str(i))
    45. txttestReport.write(" 创建商铺的编号为:"+self.code)
    46. txttestReport.write(" 测试用例执行结果:"+result+"\n")
    47. txttestReport.write("*****************************************************************" + "\n")
    48. #共执行多少条数据
    49. txttestReport.write("共执行" + str(i) +"条测试用例"+ "\n")
    50. # 获取系统时间,来写入结束时间
    51. endtime = datetime.datetime.now()
    52. # 时间进行格式化
    53. endtime = endtime.strftime("%Y-%m-%d %H:%M:%S")
    54. # 时间格式进行格式化
    55. txttestReport.write('该接口测试执行结束时间:'+endtime+"\n")
    56. txttestReport.close()
    57. #连接后台数据库进行ID的检查,并给出测试结论
    58. def createhouse_checkCode(self):
    59. id='5c7100ce60d044768223daf1546b3b61'
    60. sql="SELECT * FROM `config_house` WHERE id ='"+id+"'"
    61. dbresult=objdriver.db_connect(sql)
    62. print(dbresult)
    63. db_code=dbresult[0][1]
    64. print(db_code)
    65. # #判断是否执行成功
    66. if db_code==self.code and self.msg=='新建成功':
    67. result="创建商铺列表接口测试通过"
    68. print(self.code)
    69. else:
    70. result="创建商铺列表接口测试失败"
    71. print(self.code)
    72. return result
    73. if __name__ == '__main__':
    74. objdriver = driver_run()
    75. token = objdriver.get_token()
    76. print(token)
    77. # 实例化创建商铺接口类对象
    78. objcreatehouse = createhouse_interface()
    79. objcreatehouse.createhouse_test(token)
    80. # 调用数据库检查点
    81. result=objcreatehouse.createhouse_checkCode()
    82. # 将测试执行结论放入comresult.txt中
    83. objdriver.write_commonresult(result)

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

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

  • 相关阅读:
    操作系统 应用题 例题+参考答案(考研真题)
    centos的root密码忘记或失效的解决办法
    抖音seo矩阵系统源代码部署及产品功能设计分析
    Python基础-3-列表
    (GCC)STM32基础详解之全局资源的使用
    强化学习基本概念
    178文章复现:基于matlab的微震图像去噪
    Python爬虫知识图谱
    MySQL锁杂谈
    spring cloud 快速上手系列 -> 03-消息队列 Stream -> 034-消费消息
  • 原文地址:https://blog.csdn.net/qq_20878673/article/details/140331355