背景:java项目使用swagger管理接口,随着需求的开发接口也有增加,要从swagger界面中去查找出新增的接口是件很费时,效率很低的事情.

适用情况: java项目且适用swagger管理接口

脚本解析:

  1. 使用requests包调用swagger的api-docs接口(http://localhost/api/v1/api-docs),此接口会返回swagger中所有接口的模块名,url,接口名字,参数名,参数描述,案列值等相关信息
  2. 解析上面接口的返回值组装成自动化测试用例并写入指定文件中,且写入前会判断此接口的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自动化测试用例的更多相关文章

  1. 自动的自动化:EvoSuite 自动生成JUnit的测试用例

    EvoSuite简介 EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行.得到了Google和Y ...

  2. python实战-基于正交实验(工具:allpairs)自动生成接口异常测试用例

    实现思路 1.抓取api信息(目前公司用的swagger),uri.method.params.response,解析完成后写入excle 2.读取抓取完毕的api信息,处理为allpairs所需要的 ...

  3. 【Robot Framework 项目实战 03】使用脚本自动生成统一格式的RF自动化用例

    背景 虽然大家都已经使用了统一的关键字,但是在检查了一些测试用例之后,还是发现因为大家对RF的熟悉程度不一导致的测试用例颗粒度差异很大的情况:而且在手动方式转化测试用例过程中,有不少工作是完全重复的且 ...

  4. airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告

    一:主要内容 框架功能及测试报告效果 airtest安装.环境搭建 框架搭建.框架运行说明 airtest自动化脚本编写注意事项 二:框架功能及测试报告效果 1. 框架功能: 该框架笔者用来作为公司的 ...

  5. 基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v4.1.2版)

            目录:            第1版:http://blog.csdn.net/vipbooks/article/details/51912143            第2版:htt ...

  6. Py福利,基于uiautomatorviewer 的Python 自动化代码自动生成工具分享(jar已发布GitHub,欢迎Star)

    前言做UI自动化无论你用SDK自带的uiautomatorviewer还是Macaca还是Appium自动的inspector,代码最多的就是那些繁琐重复的找元素后点击,输入,长按.....等.现在偷 ...

  7. swagger 自动生成接口测试用例

    ---整体更新一波--- 1.实际工作中,因为要动手输入的地方比较多,自动生成的异常接口用例感觉用处不大,就先去掉了,只保留了正常的: 2.接口有改动的,如果开发人员没有及时告知或没有详细告知,会增加 ...

  8. 【Golang】 可以自动生成测试用例的库--gotests

    简介 gotests是一个Golang命令行工具,它可以使编写Go的测试代码变得容易.它能基于目标源文件的函数和方法生成数据驱动测试用例,并且在此过程会自动导入任何依赖. 下面是gotests在使用S ...

  9. Makeflie自动生成依赖,自动化编译

    在netbeans里开发,有一个重要文件makefile,是用来编译所有的文件. 项目的目录结构如下,扁平的目录结构,如何实现自动化编译,写makefile呢? 第一版 基础版: CC = g++ C ...

  10. Groovy元编程应用之自动生成订单搜索接口测试用例集

    背景 在 "Groovy元编程简明教程" 一文中,简明地介绍了 Groovy 元编程的特性. 那么,元编程可以应用哪些场合呢?元编程通常可以用来自动生成一些相似的模板代码. 在 & ...

随机推荐

  1. ZYNQ系列学习GPIO实验

    GPIO实验 一.实验原理 调用GPIO实现PS对引脚的控制 二.实验步骤 1.建立工程 这部分是ivado的操作内容,这里不做过多说明. 2.添加ZYNQ处理器IP 在左侧菜单栏中双击Create  ...

  2. NetAdapt:MobileNetV3用到的自动化网络简化方法 | ECCV 2018

    NetAdapt的思想巧妙且有效,将优化目标分为多个小目标,并且将实际指标引入到优化过程中,能够自动化产生一系列平台相关的简化网络,不仅搜索速度快,而且得到简化网络在准确率和时延上都于较好的表现   ...

  3. KingbaseES V8R6集群运维案例之---sys_monitor.sh start启动动态库错误

    案例说明: 在KingbaseES V8R6集群部署了postgis后,执行sys_monitor.sh start启动集群时,出现动态库错误,如下图所示: 适用版本: KingbaseES V8R6 ...

  4. 【Java面试题】SpringMVC

    九.SpringMVC 63)SpringMVC 的流程 a.用户向服务器发送请求,请求被 SpringMVC 前端控制器 DispatchServlet 捕获: b.DispatcherServle ...

  5. Linux命令行常用命令(一)

    ls 命令,展示文件夹内内容 -R :连同子目录内容一起列出来: -S :以档案容量大小排序! -t :依时间排序 cd 命令 cd /root/Docements # 切换到目录/root/Doce ...

  6. MySQL和Oracle里面SQL转换

    oracle环境有关sql的注意事项 比较特殊的: 1. 原有 MySQL字段设置为 not null default '' 原因: ORACLE 数据库 不允许存空字符串, 认为它跟null是一样的 ...

  7. #0/1分数规划#AT1807 食塩水

    题目 从\(n\)对数\((w_i,p_i)\)中选择\(k\)对使得 \[\frac{\sum_{i=1}^k w'_i*p'_i}{\sum_{i=1}^k w'_i} \] 最大 分析 若可行解 ...

  8. Qt 5.12.10 国际化

    网上有资料但是不全,所以这里记录一份比较全的 1.创建项目 2.编辑 demo.cpp 这里写button用来做国际化示例,运行软件后是这个样子 #include "demo.h" ...

  9. ssm 创建bean的三种方式和spring依赖注入的三种方式

    <!--创建bean的第一种方式:使用默认无参构造函数 在默认情况下: 它会根据默认无参构造函数来创建类对象.如果 bean 中没有默认无参构造函数,将会创建失败--> <bean ...

  10. cas登录成功后跳转地址和退出后跳转首页

    cas登录成功后跳转地址和退出后跳转首页 CAS版本5.3 1.登录页面 的登录链接地址为 login.html ...<span v-if="username == ''" ...