【自动化测试】pytest 用例执行中print日志实时输出

文章讲述了如何在PyCharm中使用pytest进行WebSocket接口测试时,使`on_message`函数的日志实时打印,包括修改pytest执行参数`--capture=no`或`s`,以及利用logging模块进行更灵活的日志控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

author: jwensh
date: 20231130

pycharm 中 pytest 用例执行中 print 日志 standout 实时命令行输出

使用场景

在进行 websocket 接口进行测试的时候,希望有一个 case 是一直执行并接受接口返回的数据

def on_message(ws, message):
    message = json.loads(message)
    if message is not None and message['total'] > 0:
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"), message)


class TestWss(unittest.TestCase):

    def test_bttc_todos(self):
        websocket.enableTrace(False)
        address = "*****"
        url = "{}/test/todos/{}".format(BASE_ENV_URL, address)
        ws = websocket.WebSocketApp(url,
                                    on_open=on_open,
                                    on_message=on_message,
                                    on_error=on_error,
                                    on_close=on_close)
        ws.run_forever(dispatcher=rel)  # 这里回一直卡住不然程序停止
        rel.signal(2, rel.abort)  # Keyboard Interrupt
        rel.dispatch()

直接点击 pycharm 上测试方法左侧的执行按钮
在这里插入图片描述
是没有任何 on_message 的日志输出

在这里插入图片描述

想要 on_message 中的日志能够实时打印,可以修改 pytest 的执行参数

修改参数来达到实时输出日志的效果

  • 设置 pycharm 执行测试使用的工具
    • 第三步设置成 pytest (pytest 也是兼容 nose 和 unittest, 所以推荐 )
      在这里插入图片描述
  • 在用例用例/调试配置里设置命令的其他参数
    • --capture=no 或者 -s (pytest -h 就能看到参数)
      在这里插入图片描述

再次执行用例就能有实时日志了

  • 最后: 构建自动化测试用例时,添加简洁且饱含核心信息的日志是非常有必要的。除了添加 pytest 参数形式来展示实时日志,还可以使用 logging 模块来实现运行测试用例的实时输出。
  • 可以按自己的需求来,如果只是调试什么的,可以直接用参数
  • 如果是想要保留测试过程的重要数据,建议使用 logging
### 接口自动化测试中的统一封装请求 在接口自动化测试中,为了减少代码冗余并提升可维护性和扩展性,通常会对接口请求进行统一封装。以下是基于 Python 的 `requests` 库实现的统一请求封装示。 #### 封装设计思路 1. **支持多种 HTTP 方法**:GET、POST、PUT、DELETE 等方法应被抽象化以便于调用。 2. **参数灵活配置**:允许传入 URL、headers、payloads 或其他必要参数。 3. **错误处理机制**:捕获异常情况(如网络超时或服务器返回错误),提供友好的提示信息。 4. **日志记录功能**:便于调试和排查问题,在每次请求前后打印必要的日志信息[^1]。 #### 实现代码示 以下是一个简单的统一请求封装类: ```python import requests class HttpRequest: def __init__(self, base_url=None): self.base_url = base_url def send_request(self, method, url, headers=None, params=None, data=None, json=None, timeout=10): try: full_url = f"{self.base_url}{url}" if self.base_url else url response = requests.request( method=method, url=full_url, headers=headers, params=params, data=data, json=json, timeout=timeout ) # 打印日志信息 print(f"[Request Info] Method: {method}, URL: {response.url}") print(f"[Response Status Code]: {response.status_code}") print(f"[Response Body]: {response.text}") return response except Exception as e: print(f"Error occurred during the request: {e}") raise e ``` 此代码片段展示了如何创建一个通用的 HTTP 请求工具类[^2]。它能够接受不同的输入参数,并根据指定的方法执行对应的 HTTP 调用。 #### 使用说明 当需要发起具体类型的 API 调用时,只需实化上述类对象并通过其提供的公共方法传递所需的数据即可完成操作。如: ```python if __name__ == "__main__": http_client = HttpRequest(base_url="https://api.example.com") # 发起 GET 请求 get_response = http_client.send_request(method='GET', url='/users') # 发起 POST 请求 post_data = {"username": "test_user", "password": "secure_password"} post_response = http_client.send_request(method='POST', url='/login', json=post_data) # 处理响应数据... ``` 以上子演示了如何利用该封装后的函数分别发出获取资源列表以及提交登录表单这两种常见的场景下的 RESTful 风格的服务端交互过程[^3]。 #### 进一步优化建议 虽然上面已经展示了一个基础版本的解决方案,但在实际项目应用过程中还可以继续改进和完善: - 添加更多自定义选项比如重试策略或者代理设置等功能模块; - 结合框架特性集成到更大的生态系统当中去,像 pytest 参数化批量跑测等高级玩法都可以尝试探索一番[^4];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值