在分析自动化测试报告的时候,有时候只根据失败截图,无法看出问题原因
这时候往往需要测试人员进行手工复现/查看日志/抓包等操作
通过代码将每个case运行后的日志和报告存储下来,方便后续分析
代码参考:minium/framework/minitest.py
日志记录
在打开小程序时候就开启日志记录
def open(self, config: dict = None):
....
self.enable_app_log()
g_log_message_list = []
def enable_app_log(self):
self.app.connection.register("App.logAdded", self.save_log)
self.app.connection.send("App.enableLog")
def save_log(self, message):
message["dt"] = timeoperator.now1
self.g_log_message_list.append(message)
register注册了App.logAdded
,它回调了save_log
方法
在save_log
中,它记录了一下当前时间,然后再把带时间的日志存到一个列表中
类似:
[
{
"type": "log",
"args": [
"%c =====> 进入小程序 <=====:",
"background:#ddc64d;color:#333",
{
"path": "/pages/tabs/t3",
"originQuery": {},
"sceneQuery": {},
"query": {}
}
],
"dt": "2023-02-06 19:39:48"
}
]
网络请求记录
https://minitest.weixin.qq.com/#/minium/Python/api/App?id=expose_function
![1adf3aee29dc8ced73fa52219f794f17.png](https://i-blog.csdnimg.cn/blog_migrate/8fd444af10ad6953bd6b295d6fbc248c.png)
在打开小程序时候就开启网络请求记录
def open(self, config: dict = None):
....
self.enable_network_panel()
enable_network_panel
方法里面用两个回调函数将request和response存入到了g_network_message_dict
g_network_message_dict = {} # 记录请求消息
g_network_req_cache = {} # 记录请求体消息(降低重复请求消息量)
g_network_resp_cache = {} # 记录请求返回消息(降低重复请求消息量)
last_request = {}
def enable_network_panel(self):
self.app._evaluate_js("uuid")
self.app.expose_function("mini_request_callback", self.request_callback)
self.app.expose_function("mini_send_request", self.send_request)
self.app._evaluate_js("networkPannel")
def request_callback(self, message):
[msg_id, res, ms, hash_id] = message["args"]
if hash_id and res: # 传了原始response res, 记录起来
self.g_network_resp_cache[hash_id] = {"res": res, "timestamp": timeoperator.now1}
elif hash_id and hash_id in self.g_network_resp_cache:
res = self.g_network_resp_cache[hash_id]["res"]
self.g_network_resp_cache[hash_id]["timestamp"] = timeoperator.now1
if msg_id not in self.g_network_message_dict:
self.g_network_message_dict[msg_id] = {"timestamp": timeoperator.now1}
self.g_network_message_dict[msg_id]["end_timestamp"] = ms
self.g_network_message_dict[msg_id]["response"] = json.loads(res)
def send_request(self, message):
[msg_id, obj, ms, hash_id] = message["args"]
if hash_id and obj: # 传了原始request obj, 记录起来
self.g_network_req_cache[hash_id] = {"obj": obj, "timestamp": timeoperator.now1}
elif hash_id and hash_id in self.g_network_req_cache:
obj = self.g_network_req_cache[hash_id]["obj"]
self.g_network_req_cache[hash_id]["timestamp"] = timeoperator.now1
if msg_id not in self.g_network_message_dict:
self.g_network_message_dict[msg_id] = {"timestamp": timeoperator.now1}
self.g_network_message_dict[msg_id]["start_timestamp"] = ms
self.g_network_message_dict[msg_id]["request"] = json.loads(obj)
由于网络请求很多,所以使用了中间变量g_network_req_cache
/g_network_resp_cache
来去除重复消息
每个用例后展示
在每次执行之后将日志\网络请求数据展示到报告中,然后清空掉
@pytest.fixture(autouse=True)
def log_record():
yield
attach_text(Mini.g_log_message_list, "日志")
attach_text(Mini.g_network_message_dict, f"全部网络请求")
for i in sorted([i for i in Mini.g_network_message_dict.values() if
i.get("request") and i.get("response") and i.get("start_timestamp")],
key=lambda d: d.get("start_timestamp")):
method = i["request"].get("method", "")
url = i["request"].get("url", "")
with allure.step(f"网络请求:{i['timestamp']} {method} {url}"):
attach_text(i, f"网络请求:{i['timestamp']}")
attach_text(url, "请求地址")
attach_text(method, "请求方式")
attach_text(i["response"].get("statusCode"), "响应状态码")
attach_text(i["request"].get("data"), "请求数据")
attach_text(i["response"].get("data"), "响应数据")
attach_text(i["request"].get("header"), "请求头")
attach_text(i["response"].get("header"), "响应头")
Mini.g_network_message_dict = {}
Mini.g_network_req_cache = {}
Mini.g_network_resp_cache = {}
Mini.g_log_message_list = []
展示效果
展示位置
报告中Tear down
部分
![c6feac1e691627e5a80b82016882b4fd.png](https://i-blog.csdnimg.cn/blog_migrate/6b53c0bdcb55df02539a6f5c65ca3517.png)
日志展示效果
![3d440182dd4b7b879d460238f8187d30.png](https://i-blog.csdnimg.cn/blog_migrate/df28c36feb0b208b2e2ab133ee969c47.png)
网络请求展示效果
![126ac9df823f7093d5a25515f54eee5c.png](https://i-blog.csdnimg.cn/blog_migrate/c3b9f2ccdb20c2ecccf5c75648a854a9.png)