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

专栏进度: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小时无人值守流水线。

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

相关推荐
来自远方的老作者2 小时前
第10章 面向对象-10.4 继承
开发语言·python·继承·单继承·多继承·super函数
解救女汉子2 小时前
MySQL并发写入如何避免锁竞争_使用队列缓冲与批量插入优化
jvm·数据库·python
qq_342295822 小时前
HTML函数开发需要SSD吗_SSD对HTML函数开发效率影响【详解】
jvm·数据库·python
qq_432703662 小时前
Golang怎么用embed嵌入SQL文件_Golang如何将SQL迁移文件嵌入Go程序统一管理【技巧】
jvm·数据库·python
m0_640309302 小时前
如何将 sticky 元素精确定位到父容器的右上角
jvm·数据库·python
带娃的IT创业者2 小时前
深度解析 Claude Design:如何利用 Anthropic 最新设计范式构建 AI 原生应用
人工智能·python·llm·claude·应用开发·anthropic·ai原生应用
是梦终空2 小时前
计算机毕业设计271—基于python+深度学习+YOLOV7的车牌识别系统(源代码+数据库+3万字论文)
python·深度学习·opencv·yolo·毕业设计·pyqt5·车牌识别系统
m0_377618232 小时前
c++如何将双精度浮点数以科学计数法写入文件_scientific标志【详解】
jvm·数据库·python
weixin_424999362 小时前
如何检测SQL注入风险_利用模糊测试技术发现漏洞
jvm·数据库·python