问答 MeterSphere 持续测试平台- EolinkerAPI 导出 API 转化 MeterSphere 格式导入 MeterSphere 持续测试平台

老陈 · 2023年02月01日 · 最后由 老陈 回复于 2023年06月21日 · 6843 次阅读

前言:
MeterSphere 持续测试平台是一款非常好用且易用的持续测试平台,我们公司用它提升公司的软件质量,之前使用另一款测试工具 Eolinker,想把里面的 API 信息迁移到 MeterSphere 持续测试平台,由于之前使用的是 EolinkerOPEN4.0,所以无法导出 OpenAPI3.0 格式,而大量的迁移数据,使用手动的方式几乎不现实,所以选择使用导出文件,转化为 MeterSphere 格式的方式去迁移数据。
注意:
阅读本文章需要一定的开发基础
正文:
起初想使用一种中间格式,去做一个格式转换,因为各个测试工具之间,请求头,请求体,返回头,返回体等各种数据信息不对称,参差不齐,需要找一个尽量大而全的数据格式作为中间格式,但是开发下来发现,MeterSphere 格式在请求数据和返回数据等方面是比较好的,格式也比较容易读懂,所以干脆直接使用 MeterSphere 格式作为中间格式去使用,而且 MeterSphere 持续测试平台本身带有导出 MeterSphere,PostMan,Swagger2.0,Swagger3.0(OpenAPI3.0),HAR,JMeter 和导入 MeterSphere、Swagger3.0(OpenAPI3.0)功能,所以相较其他测试软件,更为合适。
一、Eolinker 导出文件详解
Eolinker 导出后缀为 export 格式的文件

Eolinker 格式主要属性是 projectInfo、apiGroupList、statusCodeGroupList、env、pageGroupList、caseGroupList
projectInfo 属性里面是在 Eolinker 里面项目信息,在转化格式方面没有用处。
projectID 是项目 id
projectType 项目类型
projectName 项目名称,汉字自动转为编码,文章最后有编码转为汉字方法(此类情况,不再赘述)
projectUpdateTime 项目更新时间,更新时间为字符串,文章最后有字符串转 long(此类情况,不再赘述)
projectVersion 项目版本
apiGroupList 属性是存储 API 信息的主要属性,属性类型为数组,详细查看下图

groupID 是 API 所在的组 id,Eolinker 是最多三层组结构的,所以组信息在批量导入 API 并且分组的情况下,是可以利用的。
groupName 是组的名称
projectID 是项目 id
parentGroupID 是所属组的 id
isChild 是是否是一级组( 0 等于一级组,1 等于非一级组)
apiList 是当前组 API 信息
apiGroupChildList 是当前组,子组信息

baseInfo 里面是 API 的基础信息
apiName 是 API 的名称
apiURI 是 API 的请求路径
apiProtocol 是请求方式 0 是 HTTP,1 是 HTTPS
apiSuccessMock 是请求成功返回示例
apiFailureMock 是请求失败返回示例
apiRequestType 是请求方式
enum 示例
POST("0", "post", "POST"),
GET("1", "get","GET"),
PUT("2", "put","PUT"),
DELETE("3", "delete","DELETE"),
HEAD("4", "head","HEAD"),
OPTIONS("5", "options","OPTIONS"),
PATCH("6", "patch","PATCH");
apiStatus API 当前状态
enum 示例
QIYONG("0", "Underway"),
WEIHU("1", "Prepare"),
FEIQI("2", "false");
apiNoteType 是 API 说明类型
apiNoteRaw 是 API 说明 Raw
apiNote 是 API 说明
apiRequestParamType 是请求属性类型
enum 示例
FORM_DATA("0"),
REST_FUL("2"),
RAW("1");
apiRequestRaw 是请求 Raw
apiUpdateTime 是 API 修改时间
apiFailureStatusCode 是错误返回码示例
apiSuccessStatusCode 是成功返回码示例

headerInfo 里面包含请求头信息
headerName 是请求头名称
headerValue 是请求头的值

requestInfo 是 API 请求返回示例
paramType 是返回字段类型
enum 示例
STRING("0", "string","string"),
FILE("1", "file","file"),
JSON("2", "json","json"),
INT("3", "int","integer"),
FLOAT("4", "float","number"),
DOUBLE("5", "double","number"),
DATE("6", "date","string"),
DATETIME("7", "datetime","string"),
BOOLEAN("8", "boolean","boolean"),
BYTE("9", "byte","integer"),
SHORT("10", "short","integer"),
LONG("11", "long","integer"),
ARRAY("12", "array","array"),
OBJECT("13", "object","object"),
NUMBER("14", "number","number");
paramName 是返回数据说明
paramKey 是返回数据值
paramValue 是返回数据示例
paramNote 是高级说明
paramValueList 是数组数据示例
default 是否默认

apiGroupChildList 里面包含子组 API 信息,这里需要注意一下,如果是最后一组,存在数据结构不一样的问题。

二、MeterSphere 导出文件详解
MeterSphere 导出后缀为 json 格式的文件

添加图片注释,不超过 140 字(可选)
projectName 是项目 ID,可以用新的 UUID 代替
protocol 是请求类型,可选 HTTP TCP SQL DUBBO
projectId 是项目 ID
version 是对应 MeterSphere 版本
data 是主要 API 信息列表
cases 是 API 对应的 cases(如果是其他平台导入的文件,没有可以不填)
mocks 是 API 对应虚拟请求返回结果列表
nodeTree 是 API 在模块中对应的关系信息


如上面三图所示,API 内容主要分三大块,第一基本信息,第二 request ,第三 response
基本信息详解(包含必填信息和 MeterSphere 内部属性的解读,值为 null 的都是非必填或无效属性)
id 是 API ID 没有这个信息,可以新创建一个 UUID
projectId 是项目 ID 没有这个信息,可以新创建一个 UUID
name 是 API 名称
method 是请求类型 GET POST PUT PATCH DELETE OPTIONS HEAD CONNECT
modulePath 是 API 所在模块路径
status 是 API 状态 进行中 未开始 已完成
userId 是责任人(系统参数,不可更改)
createTime 是创建时间(系统参数,不可更改)
updateTime 是修改时间,导入时间(系统参数,不可更改)
protocol 是请求方式
path 是请求路径
tags 是标签
createUser 是创建人(系统参数,不可更改)
order 是编号,可不填
refId 可不填
versionId 是对应 MeterSphere 内部版本的 UUID 可不填
remark 是 API 描述信息


request 详解
type 是请求类名称( HTTP 请求的默认 HTTPSamplerProxy)
clazzName 是实例请求类包地址(HTTPSamplerProxy 类型的默认 io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy)
id 是 API ID(与基本信息一致)
name 是 API 名称(与基本信息一致)
protocol 是请求类型(与基本信息一致)
method 是请求方式(与基本信息一致)
path 是请求路径(与基本信息一致)
headers 是请求头参数列表
body 是请求体信息类
其中 headers 和 body 中的 type 属性,决定属性数据结构信息

response 详解
与 request 属性同名的使用方法一致
statusCode 是状态码信息列表
name 是键
vlue 是描述

三、方法示例与说明
编码转为汉字方法
import org.apache.commons.text.StringEscapeUtils;
StringEscapeUtils.unescapeXml(this.apiName);
字符串转 long
public static long getTimeByDateStr(String dateStr) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date apiTime = format.parse(dateStr);
return apiTime.getTime();
} catch (Exception e) {

}
return 0l;
}
转化文件 jar 包
链接: https://pan.baidu.com/s/1HZIvORLYgbOZGwUbrSgmOA 密码: m5rm
jar 包方法使用
主方法包地址
import io.metersphere.platform.conver.ConverEolinker;

获取文件内容,用于确认文件使用正确 (eolinkerFile 参数为文件路径)
ConverEolinker converEolinker = new ConverEolinker();
String context = getEolinkerFileContext(eolinkerFile);

Eolinker 转 MeterSphere (eolinkerFile 是 Eolinker 文件路径 , meterSphereFile 是导出的文件路径,注意,如果没有文件,会创建文件,如果有文件,会覆盖,路径不创建)
ConverEolinker converEolinker = new ConverEolinker();
converEolinker.getMetersphereByEolinker(eolinkerFile, meterSphereFile);

Eolinker 转 OpenAPI 3.0 (eolinkerFile 是 Eolinker 文件路径 , openAPI3File 是导出的文件路径,注意,如果没有文件,会创建文件,如果有文件,会覆盖,路径不创建)
ConverEolinker converEolinker = new ConverEolinker();
converEolinker.getOpenAPI3ByEolinker(eolinkerFile,openAPI3File);

共收到 6 条回复 时间 点赞

我一会再发一篇插件详解,先从功能入手,对着代码看看,就发现不复杂了

有实现定时通过 URL 同步接口吗?

有定时和手动

老陈 回复

大佬,能看下是怎样定时增量同步的吗?😀

小虎皮 回复

使用 ms 自带的导入功能,然后写一个自动化脚本,定时执行自动化脚本就行了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册