背景: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. SpringBoot2使用hikari报 Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl

    SpringBoot2配置文件有变化,需要更改配置 #datasource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spri ...

  2. Oracle与Java JDBC数据类型对照

    Oracle Database JDBC开发人员指南和参考 SQL Data Types JDBC Type Codes Standard Java Types Oracle Extension Ja ...

  3. CornerNet:经典keypoint-based方法,通过定位角点进行目标检测 | ECCV2018

    论文提出了CornerNet,通过检测角点对的方式进行目标检测,与当前的SOTA检测模型有相当的性能.CornerNet借鉴人体姿态估计的方法,开创了目标检测领域的一个新框架,后面很多论文都基于Cor ...

  4. KingbaseES 的角色和权限管理

    KingbaseES使用角色的概念管理数据库访问权限.为了方便权限管理,用户可以建立多个角色,对角色进行授权和权限回收,并把角色授予其他用户. 数据库初始化时,会创建一个超级用户的角色:system( ...

  5. 基于IDEA javaweb项目目录结构

    https://www.pianshen.com/article/62631355687/

  6. #01背包#洛谷 2340 [USACO03FALL]Cow Exhibition G

    题目 有\(n\)个物品,对于第\(i\)个物品, 有两种属性,第一种属性为\(x_i\),第二种属性为\(y_i\) 问选择若干个物品使得\(\sum{x_j}\geq 0\)且\(\sum{y_j ...

  7. #01背包#洛谷 4161 [SCOI2009]游戏

    题目 将 \(n\) 拆成若干个正整数的和, 问这些正整数的LCM有多少种 \(n\leq 10^3\) 分析 考虑这个\(LCM\)一定是1或者由若干个质数的指数幂相乘得到的, 那么可以设\(dp[ ...

  8. OpenHarmony社区运营报告(2022年10月)

    本月快讯 ● <深圳市推动软件产业高质量发展的若干措施>于10月24日发布. ● 社区共发展逾5000位贡献者累计为社区提交超过11万个PR,深圳市优博终端科技有限公司(以下简称" ...

  9. RabbitMQ 02 安装

    安装 推荐使用Docker进行安装. 执行如下命令. docker run -d --restart always --name rabbitmq \ -e RABBITMQ_DEFAULT_USER ...

  10. CentOS 6.5 ZIP、RAR文件压缩解压操作详解

    ============zip文件的操作================= zip -r data.zip data 解释:将data文件夹压缩成了data.zip格式.   unzip data.z ...