📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
背景介绍
目的和范围
本文旨在帮助测试工程师和开发人员理解测试可观测性的重要性,并掌握在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%免费】


被折叠的 条评论
为什么被折叠?



