Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/meituan-dianping/lyrebird-java-client
lyrebird-java-client 是Lyrebird的一个 Java SDK,通过调用Lyrebird本身提供的API实现在Java项目中控制 Lyrebird Services
https://github.com/meituan-dianping/lyrebird-java-client
lyrebird lyrebird-java-sdk testing-tools
Last synced: about 2 months ago
JSON representation
lyrebird-java-client 是Lyrebird的一个 Java SDK,通过调用Lyrebird本身提供的API实现在Java项目中控制 Lyrebird Services
- Host: GitHub
- URL: https://github.com/meituan-dianping/lyrebird-java-client
- Owner: Meituan-Dianping
- Created: 2019-09-10T13:10:37.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-09-09T03:54:54.000Z (over 3 years ago)
- Last Synced: 2024-04-16T19:36:54.399Z (8 months ago)
- Topics: lyrebird, lyrebird-java-sdk, testing-tools
- Language: Java
- Homepage:
- Size: 117 KB
- Stars: 15
- Watchers: 13
- Forks: 4
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# lyrebird-java-client
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.meituan-dianping.lyrebird.sdk/lyrebird-java-client/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.appium/java-client)
[![javadoc](https://javadoc.io/badge2/com.github.meituan-dianping.lyrebird.sdk/lyrebird-java-client/javadoc.svg)](https://javadoc.io/doc/com.github.meituan-dianping.lyrebird.sdk/lyrebird-java-client)
[![Total alerts](https://img.shields.io/lgtm/alerts/g/Meituan-Dianping/lyrebird-java-client.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Meituan-Dianping/lyrebird-java-client/alerts/)
[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/Meituan-Dianping/lyrebird-java-client.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Meituan-Dianping/lyrebird-java-client/context:java)---
- [简介](#简介)
- [快速开始](#快速开始)
- [环境要求](#环境要求)
- [安装](#安装)
- [使用](#使用)
- [设置 Lyrebird Client](#设置-Lyrebird-Client)
- [获取 Lyrebird Status](#获取-Lyrebird-Status)
- [Mock 数据激活](#Mock-数据激活)
- [使用 groupID 手动激活](#使用-groupID-手动激活)
- [使用注解方式自动激活](#使用注解方式自动激活)
- [TestNG](#TestNG)
- [Junit4](#Junit4)
- [取消激活](#取消激活)
- [读取Mock数据](#读取Mock数据)
- [获取网络数据信息](#获取网络数据信息)
- [获取 flow List](#获取-flow-List)
- [获取 flow ID](#获取-flow-ID)
- [获取请求持续时长](#获取请求持续时长)
- [获取请求开始时间](#获取请求开始时间)
- [获取 flow 数据的详细信息](#获取-flow-数据的详细信息)
- [获取请求对象](#获取请求对象)
- [获取返回对象](#获取返回对象)
- [清空 Flow 数据](#清空-Flow-数据)
- [获取指定频道的消息总线数据](#获取指定频道的消息总线数据)
- [获取Socket对象进行事件监听](#获取Socket对象进行事件监听)
- [设置带宽限速](#设置带宽限速)
- [应用场景](#应用场景)
- [在UI自动化中校验请求参数是否符合预期](#在UI自动化中校验请求参数是否符合预期)
- [在UI自动化中校验返回与客户端展示是否一致](#在UI自动化中校验返回与客户端展示是否一致)## 简介
lyrebird-java-client 是[Lyrebird](https://github.com/Meituan-Dianping/lyrebird)的一个 Java SDK,通过调用Lyrebird本身提供的[API](https://meituan-dianping.github.io/lyrebird/guide/api.html)实现在Java项目中控制 Lyrebird Services。比如:激活Mock数据;实时查看、验证网络数据等。
## 快速开始
### 环境要求
- Java 1.8
- Junit 4 or TestNG 6.14.x### 安装
- Maven项目添加如下依赖到 pom.xml 文件中
```xml
com.meituan.lyrebird.sdk
lyrebird-java-client
RELEASE```
## 使用
### 设置 Lyrebird Client
- 默认 Lyrebird 端口地址 (9090)
```java
Lyrebird lyrebird = new Lyrebird();
```- 指定 Lyrebird 端口地址
```java
Lyrebird lyrebird = new Lyrebird("http://:");
```### 获取 Lyrebird Status
```java
Lyrebird lyrebird = new Lyrebird();
Status status = lyrebird.status();// 获取当前服务MOCK端口
int mockPort = status.getMockPort();// 获取当前服务代理端口
int proxyPort = status.getPorxyPort();// 获取当前服务IP
String lyrebirdIP = status.getIp();
```### Mock 数据激活
#### 使用 groupID 手动激活
> groupID: 89e0426c-9cf9-454a-bbe0-94246fc23b04
```java
Lyrebird lyrebird = new Lyrebird();lyrebird.activate("89e0426c-9cf9-454a-bbe0-94246fc23b04");
```#### 使用注解方式自动激活
在测试类或测试方法上声明 MockData 注解并设置 groupID 和 groupName
```java
@MockData(groupID = "89e0426c-9cf9-454a-bbe0-94246fc23b04", groupName = "首页")
public class TestClass {
...
}@MockData(groupID = "89e0426c-9cf9-454a-bbe0-94246fc23b04", groupName = "首页")
@Test
public void testMethod() {
...
}
```如果 Lyrebird 启动在特定的域名端口下,需要在测试方法执行前设置 Lyrebird 服务地址
```java
// import herepublic class DemoCase {
@BeforeMethod
public void setup() {
// Lyrebird server that start on local port 8082
Lyrebird.setRemoteAddress("http://localhost:8082");
...
}
}
```#### TestNG
设置监听器
- 方法一:修改 testng.xml
```xml
```
- 方法二:源码中直接添加
```java
import com.meituan.lyrebird.client.listeners.TestNGListener;
import com.meituan.lyrebird.client.MockData;
...@MockData(groupID = "89e0426c-9cf9-454a-bbe0-94246fc23b04", groupName = "首页")
@Listeners(TestNGListener.class)
public class TestClass {
...
}
```#### Junit4
设置监听器
- 方法一:修改 pom.xml
```xml
[...]
org.apache.maven.plugins
maven-surefire-plugin
listener
com.meituan.lyrebird.client.events.Junit4Listener
[...]```
- 方法二:源码中直接添加
```java
import org.junit.runner.RunWith;
import com.meituan.lyrebird.client.events.Junit4Runner;
import com.meituan.lyrebird.client.MockData;@MockData(groupID = "89e0426c-9cf9-454a-bbe0-94246fc23b04", groupName = "首页")
@RunWith(Junit4Runner.class)
public class TestClass {
...
}
```#### 取消激活
```java
Lyrebird lyrebird = new Lyrebird();lyrebird.deactivate();
```#### 读取Mock数据
调用 getMockData(String dataId) 方法可以获取该数据组的 Mock 数据详情
```java
Lyrebird lyrebird = new Lyrebird();LBMockData lbMockData = lyrebird.getMockData("cfa0c589-8ef0-4885-b4f4-b9688c5af0d5");
// 读取Mock数据名
String mockDataName = lbMockData.getName();
// 读取Mock Response (注意:Lyrebird服务端返回的是一个 Json 字符串,并不是一个 Json 对象)
Object mockDataResponse = lbMockData.getResponseData();
```### 获取网络数据信息
flow 示例
```javascript
[
{
"id": "b193416d-f89c-435f-b158-4e47911cf98b",
"size": 350,
"duration": 0.21155691146850586,
"start_time": 1566805862.385838,
"request": {
"url": "https://lyrebird.java.client.com/api/example",
"path": "/api/example",
"host": "lyrebird.java.client.com",
"method": "POST"
},
"response": {
"code": 200,
"mock": "proxy"
}
}
]
```flow detail 示例
```javascript
{
"id": "b193416d-f89c-435f-b158-4e47911cf98b",
"duration": 0.21155691146850586,
"start_time": 1566805862.385838,
"request": {
"headers": {
"Accept-Encoding": "gzip",
"Userid": "-1",
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": "2942",
"Host": "127.0.0.1:9090",
"Connection": "Keep-Alive"
},
"method": "POST",
"query": {
"name": "tester",
"city": "beijing"
},
"url": "https://lyrebird.java.client.com/api/example",
"host": "lyrebird.java.client.com",
"path": "/api/example",
"data": {
"countryCode": "86"
}
},
"response": {
"code": 200,
"headers": {
"Date": "Mon, 26 Aug 2019 07:51:02 GMT",
"Content-Type": "application/json;charset=utf-8",
"Content-Length": "761",
"Connection": "keep-alive"
},
"timestamp": 1566805862.6,
"data": {
"user": {
"age": 18,
"username": "lyrebird-java-client"
}
}
}
}
```Flow 类属性
| 属性名 | 说明 |
| :---------- | :-------------------------- |
| `id` | 描述 flow data 的唯一 ID 标识 |
| `duration` | 客户端发起请求的持续时长 |
| `startTime` | 客户端发起请求的时间戳 |
| `request` | 客户端请求服务端的请求Java对象 |
| `response` | 远端服务返回的响应报文Java对象 |#### 获取 flow List
> Flow 数据保存为一个 List,单个 flow data 数据详见上面的示例
```java
Lyrebird lyrebird = new Lyrebird();Flow[] flowList = lyrebird.getFlowList();
```#### 获取 flow ID
```java
String flowId = flowList[0].getId();
```#### 获取请求持续时长
```java
double duration = flowList[0].getDuration();
```#### 获取请求开始时间
```java
double startTime = flowList[0].getStartTime();
```#### 获取 flow 数据的详细信息
> 默认 flow 中包含的网络数据是概要信息,可以通过 flow id 获取网络数据详细信息
```java
FlowDetail flowDetail = lyrebird.getFlowDetail(flowId);
```#### 获取请求对象
```java
Request request = flowDetail.getRequest();
```#### 获取返回对象
```java
Response response = flowDetail.getResponse();
```#### 清空 Flow 数据
```java
Lyrebird lyrebird = new Lyrebird();// 清空 flow 列表
lyrebird.clearFlowList();
```### 获取指定频道的消息总线数据
接口文档[点击这里](https://meituan-dianping.github.io/lyrebird/guide/api.html#获取已激活mock数据)
```java
// 获取 page 频道对应的消息总线数据
EventDetail[] eventList = lyrebird.getEventList("page");// 获取该频道第0个事件的事件ID
String eventID = eventList[0].getEventID();// 获取该频道第0个事件的内容
String content = eventList[0].getContent();
```### 获取Socket对象进行事件监听
使用[socket.io client](https://github.com/clwillingham/java-socket.io.client)监听Lyrebird socket事件消息
```java
// 获取 socket.io client
Socket socket = lyrebird.getSocketInstance();// 事件监听
socket.on("action", new Emitter.Listener() {@Override
public void call(Object... args) {
// do something here...
}
});// 建立连接
socket.connect();// 关闭连接
socket.disconnect();
```### 设置带宽限速
[Lyrebird 获取/设置网络带宽限速接口文档](https://meituan-dianping.github.io/lyrebird/guide/api.html#%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E7%BD%91%E7%BB%9C%E5%B8%A6%E5%AE%BD%E9%99%90%E9%80%9F)
```java
// 设置带宽限速为2G
lyrebird.setSpeedLimit(Bandwidth.BANDWIDTH_2G);
// 设置带宽限速为2.5G
lyrebird.setSpeedLimit(Bandwidth.BANDWIDTH_2_5G);
// 设置带宽限速为3G
lyrebird.setSpeedLimit(Bandwidth.BANDWIDTH_3G);
// 设置带宽不限速
lyrebird.setSpeedLimit(Bandwidth.UNLIMITED);
// 获取带宽速度
int bandwidth = lyrebird.getSpeedLimit().getBandwidth();
```## 应用场景
在UI自动化中,可将移动设备通过代理的方式将请求数据接入Lyrebird,[操作指南](https://github.com/Meituan-Dianping/lyrebird#连接移动设备),在测试用例中通过调用Lyrebird API来校验网络请求参数是否符合预期。
Lyrebird Java SDK 分别提供 Request, Response 类描述客户端发起的请求和响应数据
Request 类
| 属性名 | 说明 |
| :-------- | :-------------- |
| `headers` | 客户端请求报文头部 |
| `method` | 客户端HTTP请求方法 |
| `query` | query参数 |
| `url` | 客户端请求url |
| `host` | 客户端请求host |
| `path` | 客户端请求path |
| `data` | from-data参数 |Response 类
| 属性名 | 说明 |
| :-------- | :------------------ |
| `code` | HTTP 状态码 |
| `headers` | 服务端返回响应报文头部 |
| `data` | 服务端返回响应报文主体 |### 在UI自动化中校验请求参数是否符合预期
```java
// 实例化 Lyrebird 对象
Lyrebird lyrebird = new Lyrebird();// 获取客户端发送的所有 Flow 数据保存为一个 List
Flow[] flowList = lyrebird.getFlowList();// 遍历 flow list 中的每一条 flow 数据
for (Flow flow : flowList) {
// 取出 flow data 的 url 信息
String url = flow.getRequest().getUrl();
// 断言 http://lyrebird.java.client.com/api/example 接口的客户端请求内容
if (url.equals("http://lyrebird.java.client.com/api/example")) {
// 通过 flow id 查询该条 flow 数据的详细信息
FlowDetail flowDetail = lyrebird.getFlowDetail(flow.getId());
// 断言请求 headers 中 Content-Type 等于 application/x-www-form-urlencoded
assertEquals("application/x-www-form-urlencoded", flowDetail.getRequest().getHeaders().get("Content-Type"));
// 断言请求方法是 POST
assertEquals("POST", flowDetail.getRequest().getMethod());
// 断言请求 query 中 name 等于 tester
assertEquals("tester", flowDetail.getRequest().getQuery().get("name"));
// 断言请求 form-data 中 countryCode 等于 86
assertEquals("86", flowDetail.getRequest().getData().get("countryCode"));
}
}
```### 在UI自动化中校验返回与客户端展示是否一致
```java
// 实例化 Lyrebird 对象
Lyrebird lyrebird = new Lyrebird();// 获取客户端发送的所有 Flow 数据保存为一个 List
Flow[] flowList = lyrebird.getFlowList();// 遍历 flow list 中的每一条 flow 数据
for (Flow flow : flowList) {
// 取出 flow data 的 url 信息
String url = flow.getRequest().getUrl();
// 断言 http://lyrebird.java.client.com/api/example 接口的客户端请求内容
if (url.equals("http://lyrebird.java.client.com/api/example")) {
// 通过 flow id 查询该条 flow 数据的详细信息
FlowDetail flowDetail = lyrebird.getFlowDetail(flow.getId());
// 断言 HTTP 状态码为 200
assertEquals("200", flowDetail.getResponse().getCode());
// 断言返回 headers 中 Content-Type 等于 application/json;charset=utf-8
assertEquals("application/json;charset=utf-8", flowDetail.getResponse().getHeaders().get("Content-Type"));
/*
* 断言 data 中 countryCode 等于 86
* getData() 参数 JsonPath 相关使用方法及说明,详见官方 README: https://github.com/json-path/JsonPath/edit/master/README.md
*/
assertEquals(18, flowDetail.getResponse().getData("$.user.age"));
}
}
```