前提
在写一个自动化测试suite的过程中,需要测试一个异步的API。调用这个API会向一个notification server发送一个包含notification的request,notification server根据reques的内容返回一个response,response包含了此次调用的最终结果。
因此,测试这个API需要一个notification server,怎么办?mock一个简单的server,只要能处理http请求,解析request中的内容,然后返回结果就行。
Turq
在Google的过程中,发现有一个叫turq的包,支持用python3 mock server,而且极其轻量。
安装:
pip3 install turq
测试:
$ turq
如果能够像下面一样正常启动,说明安装成功:
18:22:19 turq new rules installed 18:22:19 turq mock on port 13085 - try http://pergamon:13085/ 18:22:19 turq editor on port 13086 - try http://pergamon:13086/ 18:22:19 turq editor password: QGOf9Y9Eqjvz4XhY4JA3U7hG (any username
Turq自带一个编辑器,你可以在浏览器中访问 http://localhost:13086/ 打开编辑器。网页会向你请求用户名和密码,若没用配置则只输入启动turq时给的密码不输入用户名即可。
你可以根据右边的实例mock一个简单的server:
然后在Postman中测试:
同时在启动turq的命令行中可以看到相关log的输出:
17:22:25 turq.request.3 + Content-Type: text/plain; charset=utf-8
17:22:25 turq.request.3 sending 37 bytes of response body
17:22:55 turq.request.4 > POST /scif/notification/info HTTP/1.1
17:22:55 turq.request.4 + Host: localhost:13085
17:22:55 turq.request.4 + Connection: keep-alive
17:22:55 turq.request.4 + Content-Length: 126
17:22:55 turq.request.4 + User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
17:22:55 turq.request.4 + Cache-Control: no-cache
17:22:55 turq.request.4 + Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
17:22:55 turq.request.4 + Postman-Token: 647786e0-5e14-b489-686c-d8499f5852d4
17:22:55 turq.request.4 + Content-Type: application/vnd.yang.data+json
17:22:55 turq.request.4 + Accept: */*
17:22:55 turq.request.4 + Accept-Encoding: gzip, deflate, br
17:22:55 turq.request.4 + Accept-Language: zh-CN,zh;q=0.9
17:22:55 turq.request.4 received request body: 126 bytes
17:22:55 turq.request.4 < HTTP/1.1 200 OK
17:22:55 turq.request.4 + Content-Type: application/json
17:22:55 turq.request.4 + Date: Mon, 09 Apr 2018 09:22:55 GMT
17:22:55 turq.request.4 sending 48 bytes of response body
当然,如果我要在测试脚本中mock server可以这样来编辑并启动这个server:
首先写一个后台rule文件,保存为rules.py:
if route('/scif/notification/info'):
if POST:
debug()
result = request.json['result']
soId = request.json['soId']
if result == "ok":
json({"sdx:output": {"result": "ok", "soId": soId}})
启动该server:
$ turq --no-editor --rules ./rules.py
或者后台运行,将log输出到指定文件中:
$ nohup turq --no-editor --rules ./rules.py >logs/notification-server.log 2>&1 &
通过ctrl+C终止进程,或者使用pkil命令:
$ pkill turq
参考
Turq user manual — Turq 0.3.2.dev1 documentation
更新
如遇以下错误:
AttributeError: module 'werkzeug.http' has no attribute 'parse_authorization_header'
原因:werkzeug 版本过高,回退到2.3.7 即可。'parse_authorization_header' not found in werkzeug 3.0.0 · Issue #6541 · psf/requests · GitHub
pip3 uninstall werkzeug
pip3 install werkzeug==2.3.7