全链路的性能压力测试

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


背景介绍

目的和范围

本文旨在帮助测试工程师和开发人员理解测试可观测性的重要性,并掌握在Selenium测试中实现可观测性的具体方法。我们将覆盖从基础日志记录到高级分布式追踪的全套解决方案。

术语表

核心术语定义

·可观测性(Observability): 通过系统输出的外部数据推断内部状态的能力

· 测试可视化(Test Visualization): 将测试过程和结果以图形化方式呈现

· 分布式追踪(Distributed Tracing): 跟踪请求在分布式系统中的流转路径

相关概念解释

· 日志(Logging): 记录系统运行过程中的事件

· 指标(Metrics): 系统运行状态的量化测量

· 追踪(Tracing): 记录请求在系统中的完整生命周期

缩略词列表

· SUT: System Under Test (被测系统)

· CI/CD: Continuous Integration/Continuous Deployment (持续集成/持续部署)

· APM: Application Performance Monitoring (应用性能监控)

 核心概念与联系

  故事引入

  想象你是一名侦探,正在调查一起"神秘案件"——昨晚的自动化测试失败了。你面前只有一条线索:“测试失败”。这就像在黑暗的房间里找一只黑猫,没有手电筒,几乎不可能完成任务。

  测试可观测性就是给你的侦探工作提供手电筒、放大镜甚至X光机,让你能清晰地看到测试过程中发生的每一个细节:哪一步操作失败了?当时页面是什么状态?网络请求是否成功?元素定位是否准确?有了这些信息,解决问题就变得轻而易举。

核心概念解释

  核心概念一:测试可观测性

  测试可观测性就像给测试过程装上摄像头和传感器。它不仅告诉你测试是否通过,还能展示测试过程中发生了什么、为什么发生以及如何发生的。就像汽车的仪表盘,不仅显示速度,还能显示油量、发动机温度等各种信息。

 核心概念二:日志记录

  日志就像测试过程的日记本。每次测试执行时,它都会记录下关键事件:“10:00 点击登录按钮”、"10:01 验证用户名显示"等。当测试失败时,你可以翻阅这本日记,找出问题发生的确切时刻。

核心概念三:分布式追踪

  分布式追踪就像给测试过程画一张地图。在复杂的微服务架构中,一个测试操作可能涉及多个服务。追踪技术可以记录下测试请求经过了哪些服务,在每个服务中花费了多少时间,就像在地图上标记出你走过的每一条路线。

核心概念之间的关系

  测试可观测性是一个大房子,日志记录、监控指标和分布式追踪是支撑这个房子的三根柱子。日志告诉你发生了什么,指标告诉你系统的健康状况,追踪告诉你问题出在哪个环节。三者结合,才能构建完整的可观测性体系。

 日志记录和监控指标的关系

  日志记录和监控指标就像医院的病历和体检报告。日志记录详细记录了每个症状和检查结果(病历),而监控指标则是关键健康数据的定期汇总(体检报告)。两者结合才能全面了解病人的健康状况。

监控指标和分布式追踪的关系

  监控指标和分布式追踪就像天气预报和气象雷达。监控指标告诉你今天下雨了(问题发生了),而分布式追踪则像气象雷达,显示雨是从哪个方向来的,经过了哪些区域(问题的传播路径)。

核心概念原理和架构的文本示意图

  [测试执行] 

      → [日志记录系统] (记录详细事件)

      → [指标收集系统] (聚合关键指标)

      → [分布式追踪系统] (跟踪请求流程)

      → [可视化仪表盘] (综合展示所有数据)

 Mermaid 流程图

核心算法原理 & 具体操作步骤

日志记录实现原理

日志记录的核心是在测试关键节点插入日志语句。我们可以通过装饰器模式实现自动化的日志记录:​​​​​​

def log_step(func):
      def wrapper(*args, **kwargs):
          test_case = args[0]
          step_name = func.__name__.replace('_', ' ').title()
          test_case.logger.info(f"Starting step: {step_name}")
          try:
              result = func(*args, **kwargs)
              test_case.logger.info(f"Completed step: {step_name}")
              return result
          except Exception as e:
              test_case.logger.error(f"Failed step: {step_name}. Error: {str(e)}")
              raise
      return wrapper

监控指标收集原理

监控指标收集通常采用定时采样的方式。以下是收集浏览器性能指标的示例:

from selenium.webdriver import ChromeOptions
from prometheus_client import Gauge
# 定义Prometheus指标
  LOAD_TIME = Gauge('page_load_time', 'Time taken to load the page')
  MEMORY_USAGE = Gauge('browser_memory_usage', 'Browser memory usage in MB')
def collect_metrics(driver):
      # 获取页面加载时间
      load_time = driver.execute_script(
          "return performance.timing.loadEventEnd - performance.timing.navigationStart")
      LOAD_TIME.set(load_time)
      
      # 获取内存使用情况
      memory = driver.execute_script("return window.performance.memory.usedJSHeapSize")
      MEMORY_USAGE.set(memory / (1024 * 1024))  # 转换为MB

分布式追踪实现

分布式追踪通常需要集成OpenTelemetry等工具。以下是Python实现示例:​​​​​​​

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, BatchSpanProcessor
# 设置追踪提供者
  trace.set_tracer_provider(TracerProvider())
  trace.get_tracer_provider().add_span_processor(
      BatchSpanProcessor(ConsoleSpanExporter())
  )
  tracer = trace.get_tracer(__name__)
def test_with_tracing():
      with tracer.start_as_current_span("login_test") as span:
          span.set_attribute("test.module", "authentication")
          # 测试步骤...
          with tracer.start_as_current_span("enter_credentials"):
              # 输入用户名密码...
              pass

 数学模型和公式

  测试稳定性评分模型

  测试稳定性可以通过以下公式计算:

  其中:

  · Failures i是第i次运行的失败次数

  · Runs i 是第i次运行的总测试数

 性能衰减检测

  使用线性回归检测性能衰减趋势:

  其中:

·y 是性能指标(如页面加载时间)

· x 是时间序列

· m 是斜率,表示性能变化趋势

· b 是截距

  当 m显著大于0时,表示性能在逐渐变差。

项目实战:代码实际案例和详细解释说明

  开发环境搭建

  安装必要库:

  pip install selenium pytest pytest-html prometheus-client opentelemetry-api opentelemetry-sdk

配置Prometheus监控:​​​​​​​

# prometheus.yml
  scrape_configs:
    - job_name: 'selenium-tests'
      static_configs:
        - targets: ['localhost:8000']

源代码详细实现

完整的测试类示例​​​​​​​

import logging
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from opentelemetry import trace
from prometheus_client import start_http_server, Gauge
# 初始化指标
  TEST_DURATION = Gauge('test_duration_seconds', 'Duration of test execution')
  ELEMENT_FIND_TIME = Gauge('element_find_time_seconds', 'Time taken to find elements')
class TestLogin:
      @classmethod
      def setup_class(cls):
          cls.logger = logging.getLogger('selenium_tests')
          cls.logger.setLevel(logging.INFO)
          handler = logging.FileHandler('test.log')
          formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
          handler.setFormatter(formatter)
          cls.logger.addHandler(handler)
          
          # 启动Prometheus指标服务器
          start_http_server(8000)
          
          # 初始化OpenTelemetry
          trace.set_tracer_provider(trace.TracerProvider())
          cls.tracer = trace.get_tracer(__name__)
          
          cls.driver = webdriver.Chrome()
          cls.driver.implicitly_wait(10)
      
      def test_valid_login(self):
          with self.tracer.start_as_current_span("valid_login_test") as span:
              span.set_attribute("test.type", "authentication")
              self._navigate_to_login()
              self._enter_credentials("valid_user", "valid_pass")
              self._verify_successful_login()
      
      def _navigate_to_login(self):
          with self.tracer.start_as_current_span("navigate_to_login"):
              self.logger.info("Navigating to login page")
              self.driver.get("https://example.com/login")
              TEST_DURATION.set(self.driver.execute_script(
                  "return performance.timing.loadEventEnd - performance.timing.navigationStart")/1000)
      
      def _enter_credentials(self, username, password):
          with self.tracer.start_as_current_span("enter_credentials"):
              start_time = time.time()
              self.logger.info(f"Entering credentials for {username}")
              
              username_field = WebDriverWait(self.driver, 10).until(
                  EC.presence_of_element_located((By.ID, "username")))
              password_field = self.driver.find_element(By.ID, "password")
              
              username_field.send_keys(username)
              password_field.send_keys(password)
              
              ELEMENT_FIND_TIME.set(time.time() - start_time)
              self.driver.find_element(By.ID, "login-btn").click()
      
      def _verify_successful_login(self):
          with self.tracer.start_as_current_span("verify_login"):
              self.logger.info("Verifying successful login")
              WebDriverWait(self.driver, 10).until(
                  EC.presence_of_element_located((By.ID, "welcome-message")))
              welcome_text = self.driver.find_element(By.ID, "welcome-message").text
              assert "Welcome" in welcome_text
              self.logger.info("Login verification successful")
      
      @classmethod
      def teardown_class(cls):
          cls.driver.quit()

代码解读与分析

  日志记录:

  使用Python标准库logging模块配置日志记录

  每个关键操作都有相应的日志记录

  日志格式包含时间戳、日志级别和详细信息

监控指标:

  使用prometheus-client库定义和暴露指标

  TEST_DURATION记录页面加载时间

  ELEMENT_FIND_TIME记录元素定位耗时

 分布式追踪:

  使用OpenTelemetry API创建追踪span

  每个测试步骤都包裹在独立的span中

  为span设置自定义属性便于分析

测试结构:

  使用清晰的setup/teardown方法管理测试生命周期

  将测试步骤分解为私有方法提高可读性

  使用WebDriverWait实现稳健的元素定位

实际应用场景

  场景一:CI/CD流水线中的测试分析

  在持续集成环境中,可观测性数据可以帮助:

  快速定位失败原因

  识别性能回归

  比较不同构建间的测试结果

场景二:大规模测试执行监控

  当并行运行数百个测试时,可观测性系统可以:

  实时显示测试执行状态

  识别资源瓶颈

  自动标记不稳定测试

场景三:生产环境监控

  将测试可观测性与生产监控结合,可以:

  比较测试环境与生产环境的性能差异

  验证监控警报的有效性

  识别测试覆盖的盲区

 工具和资源推荐

  日志管理工具

  ELK Stack (Elasticsearch, Logstash, Kibana)

  Splunk

  Graylog

监控系统

  Prometheus + Grafana

  Datadog

  New Relic

分布式追踪系统

  Jaeger

  Zipkin

  OpenTelemetry

Selenium扩展

  Selenium Grid - 分布式测试执行

  Allure Framework - 测试报告生成

  BrowserMob Proxy - 网络流量监控

未来发展趋势与挑战

  趋势一:AI驱动的测试分析

  机器学习算法将用于:

  自动识别测试失败模式

  预测测试稳定性风险

  优化测试执行顺序

趋势二:深度与生产环境集成

  测试可观测性将与生产可观测性系统深度集成,实现:

  测试到生产的全链路追踪

  基于生产流量的测试用例生成

  真实用户行为与测试结果的对比分析

挑战一:数据量爆炸

  随着测试规模扩大,解决方案需要:

  高效的日志采样策略

  智能数据聚合算法

  成本优化的存储方案

挑战二:技术栈复杂性

  管理多种可观测性工具需要:

  统一的API和数据标准

  简化的部署方案

  跨团队协作流程

 总结:学到了什么?

  核心概念回顾

  测试可观测性:让测试过程透明化的方法论

  日志记录:详细记录测试执行过程

  监控指标:量化测试性能和稳定性

  分布式追踪:跟踪复杂系统中的测试请求流

概念关系回顾

  测试可观测性就像给测试过程装上各种传感器,日志记录提供详细的事件记录,监控指标提供健康状况的快照,分布式追踪提供请求的完整路径。三者结合,才能全面理解测试行为。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值