【工程实战】第十篇:性能监控集成 —— 自动化脚本的“副产品”:不仅仅是功能测试

专栏进度:10 / 10 (自动化实战专题 · 完结)

核心逻辑:利用 Pytest 的钩子函数(Hooks),在执行每一个功能测试用例时,同步记录接口响应耗时与服务器资源消耗。

一、 为什么要监控自动化脚本的"副产品"?

预警"性能退化":代码改动可能没产生 Bug,但产生了性能瓶颈。

定位"偶发超时":有些接口在特定数据组合下会变慢,功能测试能顺便捕捉到这些异常。

零成本性能基准:无需专门跑脚本,日常的回归测试就能沉淀出一套系统的性能趋势图。

二、 实战 1:接口响应时间监控(全自动埋点)

我们不需要修改任何测试用例,只需在 conftest.py 中利用 requests 的封装,将耗时数据写入 Allure 报告。

Python

python 复制代码
# common/request_util.py (增强版)
import time
import allure

class RequestUtil:
    def send_request(self, method, url, **kwargs):
        start_time = time.time()
        res = requests.request(method, url, **kwargs)
        end_time = time.time()
        
        # 计算耗时并计算毫秒
        duration = (end_time - start_time) * 1000
        
        # 自动将耗时数据塞进 Allure 报告的属性中
        allure.dynamic.parameter("Response Time (ms)", f"{duration:.2f}")
        
        # 如果响应超过阈值,标记一个警告
        if duration > 1000:
            print(f"⚠️ 预警:接口 {url} 响应过慢: {duration:.2f}ms")
            
        return res

三、 实战 2:服务器资源异步监控(侧信道采集)

在测试执行期间,我们可以启动一个异步线程,通过 psutil 库或调用 Prometheus 接口记录服务器状态。

Python

python 复制代码
# common/monitor_util.py
import psutil
import threading
import time

class ServerMonitor(threading.Thread):
    def __init__(self, interval=1):
        super().__init__()
        self.interval = interval
        self.stopped = False
        self.stats = []

    def run(self):
        while not self.stopped:
            cpu = psutil.cpu_percent()
            mem = psutil.virtual_memory().percent
            self.stats.append({"time": time.time(), "cpu": cpu, "mem": mem})
            time.sleep(self.interval)

    def stop(self):
        self.stopped = True
        return self.stats

# 在 conftest.py 中作为全局 Fixture 调用
@pytest.fixture(scope="session", autouse=True)
def monitor_server():
    monitor = ServerMonitor()
    monitor.start()
    yield
    stats = monitor.stop()
    # 结束后可以将统计图表附在 Allure 报告的总览页

四、 进阶:构建性能回归曲线

将每次 CI 运行后的平均响应时间存入数据库,你可以画出这样一张图:

X轴:构建版本号(Build #1, #2, #3...)

Y轴:核心链路平均响应时间

价值:如果看到曲线异常上扬,说明最近的 Commit 引入了性能缺陷。

五、 本专题总结:自动化框架的"完全体"

历经 10 篇实战,我们亲手搭建了一套具备以下能力的工厂级框架:

底层:Pytest 环境隔离与配置。

弹药:YAML 数据驱动与逻辑分离。

武器:Requests 接口封装与 Playwright UI 异步。

架构:POM 页面对象模式,实现极低维护成本。

防御:Mock 技术屏蔽外部干扰。

底线:SQL 数据库断言直击真相。

展示:Allure 深度定制的精美战报。

交付:Jenkins/GitLab CI 24小时无人值守流水线。

溢出价值:性能监控集成。

相关推荐
兵慌码乱34 分钟前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei3 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi009 小时前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn10 小时前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
金銀銅鐵1 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
cup111 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill
aqi001 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG
人工智能·python·大模型·ai编程·ai应用
金銀銅鐵1 天前
用 Python 实现 Take-Away 游戏
python·游戏