自动生成robot自动化测试用例
时间:2020-04-17
本文章向大家介绍自动生成robot自动化测试用例,主要包括自动生成robot自动化测试用例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景:java项目使用swagger管理接口,随着需求的开发接口也有增加,要从swagger界面中去查找出新增的接口是件很费时,效率很低的事情.
适用情况: java项目且适用swagger管理接口
脚本解析:
- 使用requests包调用swagger的api-docs接口(http://localhost/api/v1/api-docs),此接口会返回swagger中所有接口的模块名,url,接口名字,参数名,参数描述,案列值等相关信息
- 解析上面接口的返回值组装成自动化测试用例并写入指定文件中,且写入前会判断此接口的url是否在文件中已存在,存在则表示此接口已经实现自动化,不会重复写入.
使用方法:
一. 打开脚本修改filename和url参数的默认值为对应项目robot工程的文件名和swagger的api-docs接口的url后直接在Python编辑器中运行此文件.
二. 在cmd窗口中进入到脚本和robot工程目录执行命令: python AutoCreateRobotCase.py robot.txt http://localhost/api/v1/api-docs (robot.txt和后面的url修改为对应项目的值)
执行完后新增的用例会在robot工程文件中关键字后面,所以需要将用例设置好对应参数的值后移动到关键字上面
执行后生成的自动化用例如下:
#!/usr/bin/env python """解析swagger接口返回值自动生成接口自动化用例 将新增的用例写入到文件末尾,已存在的用例则不重新写入 """ import requests import json import sys def auto_create_robotcase(filename='robot.txt', url='http://test-customer-api.chuxingyouhui.com/v2/api-docs'): try: f = open(filename, 'a+', encoding='utf-8') f.seek(0, 0) content = f.read() f.write('\n') f.write('\n') f.write('\n') r = requests.get(url) print(r.text) # 将返回的文本转换成json格式,并取paths部分的值,因为这个部分包含了所有需要的信息 api_docs = json.loads(r.text) paths = api_docs['paths'] definitions = api_docs['definitions'] k = 1 print(len(paths.items())) for i in paths.items(): print(i) interface_api = i[0] if interface_api in content: continue interface_type = list(i[1].keys())[0] mode_name = dict(list(i[1].values())[0])['tags'][0] interface_name = dict(list(i[1].values())[0])['summary'] print(str(mode_name) + "模块下第" + str(k) + "个接口为:" + str(interface_name) + " 类型为:" + str( interface_type) + " URI:" + str(interface_api)) head = [] data = [] if list(i[1].values())[0].__contains__('parameters'): params = dict(list(i[1].values())[0])['parameters'] for param in params: param_name = param['name'] param_position = param['in'] param_required = param['required'] print("参数名:", param_name, "参数位置:", param_position, "必填否:", param_required) # 有些参数没有描述字段,这里做个判断,有的时候取描述,没有赋空值 if param.get('description'): param_description = param['description'] else: param_description = '' if param_required: if param_position == 'header': pa = param_name + "=" + param_description head.append(pa) elif param_position == 'query': pa = param_name + "=" + param_description data.append(pa) elif param_position == 'body': param_schema = param['schema'] if param_schema.get('items'): define_name = param_schema['items']['$ref'].split('/')[-1] else: define_name = param_schema['$ref'].split('/')[-1] data = definitions[define_name]['properties'] case_name = mode_name + "-" + interface_name f.write(case_name + '\n') head_s = "" for i in head: head_s = head_s + " " + str(i) if head_s: create_head = ' ${headers} Create Dictionary Content-Type=${Content-Type} Accept=${Accept}' + head_s else: create_head = ' ${headers} Create Dictionary Content-Type=${Content-Type} Accept=${Accept}' f.write(create_head + '\n') create_api = ' Create Session api ${host} ${headers}' f.write(create_api + '\n') if str(data).startswith("{"): create_data = ' ${data} Set Variable ' + str(data) else: data_s = '' for i in data: data_s = data_s + ' ' + str(i) create_data = ' ${data} Create Dictionary ' + data_s create_params = ' ${params} Create Dictionary ' + data_s create_get_request = ' ${result} Get Request api ' + interface_api + ' params=${params}' create_get_request_noparams = ' ${result} Get Request api ' + interface_api create_post_request = ' ${result} Post Request api ' + interface_api + ' data=${data}' create_post_request_noparams = ' ${result} Post Request api ' + interface_api if interface_type == 'get': if data: f.write(create_params + '\n') f.write(create_get_request + '\n') else: f.write(create_get_request_noparams + '\n') else: if data: f.write(create_data + '\n') f.write(create_post_request + '\n') else: f.write(create_post_request_noparams + '\n') create_response = ' ${response} Set Variable ${result.content}' create_response_to_json = ' ${response} To Json ${response}' create_assert_code = ' should be equal as integers ${response["code"]} 200' create_assert_msg = ' should be equal ${response["msg"]} 操作成功' f.write(create_response + '\n') f.write(create_response_to_json + '\n') f.write(create_assert_code + '\n') f.write(create_assert_msg + '\n') f.write('\n') k = k + 1 f.close() except Exception as e: raise e if __name__ == "__main__": if len(sys.argv) == 1: auto_create_robotcase() else: auto_create_robotcase(sys.argv[1], sys.argv[2])
原文地址:https://www.cnblogs.com/sprouts/p/12718805.html
- tomcat源码解读一 Digester的解析方式
- Markdown 语法说明(简体中文版)
- C++中_onexit()用法简述
- tomcat请求处理分析(六)servlet的处理过程
- FFmpeg菜鸡互啄#第1篇#一些基本概念
- FFmpeg菜鸡互啄#第2篇#配置VS开发环境
- FFmpeg菜鸡互啄#第3篇#视频解码
- FFmpeg菜鸡互啄#第4篇#音频解码
- FFmpeg菜鸡互啄#第5篇#视频帧格式转换
- tomcat请求处理分析(三) 绑定本地端口监听请求
- 利用FFmpeg对火眼一体摄像机的回调数据进行处理:YUV转H264,H264封装flv,所有输入都是在内存中。
- MySQL 传统复制中常见故障处理和结构优化案例分析
- sql带条件查找最小缺失编号
- activiti学习笔记(六) 监听器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 未来已来——如何在VR游戏中实现3D语音
- kubernetes(五)之Dockerfile
- kubernetes(四)之Docker存储卷
- 使用卷积神经网络构建图像分类模型检测肺炎
- 如何提升docker容器安全性
- CICD(三)Ansible常用模块以及案例
- 深入SVM:支持向量机核的作用是什么
- kubernetes(三)之Docker网络详解
- kubernetes(二)之Docker容器及镜像
- 反向传播算法:定义,概念,可视化
- Go语言(二十一) 常见的模块使用
- kubernetes(一)之Docker基础入门
- Go语言(二十)日志采集项目(二)Etcd的使用
- prometheus入门(一)
- Go语言(十九)日志采集项目之logagent开发(一)