# Lyrebird Plugin API-Coverage
[![Build Status](https://travis-ci.org/meituan/lyrebird-api-coverage.svg?branch=master)](https://travis-ci.org/meituan/lyrebird-api-coverage)
## 简介
* API-Coverage是基于[Lyrebird](https://github.com/meituan/lyrebird)的插件,为客户端提供API维度测试覆盖评估方法。
* 客户端的操作可以实时反应在前端页面上,主要有API覆盖率统计、不同优先级的覆盖率展示等。可以参考该数据,判断测试是否已覆盖目标功能。
* API覆盖率的计算公式:覆盖率 = 已访问API/基准API
* 已访问API:被测应用已发出的请求(只记录当前业务内API)
* 基准API:当前业务所有API
<img src="./images/main.png" style="width:800px">
## 环境要求
* macOS
* Python3.7及以上
## 安装
``` bash
pip3 install lyrebird-api-coverage
```
## 启动
```bash
lyrebird
```
## 界面说明
<img src="./images/introduce.png" style="width:800px">
如图所示,不同区域的介绍:
1. 工具栏
1. Import Base - 导入需要统计的基准API列表(文件格式见附录[Base数据格式](#Base数据格式))
2. Resume Test - 导入统计结果并继续统计
3. Save Result - 导出统计结果到“~/.lyrebird/plugin/lyrebird_api_coverage/data/”
4. Clear Test - 清空当前的统计结果
5. Filtering Rules - 过滤规则设置(配置格式见附录[过滤配置数据格式](#过滤配置数据格式))
2. 覆盖率信息
1. 展示覆盖率信息,总体覆盖率信息,分优先级覆盖率信息
3. 基准API信息
1. 展示当前生效的基准API信息
4. 覆盖率详情模块
1. Priority:API的优先级
2. API: URL信息
3. Description:API的描述信息
4. Count:API的请求次数
5. Status:API的状态,包括 已测试,未测试,不在base中的API
6. Detail:查看请求详情,点击表格最后一列的详情中的Detail,就可以展示最近一次的请求的详情
## 使用流程
1. 准备Base数据,Base数据格式[见附录](#Base数据格式)
2. 点击工具栏中的“Import Base”按钮进行导入Base文件
3. 操作过程中观测页面的覆盖率等信息展示
## 开发者指南
```bash
# clone 代码
git clone https://github.com/meituan/lyrebird-api-coverage.git
# 进入工程目录
cd lyrebird-api-coverage
# 创建虚拟环境
python3 -m venv venv
# 安装依赖
source venv/bin/activate
pip3 install -r requirements.txt
# 使用IDE打开工程(推荐Pycharm或vscode)
# 在IDE中执行debug.py即可开始调试
```
## 附录
### Base数据格式
```json
{
"business": "app_channel",
"version_code": 1,
"version_name": "1.0",
"api_list": [
{
"desc": "A接口",
"priority": 3,
"url": "meituan.com/test/a"
},
{
"desc": "B接口",
"priority": 2,
"url": "meituan.com/test/b?paramKey=val"
},
{
"desc": "C接口",
"priority": 2,
"url": "meituan.com/test/c/{num}"
},
{
"desc": "D接口",
"priority": 1,
"url": "meituan.com/test/d?sourceType=1"
}
]
}
```
- 支持两种API,Path 和 Path + query,即不带参数的配置和带参数的配置
- 在配置API时,如果path中带有参数,如 a.b.com/v1/test/{num},需要用'{}'括起,在覆盖率计算中用来判断是同一API
- 配置参数的情况下,字段名的大小写敏感
### 过滤配置数据格式
- demo
```json
{
"exclude": {
"host": [
"a.meituan.com",
"b.baidu.com"
],
"regular": [
".webp",
".gif",
".jpg",
".png"
]
}
}
```
- 支持两种筛除规则,以host为维度,以包含字符串为维度
- 如果不想关注某些host下的请求,可以按照上述筛选配置文件的数据格式配置 host字段下的规则
- 如果不想关注某些包含指定字符串的请求(如:.webp),可以按照上述筛选配置文件的数据格式配置 regular字段下的规则
- 字段说明
- exclude:不关注的配置项
- host:不关注的host
- regular:不关注的字符串(URL只要包含指定的字符串都会筛选掉)
Raw data
{
"_id": null,
"home_page": "https://github.com/meituan/lyrebird-api-coverage",
"name": "lyrebird-api-coverage",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "",
"author": "HBQA",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/11/67/94135f5aea9733c7c257cbaf79eb56cca225809a9b559ebff95da6cfc0cf/lyrebird-api-coverage-0.4.1.tar.gz",
"platform": null,
"description": "# Lyrebird Plugin API-Coverage\n\n[![Build Status](https://travis-ci.org/meituan/lyrebird-api-coverage.svg?branch=master)](https://travis-ci.org/meituan/lyrebird-api-coverage)\n\n## \u7b80\u4ecb\n* API-Coverage\u662f\u57fa\u4e8e[Lyrebird](https://github.com/meituan/lyrebird)\u7684\u63d2\u4ef6\uff0c\u4e3a\u5ba2\u6237\u7aef\u63d0\u4f9bAPI\u7ef4\u5ea6\u6d4b\u8bd5\u8986\u76d6\u8bc4\u4f30\u65b9\u6cd5\u3002 \n* \u5ba2\u6237\u7aef\u7684\u64cd\u4f5c\u53ef\u4ee5\u5b9e\u65f6\u53cd\u5e94\u5728\u524d\u7aef\u9875\u9762\u4e0a\uff0c\u4e3b\u8981\u6709API\u8986\u76d6\u7387\u7edf\u8ba1\u3001\u4e0d\u540c\u4f18\u5148\u7ea7\u7684\u8986\u76d6\u7387\u5c55\u793a\u7b49\u3002\u53ef\u4ee5\u53c2\u8003\u8be5\u6570\u636e\uff0c\u5224\u65ad\u6d4b\u8bd5\u662f\u5426\u5df2\u8986\u76d6\u76ee\u6807\u529f\u80fd\u3002\n* API\u8986\u76d6\u7387\u7684\u8ba1\u7b97\u516c\u5f0f\uff1a\u8986\u76d6\u7387 = \u5df2\u8bbf\u95eeAPI/\u57fa\u51c6API\n * \u5df2\u8bbf\u95eeAPI\uff1a\u88ab\u6d4b\u5e94\u7528\u5df2\u53d1\u51fa\u7684\u8bf7\u6c42\uff08\u53ea\u8bb0\u5f55\u5f53\u524d\u4e1a\u52a1\u5185API\uff09\n * \u57fa\u51c6API\uff1a\u5f53\u524d\u4e1a\u52a1\u6240\u6709API\n\n\n<img src=\"./images/main.png\" style=\"width:800px\">\n\n## \u73af\u5883\u8981\u6c42\n\n* macOS\n\n* Python3.7\u53ca\u4ee5\u4e0a\n\n\n## \u5b89\u88c5\n\n``` bash\npip3 install lyrebird-api-coverage\n```\n\n\n## \u542f\u52a8\n```bash\nlyrebird\n```\n\n## \u754c\u9762\u8bf4\u660e\n\n<img src=\"./images/introduce.png\" style=\"width:800px\">\n\n\u5982\u56fe\u6240\u793a\uff0c\u4e0d\u540c\u533a\u57df\u7684\u4ecb\u7ecd\uff1a\n\n1. \u5de5\u5177\u680f\n 1. Import Base - \u5bfc\u5165\u9700\u8981\u7edf\u8ba1\u7684\u57fa\u51c6API\u5217\u8868\uff08\u6587\u4ef6\u683c\u5f0f\u89c1\u9644\u5f55[Base\u6570\u636e\u683c\u5f0f](#Base\u6570\u636e\u683c\u5f0f)\uff09\n 2. Resume Test - \u5bfc\u5165\u7edf\u8ba1\u7ed3\u679c\u5e76\u7ee7\u7eed\u7edf\u8ba1\n 3. Save Result - \u5bfc\u51fa\u7edf\u8ba1\u7ed3\u679c\u5230\u201c~/.lyrebird/plugin/lyrebird_api_coverage/data/\u201d\n 4. Clear Test - \u6e05\u7a7a\u5f53\u524d\u7684\u7edf\u8ba1\u7ed3\u679c\n 5. Filtering Rules - \u8fc7\u6ee4\u89c4\u5219\u8bbe\u7f6e\uff08\u914d\u7f6e\u683c\u5f0f\u89c1\u9644\u5f55[\u8fc7\u6ee4\u914d\u7f6e\u6570\u636e\u683c\u5f0f](#\u8fc7\u6ee4\u914d\u7f6e\u6570\u636e\u683c\u5f0f)\uff09\n \n2. \u8986\u76d6\u7387\u4fe1\u606f\n\n 1. \u5c55\u793a\u8986\u76d6\u7387\u4fe1\u606f\uff0c\u603b\u4f53\u8986\u76d6\u7387\u4fe1\u606f\uff0c\u5206\u4f18\u5148\u7ea7\u8986\u76d6\u7387\u4fe1\u606f\n\n3. \u57fa\u51c6API\u4fe1\u606f\n 1. \u5c55\u793a\u5f53\u524d\u751f\u6548\u7684\u57fa\u51c6API\u4fe1\u606f\n\n4. \u8986\u76d6\u7387\u8be6\u60c5\u6a21\u5757\n\n 1. Priority\uff1aAPI\u7684\u4f18\u5148\u7ea7\n 2. API: URL\u4fe1\u606f\n 3. Description\uff1aAPI\u7684\u63cf\u8ff0\u4fe1\u606f\n 4. Count\uff1aAPI\u7684\u8bf7\u6c42\u6b21\u6570\n 5. Status\uff1aAPI\u7684\u72b6\u6001\uff0c\u5305\u62ec \u5df2\u6d4b\u8bd5\uff0c\u672a\u6d4b\u8bd5\uff0c\u4e0d\u5728base\u4e2d\u7684API\n 6. Detail\uff1a\u67e5\u770b\u8bf7\u6c42\u8be6\u60c5\uff0c\u70b9\u51fb\u8868\u683c\u6700\u540e\u4e00\u5217\u7684\u8be6\u60c5\u4e2d\u7684Detail\uff0c\u5c31\u53ef\u4ee5\u5c55\u793a\u6700\u8fd1\u4e00\u6b21\u7684\u8bf7\u6c42\u7684\u8be6\u60c5\n\n## \u4f7f\u7528\u6d41\u7a0b\n\n1. \u51c6\u5907Base\u6570\u636e\uff0cBase\u6570\u636e\u683c\u5f0f[\u89c1\u9644\u5f55](#Base\u6570\u636e\u683c\u5f0f)\n2. \u70b9\u51fb\u5de5\u5177\u680f\u4e2d\u7684\u201cImport Base\u201d\u6309\u94ae\u8fdb\u884c\u5bfc\u5165Base\u6587\u4ef6\n3. \u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u89c2\u6d4b\u9875\u9762\u7684\u8986\u76d6\u7387\u7b49\u4fe1\u606f\u5c55\u793a\n\n\n## \u5f00\u53d1\u8005\u6307\u5357\n\n```bash\n# clone \u4ee3\u7801\ngit clone https://github.com/meituan/lyrebird-api-coverage.git\n\n# \u8fdb\u5165\u5de5\u7a0b\u76ee\u5f55\ncd lyrebird-api-coverage\n\n# \u521b\u5efa\u865a\u62df\u73af\u5883\npython3 -m venv venv\n\n# \u5b89\u88c5\u4f9d\u8d56\nsource venv/bin/activate\npip3 install -r requirements.txt\n\n# \u4f7f\u7528IDE\u6253\u5f00\u5de5\u7a0b\uff08\u63a8\u8350Pycharm\u6216vscode\uff09\n\n# \u5728IDE\u4e2d\u6267\u884cdebug.py\u5373\u53ef\u5f00\u59cb\u8c03\u8bd5\n```\n\n\n## \u9644\u5f55\n### Base\u6570\u636e\u683c\u5f0f\n\n```json\n{\n \"business\": \"app_channel\",\n \"version_code\": 1,\n \"version_name\": \"1.0\",\n \"api_list\": [\n {\n \"desc\": \"A\u63a5\u53e3\",\n \"priority\": 3,\n \"url\": \"meituan.com/test/a\"\n },\n {\n \"desc\": \"B\u63a5\u53e3\",\n \"priority\": 2,\n \"url\": \"meituan.com/test/b?paramKey=val\"\n },\n {\n \"desc\": \"C\u63a5\u53e3\",\n \"priority\": 2,\n \"url\": \"meituan.com/test/c/{num}\"\n },\n {\n \"desc\": \"D\u63a5\u53e3\",\n \"priority\": 1,\n \"url\": \"meituan.com/test/d?sourceType=1\"\n }\n ]\n}\n```\n- \u652f\u6301\u4e24\u79cdAPI\uff0cPath \u548c Path + query\uff0c\u5373\u4e0d\u5e26\u53c2\u6570\u7684\u914d\u7f6e\u548c\u5e26\u53c2\u6570\u7684\u914d\u7f6e\n- \u5728\u914d\u7f6eAPI\u65f6\uff0c\u5982\u679cpath\u4e2d\u5e26\u6709\u53c2\u6570\uff0c\u5982 a.b.com/v1/test/{num}\uff0c\u9700\u8981\u7528'{}'\u62ec\u8d77\uff0c\u5728\u8986\u76d6\u7387\u8ba1\u7b97\u4e2d\u7528\u6765\u5224\u65ad\u662f\u540c\u4e00API\n- \u914d\u7f6e\u53c2\u6570\u7684\u60c5\u51b5\u4e0b\uff0c\u5b57\u6bb5\u540d\u7684\u5927\u5c0f\u5199\u654f\u611f\n\n### \u8fc7\u6ee4\u914d\u7f6e\u6570\u636e\u683c\u5f0f\n- demo\n\n```json\n{\n \"exclude\": {\n \"host\": [\n \"a.meituan.com\",\n \"b.baidu.com\"\n ],\n \"regular\": [\n \".webp\",\n \".gif\",\n \".jpg\",\n \".png\"\n ]\n }\n}\n```\n- \u652f\u6301\u4e24\u79cd\u7b5b\u9664\u89c4\u5219\uff0c\u4ee5host\u4e3a\u7ef4\u5ea6\uff0c\u4ee5\u5305\u542b\u5b57\u7b26\u4e32\u4e3a\u7ef4\u5ea6\n - \u5982\u679c\u4e0d\u60f3\u5173\u6ce8\u67d0\u4e9bhost\u4e0b\u7684\u8bf7\u6c42\uff0c\u53ef\u4ee5\u6309\u7167\u4e0a\u8ff0\u7b5b\u9009\u914d\u7f6e\u6587\u4ef6\u7684\u6570\u636e\u683c\u5f0f\u914d\u7f6e host\u5b57\u6bb5\u4e0b\u7684\u89c4\u5219\n - \u5982\u679c\u4e0d\u60f3\u5173\u6ce8\u67d0\u4e9b\u5305\u542b\u6307\u5b9a\u5b57\u7b26\u4e32\u7684\u8bf7\u6c42\uff08\u5982\uff1a.webp\uff09\uff0c\u53ef\u4ee5\u6309\u7167\u4e0a\u8ff0\u7b5b\u9009\u914d\u7f6e\u6587\u4ef6\u7684\u6570\u636e\u683c\u5f0f\u914d\u7f6e regular\u5b57\u6bb5\u4e0b\u7684\u89c4\u5219\n \n- \u5b57\u6bb5\u8bf4\u660e\n - exclude:\u4e0d\u5173\u6ce8\u7684\u914d\u7f6e\u9879\n - host:\u4e0d\u5173\u6ce8\u7684host\n - regular:\u4e0d\u5173\u6ce8\u7684\u5b57\u7b26\u4e32\uff08URL\u53ea\u8981\u5305\u542b\u6307\u5b9a\u7684\u5b57\u7b26\u4e32\u90fd\u4f1a\u7b5b\u9009\u6389\uff09",
"bugtrack_url": null,
"license": "",
"summary": "",
"version": "0.4.1",
"project_urls": {
"Homepage": "https://github.com/meituan/lyrebird-api-coverage"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "116794135f5aea9733c7c257cbaf79eb56cca225809a9b559ebff95da6cfc0cf",
"md5": "ac5b515185178e10463f64b83ea3a3a3",
"sha256": "570b7866f80b7981aaa2f2a4a9fc82d89bc154560e9ce90d1030c340a0adbaf7"
},
"downloads": -1,
"filename": "lyrebird-api-coverage-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "ac5b515185178e10463f64b83ea3a3a3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 1681895,
"upload_time": "2023-05-31T12:21:35",
"upload_time_iso_8601": "2023-05-31T12:21:35.369094Z",
"url": "https://files.pythonhosted.org/packages/11/67/94135f5aea9733c7c257cbaf79eb56cca225809a9b559ebff95da6cfc0cf/lyrebird-api-coverage-0.4.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-31 12:21:35",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "meituan",
"github_project": "lyrebird-api-coverage",
"travis_ci": true,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "lyrebird-api-coverage"
}