开源测试工具 美团琴鸟 Lyrebird 工具 (接口 mock 类)

老马 · 2018年07月17日 · 最后由 回复于 2022年01月24日 · 9418 次阅读

一 资源索引

Lyrebird Github
请参考大会的 ppt--客户端 QA 测试效率工具 - 赵晔.pdf  

在今年的移动互联网测试大会上首次分享的一款保证客户端 App 的质量工具。

个人看后是这么理解的,正如文中所说 “使用 Lyrebird 后客户端完全和后端 API 服务器分离。API 服务器相关的缺陷将不会被测到。可使用接口测试工具继续完成 API 接口服务的测试工作,以保障客户端质量。”

该工具比较适合在系统集成测试的中后期;
或者服务接口测试结束(服务接口可靠性有一定保障)且前端客户端 app 手工业务也主要测试完成后;
或者在小版本迭代上线新功能(服务接口变动不大)的测试场景下;
利用代理 mitmproxy 捕获客户端 app 的操作 api 请求,然后利用 mock 工具 (Lyrebird 的 Datamanager) 进行模拟返回,更多将测试重点聚焦于客户端 App 的前端测试或前端业务场景模拟。

二 部署记录

本人是 ubuntu18.04 桌面版,其它 windows 或 mac 系统部署类似,只要有 python3 环境均可使用。
以下为利用 python virtualenv 部署 python3 和 Lyrebird

# 利用virtualenv 创建名为 Lyrebird的python3.6.5 虚拟环境
cmd@TR:~$ pyenv virtualenv 3.6.5 Lyrebird
Requirement already satisfied: setuptools in /home/cmd/.pyenv/versions/3.6.5/envs/Lyrebird/lib/python3.6/site-packages
Requirement already satisfied: pip in /home/cmd/.pyenv/versions/3.6.5/envs/Lyrebird/lib/python3.6/site-packages

# 激活使用Lyrebird虚拟python3环境
cmd@TR:~$ pyenv activate Lyrebird
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior

# 检查初始虚拟环境带的py包
(Lyrebird) cmd@TR:~$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.3)
setuptools (39.0.1)

# 升级下过老的py包
(Lyrebird) cmd@TR:~$ pip install --upgrade pip
(Lyrebird) cmd@TR:~$ pip install --upgrade setuptools

(Lyrebird) cmd@TR:~$ pip list
Package    Version
---------- -------
pip        10.0.1
setuptools 40.0.0

# 安装lyrebird
(Lyrebird) cmd@TR:~$ pip install lyrebird

# 看下lyrebird 依赖安装了其他哪些py包
(Lyrebird) cmd@TR:~$ pip list
Package          Version  
---------------- ---------
aniso8601        3.0.2    
asn1crypto       0.24.0   
beautifulsoup4   4.6.0    
blinker          1.4      
brotlipy         0.7.0    
certifi          2018.4.16
cffi             1.11.5   
chardet          3.0.4    
click            6.7      
colorama         0.3.9    
cryptography     2.2.2    
fire             0.1.3    
Flask            1.0.2    
Flask-RESTful    0.3.6    
Flask-SocketIO   3.0.1    
genson           1.0.1    
h11              0.7.0    
h2               3.0.1    
hpack            3.0.0    
hyperframe       5.1.0    
idna             2.7      
itsdangerous     0.24     
Jinja2           2.10     
kaitaistruct     0.8      
ldap3            2.5      
lyrebird         0.10.5   
MarkupSafe       1.0      
mitmproxy        4.0.3    
packaging        17.1     
passlib          1.7.1    
pip              10.0.1   
portpicker       1.2.0    
pyasn1           0.4.3    
pycparser        2.18     
pycryptodome     3.4.11   
pyOpenSSL        18.0.0   
pyparsing        2.2.0    
pyperclip        1.6.2    
python-engineio  2.2.0    
python-socketio  2.0.0    
pytz             2018.5   
requests         2.19.1   
ruamel.yaml      0.15.44  
setuptools       40.0.0   
six              1.11.0   
sortedcontainers 2.0.4    
tornado          5.0.2    
urllib3          1.23     
urwid            2.0.1    
Werkzeug         0.14.1   
wsproto          0.11.0  



# 查看下命令行参数帮助
(Lyrebird) cmd@TR:~$ lyrebird --help
WARNING: The proper way to show help is 'lyrebird -- --help'.
Showing help anyway.

Fire trace:
1. Initial component
2. Instantiated class "CommandLine" (/home/cmd/.pyenv/versions/3.6.5/envs/Lyrebird/lib/python3.6/site-packages/lyrebird/manager.py:127)
3. ('Could not consume arg:', '--help')

Type:        CommandLine
String form: <lyrebird.manager.CommandLine object at 0x7f4f83a07b00>
Docstring:   命令行入口

* lyrebird
以缺省参数启动lyrebird

* lyrebird start
以缺省参数启动lyrebird

* lyrebird v start
以输出详细日志模式启动lyrebird

* lyrebird no-browser start
启动lyrebird不默认打开浏览器

* lyrebird start --mock 9090 --proxy 4272 --data .
指定参数启动lyrebird
参数:
    --mock 默认9090 , mock服务及前端端口
    --proxy 默认4272, 代理服务端口
    --data 默认./data, mock数据根目录
    --name 默认lyrebird,服务别名(用于通过别名停止指定的lyrebird服务)

* lyrebird stop
停止lyrebird

* lyrebird stop --name foo
停止别名为foo的lyrebird

Usage:       lyrebird
             lyrebird no-browser
             lyrebird resource
             lyrebird server
             lyrebird start
             lyrebird stop
             lyrebird v


# 带v 日志方式 启动lyrebird服务
(Lyrebird) cmd@TR:~$ lyrebird v start
lyrebird Load config : {
    "version": "0.10.5",
    "proxy.filters": [],
    "proxy.port": 4272,
    "mock.port": 9090,
    "mock.data": "data",
    "mock.proxy_headers": {
        "scheme": "MKScheme",
        "host": "MKOriginHost",
        "port": "MKOriginPort"
    },
    "ip": "your ip "
}
lyrebird start on your ip:9090
 * Serving Flask app "MOCK" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
mitmproxy start on your ip:4272  ***请在被测设备上设置代理服务器地址***
INFO - [mock_server] - 302  GET http://localhost:9090/
INFO - [mock_server] - 200  GET http://localhost:9090/ui/


小米手机设置代理参考

https://jingyan.baidu.com/article/1974b2895cb780f4b1f774b5.html
我本机是 ubuntu18.04 用的公司无线 wifi dhcp 获得 IP ,手机也是连接的公司同一 wifi
根据日志输出 “mitmproxy start on your ip:4272 请在被测设备上设置代理服务器地址” 提示,配置好手机该 wifi 代理的 ip 和端口 4272
被测设备上用浏览器打开 http://mitm.it 选 Android 提示下载 pem.crt 安装,并安装证书。

小米 mix2 miui9.6 安装 mitmproxy 证书问题解决:

用手机自带的浏览器 或者 Firefox(从日志来看小米浏览器被一个 url 为 sec.miui.com 的安全服务限制了,无法正常下载该 pem.crt 证书,Firefox 则是没有什么提示,但再此点击 Android 图标又会提示 “此证书已在此前安装为一个证书颁发机构”)

都无法正常唤起 “证书安装程序” ,最后尝试用了 Chrome ,终于点击 Android 图标下载文件 pem.crt 成功后提示并唤起了手机系统的 “证书安装程序” ,此处还要输入锁屏密码,然后就是一个 “为证书命名” 的提示框。输入一个名字 lyrebird ,确定即正常提示安装证书成功。

通过 Chrome 的下载管理来看该 pem 文件名

该证书凭据最后可以在设置 ->其他设置-> 系统安全-> 加密与凭据-> 信任的凭据-> 用户下找到,名为 mitmproxy

然后在地址 http://localhost:9090/ui/ 便可以点击 record 图标 ,来开始录制手机上操作 app 的请求。

界面只有 inspector 和 datamanager 解决 

其他界面是插件形式提供的,目前默认没有集成插件。还是需要自己装的。
安装方式如下
pip install lyrebird-ios
pip install lyrebird-android
pip install lyrebird-api-coverage

Android 界面

lyrebird-android 
需要安装该插件。目前 lyrebird 默认界面 inspector  DataMagnager
插件有 ios   api-coverage   android
像 overbridge 和大会里提到的其他 还未开放?

这个 Android 界面,我实验了下 usb 连接真机,不开启开发者模式中的 usb 调试相关 或 adb devices -l 命令 list 不出来真机,界面上刷新 Android 界面 是找不到你的真机的。
所以还是要开启开发者模式相关。

可以看到真机界面(但非实时双向的)实时日志,和其他快捷启动 app 等

码完待续,先部署好。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 43 条回复 时间 点赞

这个只支持 macOs 系统啊,不能在 Windows 下使用

老马 #42 · 2018年07月17日 Author
黑山老妖 回复

windows mac linux 都可以啊 只要有 python3 环境  安装 lyrebird 就可以了啊 

老马 回复

我在 git 上看的,上面写的:环境要求

macOS

Python3.6 及以上

我们内部也有类似工具,我看看功能上有没有可借鉴的

试了下,Windows 下安装后,需要把%homepath%.lyrebird\logging_config.ini 文件中的 lyrebird.log 路径里面反斜线都换成双反斜线才能正常启动
否则会报下面的错
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

我们内部也有,是基于 anyproxy 开发的。

我这也有个基于 HTTP 流程的 MOCK:https://github.com/zhangfei19841004/zmock

抓不来 https 貌似 😂

老马 #35 · 2018年07月18日 Author
linpengcheng 回复

你瞎说  证书可能没安装设置好  去该证书凭据最后可以在设置 ->其他设置-> 系统安全-> 加密与凭据-> 信任的凭据-> 用户下找到,名为 mitmproxy   。我代表月亮消灭你。

wangkang_reg 回复

我也遇到了和你一样的 BUG,不支持 windows, 我看 github 上已经有人提 bug 了,等他们修吧

韩将 回复

亲按我说的改一下那个配置的路径,支持 Windows 的
安装后,需要把%homepath%/.lyrebird\logging_config.ini 文件中的 lyrebird.log 路径里面反斜线都换成双反斜线才能正常启动

老马 回复

哈哈 我们的接口比较特别。。。。

wangkang_reg 回复

亲,%homepath% 指的应该是 python 的目录吧? 我的 python3 是用 Anaconda3 装的
C:\ProgramData\Anaconda3\Lib\site-packages\lyrebird\templates 目录下有一个 logging_config.ini
但是我打开文件,里面没有路径呀,以下是文件内容

[loggers]
keys = root

[logger_root]
level = NOTSET
handlers = stream, logFileHandler

[handlers]
keys = stream, logFileHandler

[handler_stream]
class = StreamHandler
level = DEBUG
formatter = stream
args = ''

[handler_logFileHandler]
class = logging.handlers.TimedRotatingFileHandler
level = NOTSET
formatter = logFileFormatter
suffix = %Y-%m-%d
args =

[formatters]
keys = stream, logFileFormatter

[formatter_stream]
class = lyrebird.mock.logger_helper.ColorFormatter
format = %(levelname)s - [%(module)s] - %(message)s

[formatter_logFileFormatter]
format = %(asctime)s - %(levelname)s - [%(module)s] - %(threadName)s [PID] %(process)s - %(message)s
datefmt = %Y-%m-%d %H:%M:%S
韩将 回复

%homepath%.lyrebird
资源管理器里直接打开上面这个路径,就能看到了

老马 回复


证书已经按照,然而就是 HTTPS 的不行,HTTP 的可以。
用的 360 手机,百度首页就是打不开

老马 #16 · 2018年07月19日 Author
韩将 回复

你删除掉 fiddler 的那个证书 排除下其它干扰,lyrebird v start 加 v 启动,看看日志里都有些什么内容和信息。

启动的时候,报错,没有配置 Android 环境变量。这台电脑,确实没下载 Android 相关的东西。不过用了 pip install lyrebird-android

Exception in thread Thread-1:
Traceback (most recent call last):
  File "c:\programdata\anaconda3\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "c:\programdata\anaconda3\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "c:\programdata\anaconda3\lib\site-packages\lyrebird_android\device_service.py", line 32, in run
    self.handle()
  File "c:\programdata\anaconda3\lib\site-packages\lyrebird_android\device_service.py", line 38, in handle
    devices = android_helper.devices()
  File "c:\programdata\anaconda3\lib\site-packages\lyrebird_android\android_helper.py", line 365, in devices
    check_android_home()
  File "c:\programdata\anaconda3\lib\site-packages\lyrebird_android\android_helper.py", line 51, in check_android_home
    raise AndroidHomeError('Not set env : ANDROID_HOME')
lyrebird_android.android_helper.AndroidHomeError: Not set env : ANDROID_HOME

把 fiddler 的证书删除之后,可以正常抓包了

楼主好,请问这个和使用 Charles 抓包有什么区别?谢谢

谢谢分享。我们也准备用工具来解耦前后端测试。

老马 #20 · 2018年07月23日 Author
jiap 回复

Charles 虽然 chareles 是跨平台 win linux mac 虽可破解但是收费的。
mitmproxy 是开源的,基于 python3 只要有 py3 环境均可运行。有开放 API,你可以集成或调用 mitmproxy。 比如 lyrebird 就是用mitmproxy 做代理。


我这里运行后,经常会出现栈溢出的问题

老马 #22 · 2018年07月25日 Author
星沙 回复

https://github.com/meituan/lyrebird-android/issues

请到此处 提交您的 issue

针对 PC 端 web 页面有没有像这样的 mock 工具呢?这个工具能支持吗?

老马 #24 · 2018年07月25日 Author
豆豆 回复

https://testerhome.com/topics/15100 mitmproxy 官网 看下 有对各平台的支持 linux win mac 不仅仅是手机平台 ios android wp

韩将 回复

亲,我遇到了与你一样的问题,你这个问题解决了吗?

wangkang_reg 回复

lyrebird 下面未找到 logging_config.ini 这个文件

Sanyu 回复

先运行一波代码,然后初始化环境时候会生成这个文件,然后再修改。一开始我也没有。另外你路径找错了==。

老马 回复

adb devices 命令可以看到手机,可 lyrebird 页面 devices 是空的,需要配置一下吗?

再见理想 回复

不能直接打一个 War 包入在项目里吗,把项目下载下来再导入到本地打包还要下载依赖的包,太麻烦了

豆豆 回复

我出现这个文件了,但是这个文件下没有 logging_config.ini


使用 lyrebird 代理后,有很多访问请求是响应不了的。调试发现请求就没进入到 api_mock 模块内去处理,
例如:
https://m.trc.com
https://www.sina.com.cn
访问后,都无法打开原本的网页

请教下,这个工具支持 socket 通信吗

仅楼主可见

logging_config.ini 这个文件找不到
另外支持 socket 通信吗

windows 平台,导入 resource 包找不到,楼上的同学是怎么解决

回复

windows 留下解决办法:
resource 文件导入错误,导入文件修改办法:安装 python-resources 0.3
项目启动失败:config.py 文件修改,修改后内容 ("mock.data": "/mock_data/personal")
启动后无法关闭,最新错误,后台日志错误:
RROR [device_service] DeviceService Crash:
Traceback (most recent call last):
File "e:\program files\python3.7\lib\site-packages\lyrebird_android\device_service.py", line 42, in run
self.handle()
File "e:\program files\python3.7\lib\site-packages\lyrebird_android\device_service.py", line 50, in handle
devices = android_helper.devices()
File "e:\program files\python3.7\lib\site-packages\lyrebird_android\android_helper.py", line 416, in devices
device = Device.from_adb_line(line)
File "e:\program files\python3.7\lib\site-packages\lyrebird_android\android_helper.py", line 121, in from_adb_line
raise ADBError(f'Read device info line error. {line}')
lyrebird_android.android_helper.ADBError: Read device info line error.

请问,抓包抓下来的数据 rep 不能编辑吗?

unbuntu 上安装时出现 ModuleNotFoundError: No module named ‘_sqlite3‘

如果接口重名,但是请求方式不同,mock 接口返回得时候无法区分 (例如:OPTIONS,GET)

有人用 windows 安装过吗?一直报错 build\temp.win32-3.8\Release_openssl.c(546): fatal error C1083: 无法打开包括文件: “openssl/opensslv.h”: No such file or directory
error: command 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\HostX86\x86\cl.exe' failed with exit status 2

代理的时候,代理 302 的请求,后面没法跳转,直接网络异常,这个是什么情况

老马 回复

老哥,微信能加下吗,我安装后,启动报错了

Process Process-1:
Traceback (most recent call last):
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\site-packages\eventlet\hubs\__init__.py", line 107, in get_hub
    hub = _threadlocal.hub
AttributeError: '_thread._local' object has no attribute 'hub'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\site-packages\eventlet\hubs\__init__.py", line 110, in get_hub
    _threadlocal.Hub
AttributeError: '_thread._local' object has no attribute 'Hub'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\multiprocessing\process.py", line 297, in _bootstrap
    self.run()
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\multiprocessing\process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\site-packages\lyrebird\mock\extra_mock_server.py", line 54, in eventlet_server
    wsgi.server(eventlet.listen(('', port)), app.wsgi_app)
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\site-packages\eventlet\convenience.py", line 49, in listen
    sock = socket.socket(family, socket.SOCK_STREAM)
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\site-packages\eventlet\greenio\base.py", line 138, in __init__
    notify_opened(fd.fileno())
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\site-packages\eventlet\hubs\__init__.py", line 185, in notify_opened
    hub = get_hub()
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\site-packages\eventlet\hubs\__init__.py", line 112, in get_hub
    use_hub()
  File "c:\users\chennan\appdata\local\programs\python\python37\lib\site-packages\eventlet\hubs\__init__.py", line 87, in use_hub
    raise Exception('selected hub is not available on this system mod={}'.format(mod))
Exception: selected hub is not available on this system mod=<module 'eventlet.hubs.poll' from 'c:\\users\\chennan\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\eventlet\\hubs\\poll.py'>

报错了,windows 电脑下 pip 安装,求大神帮忙看下

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