3.微信小程序自动化测试pytest版-记录日志与接口

在分析自动化测试报告的时候,有时候只根据失败截图,无法看出问题原因

这时候往往需要测试人员进行手工复现/查看日志/抓包等操作

通过代码将每个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

在打开小程序时候就开启网络请求记录

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

日志展示效果

3d440182dd4b7b879d460238f8187d30.png

网络请求展示效果

126ac9df823f7093d5a25515f54eee5c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值