自动生成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://localhost/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])
自动生成robot自动化测试用例的更多相关文章
- 自动的自动化:EvoSuite 自动生成JUnit的测试用例
EvoSuite简介 EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行.得到了Google和Y ...
- python实战-基于正交实验(工具:allpairs)自动生成接口异常测试用例
实现思路 1.抓取api信息(目前公司用的swagger),uri.method.params.response,解析完成后写入excle 2.读取抓取完毕的api信息,处理为allpairs所需要的 ...
- 【Robot Framework 项目实战 03】使用脚本自动生成统一格式的RF自动化用例
背景 虽然大家都已经使用了统一的关键字,但是在检查了一些测试用例之后,还是发现因为大家对RF的熟悉程度不一导致的测试用例颗粒度差异很大的情况:而且在手动方式转化测试用例过程中,有不少工作是完全重复的且 ...
- airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告
一:主要内容 框架功能及测试报告效果 airtest安装.环境搭建 框架搭建.框架运行说明 airtest自动化脚本编写注意事项 二:框架功能及测试报告效果 1. 框架功能: 该框架笔者用来作为公司的 ...
- 基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v4.1.2版)
目录: 第1版:http://blog.csdn.net/vipbooks/article/details/51912143 第2版:htt ...
- Py福利,基于uiautomatorviewer 的Python 自动化代码自动生成工具分享(jar已发布GitHub,欢迎Star)
前言做UI自动化无论你用SDK自带的uiautomatorviewer还是Macaca还是Appium自动的inspector,代码最多的就是那些繁琐重复的找元素后点击,输入,长按.....等.现在偷 ...
- swagger 自动生成接口测试用例
---整体更新一波--- 1.实际工作中,因为要动手输入的地方比较多,自动生成的异常接口用例感觉用处不大,就先去掉了,只保留了正常的: 2.接口有改动的,如果开发人员没有及时告知或没有详细告知,会增加 ...
- 【Golang】 可以自动生成测试用例的库--gotests
简介 gotests是一个Golang命令行工具,它可以使编写Go的测试代码变得容易.它能基于目标源文件的函数和方法生成数据驱动测试用例,并且在此过程会自动导入任何依赖. 下面是gotests在使用S ...
- Makeflie自动生成依赖,自动化编译
在netbeans里开发,有一个重要文件makefile,是用来编译所有的文件. 项目的目录结构如下,扁平的目录结构,如何实现自动化编译,写makefile呢? 第一版 基础版: CC = g++ C ...
- Groovy元编程应用之自动生成订单搜索接口测试用例集
背景 在 "Groovy元编程简明教程" 一文中,简明地介绍了 Groovy 元编程的特性. 那么,元编程可以应用哪些场合呢?元编程通常可以用来自动生成一些相似的模板代码. 在 & ...
随机推荐
- vue项目nginx部署二级目录
一.修改router.js中添加base根目录配置 const vueRouter = new Router({ mode: 'history', base: 'app', 二.修改vue.confi ...
- AXI4的PL与PS联合设计
AXI4的PL与PS联合设计 1.实验原理 在前面的学习中,解决了如何利用一个缓冲寄存器控制另外一个寄存器的输入输出配置.接下来就是如何将PL设计直接导入到PS中实现资源互换.PS是可以通过AXI4总 ...
- ArrayList扩容代码分析
ArrayList扩容机制是在面试中频繁出现的问题,平时了解的比较含糊,特此记录! 注意:每次发生扩容,其容量扩充为原来的1.5倍左右 add方法 public boolean add(E e) { ...
- 学习Source Generators之输出生成的文件
上一篇文章学习了通过获取和解析swagger.json的内容,来生成API的请求响应类. 但是其中无法移动与编辑. 那么本文将介绍如何输出生成的文件. EmitCompilerGeneratedFil ...
- #裴蜀定理#CF7C Line
题目 给定三个整数\(a,b,c\),问是否能找到两个数\(x,y\)使得\(ax+by+c=0\),没有则输出-1 分析 先把式子转换成\(ax+by=-c\) 然后\(x,y\)是整数当且仅当\( ...
- #组合计数,容斥定理#U136346 数星星
题目 天上的繁星一闪一闪的,甚是好看.你和你的小伙伴们一起坐在草地上,欣赏这美丽的夜景. 我们假定天上有\(n\)颗星星,它们排成一排,从左往右以此编号为1到\(n\),但是天上的星星实在太多了,你和 ...
- Jetty的ssl模块
启用ssl模块,执行如下命令: java -jar $JETTY_HOME/start.jar --add-modules=ssl 命令的输出,如下: INFO : ssl initialized i ...
- OpenHarmony 3.2 Beta1版本正式发布
5 月 31 日,开放原子开源基金会正式发布 OpenAtom OpenHarmony(以下简称"OpenHarmony")3.2 Beta1 版本. 全球开发者可通过Gite ...
- 【FAQ】HMS Core推送服务推送角标的开发及常见问题解答
目录 1.发送消息并显示桌面数字角标. 2.如何清除数字角标? 3.如何设置圆点角标? 4.应用桌面图标角标开关无法开启或未显示开关. 5.推送消息设置了角标字段但未显示角标? 6.未设置角标参数,但 ...
- HuffmanTree,哈夫曼树的原理和c++实现
目录 一.什么是哈夫曼树 二.构造哈夫曼树 三.路径.编码.解码 四.代码 一.什么是哈夫曼树 哈夫曼树又称为最优树. 通过权值来构造树,权值越大,离根节点越近 经常用于无损压缩算法 用于需要优化存储 ...