Sentry JavaScript SDK测试环境配置:模拟生产环境的错误场景
测试环境架构概述
Sentry JavaScript SDK测试环境通过模拟生产环境中的错误捕获流程,验证SDK在不同场景下的表现。测试架构基于Verdaccio本地仓库实现包管理隔离,使用Docker容器化部署测试环境,并通过标准化测试用例覆盖异常捕获、事务追踪和会话管理等核心功能。
核心测试流程包含三个阶段:包构建与发布、测试应用部署、事件捕获验证。其中事件处理流程遵循事件发送规范,从hub.captureException()调用开始,经过事件规范化、会话更新和信封封装,最终通过transport.send()完成事件投递。
环境准备与依赖配置
基础环境要求
- Node.js: 18.19.1+(ES Modules项目)或18.0.0+(CommonJS项目)
- Docker: 20.10+
- 包管理器: Yarn 1.22+ 或 npm 8.0+
本地仓库搭建
测试环境使用Verdaccio作为本地npm仓库,实现测试包与生产环境的隔离。执行以下命令启动本地仓库容器:
cd dev-packages/e2e-tests
docker-compose up -d verdaccio
配置测试项目的.npmrc文件指向本地仓库:
# test-applications/.npmrc
@sentry:registry=http://127.0.0.1:4873
@sentry-internal:registry=http://127.0.0.1:4873
测试包构建
从源码构建测试包并发布到本地仓库:
# 构建所有包
yarn build:tarball
# 发布到本地仓库
yarn publish:test
发布流程通过Docker容器执行,确保与CI环境的一致性。详细步骤可参考e2e测试文档。
多场景错误模拟配置
基础异常捕获测试
创建包含按钮点击触发异常的测试页面,验证基本错误捕获功能:
<!-- test-applications/standard-frontend/src/index.html -->
<button id="exception-button">触发异常</button>
<script>
document.getElementById('exception-button').addEventListener('click', () => {
try {
throw new Error('测试异常');
} catch (e) {
Sentry.captureException(e);
}
});
</script>
配置SDK初始化参数,启用调试模式和本地事件传输:
// src/sentry.js
import * as Sentry from '@sentry/browser';
Sentry.init({
dsn: 'https://test@example.com/1',
tracesSampleRate: 1.0,
debug: true,
transport: (options) => {
return {
send: (event) => {
// 存储事件到全局变量用于验证
window.capturedEvents = window.capturedEvents || [];
window.capturedEvents.push(event);
}
};
}
});
分布式追踪测试
模拟前后端分离应用的分布式追踪场景,配置前端SDK添加追踪头:
// 前端追踪配置
Sentry.init({
integrations: [
Sentry.browserTracingIntegration({
routingInstrumentation: Sentry.vueRouterInstrumentation(router),
}),
],
tracesSampleRate: 1.0,
});
后端Node.js服务配置:
// 后端追踪配置
import * as Sentry from '@sentry/node';
Sentry.init({
dsn: 'https://test@example.com/1',
integrations: [
Sentry.httpIntegration({
tracing: true,
}),
],
tracesSampleRate: 1.0,
});
会话管理测试
验证用户会话跟踪功能,模拟页面刷新和用户交互场景:
// 会话测试脚本
Sentry.init({
autoSessionTracking: true,
sessionTrackingIntervalMillis: 5000,
});
// 模拟用户活动
setInterval(() => {
Sentry.addBreadcrumb({ message: '用户活动模拟' });
}, 3000);
会话状态通过hub.captureSession()更新,遵循会话管理流程,在页面卸载时触发hub.endSession()。
测试执行与结果验证
测试用例执行
使用Playwright运行端到端测试套件:
# 运行所有测试
yarn test:e2e
# 运行特定测试应用
yarn test:run standard-frontend
测试套件会自动执行以下操作:
- 启动测试应用服务器
- 执行预定义用户交互(点击按钮、导航等)
- 捕获并验证Sentry事件
事件数据验证
验证异常事件的基本结构:
// 事件验证脚本
function validateExceptionEvent(event) {
assert.equal(event.exception.values[0].type, 'Error');
assert.equal(event.exception.values[0].value, '测试异常');
assert.ok(event.timestamp);
assert.ok(event.event_id);
}
// 验证捕获的事件
validateExceptionEvent(window.capturedEvents[0]);
事务追踪验证需确保所有相关事件共享相同的trace_id:
// 事务验证脚本
function validateTransactionTrace(events) {
const traceIds = new Set(events.map(e => e.contexts.trace.trace_id));
assert.equal(traceIds.size, 1, '所有事务应共享相同trace_id');
}
测试报告生成
测试结果以JUnit格式输出到test-results目录,包含事件捕获成功率、性能指标和错误详情。可通过以下命令生成HTML报告:
yarn generate-test-report
高级配置与最佳实践
多客户端隔离测试
在Node.js环境中配置多客户端实例,模拟微服务架构中的独立错误跟踪:
// 多客户端配置示例
import * as Sentry from '@sentry/node';
// 默认客户端
Sentry.init({ dsn: 'https://default@example.com/1' });
// 客户端A - 用户服务
const clientA = new Sentry.NodeClient({
dsn: 'https://service-a@example.com/2',
});
// 客户端B - 订单服务
const clientB = new Sentry.NodeClient({
dsn: 'https://service-b@example.com/3',
});
// 在不同上下文中使用不同客户端
Sentry.withScope((scope) => {
scope.setClient(clientA);
Sentry.captureException(new Error('用户服务错误'));
});
性能优化配置
大型应用测试可通过以下配置减少资源消耗:
- 禁用未使用的集成:
Sentry.init({
defaultIntegrations: false,
integrations: [Sentry.HttpIntegration(), Sentry.ErrorIntegration()],
});
- 配置采样率降低事件数量:
Sentry.init({
tracesSampleRate: 0.5, // 50%的事务被采样
profilesSampleRate: 0.2, // 20%的事务记录性能剖析
});
持续集成配置
将测试环境集成到CI流程,使用GitHub Actions配置:
# .github/workflows/test.yml
jobs:
e2e-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 18.x
- name: Install dependencies
run: yarn install
- name: Start test environment
run: yarn test:e2e:ci
常见问题与解决方案
事件投递失败
症状:测试事件未出现在捕获列表中
排查步骤:
- 检查浏览器控制台是否有传输错误
- 验证本地仓库是否正常运行:
curl http://localhost:4873/-/verdaccio - 查看SDK调试日志:
Sentry.init({ debug: true })
解决方案:
- 确保测试应用使用正确的DSN配置
- 清除npm缓存:
npm cache clean --force - 重启Verdaccio服务:
docker-compose restart verdaccio
事务追踪断裂
症状:前端与后端事务未关联
排查步骤:
- 检查请求头是否包含
sentry-trace和baggage - 验证跨域资源共享(CORS)配置
- 查看追踪传播文档确认实现正确
解决方案:
- 确保前端请求包含追踪头
- 后端启用CORS允许追踪头:
// Express CORS配置
app.use(cors({
exposedHeaders: ['sentry-trace', 'baggage'],
}));
测试环境与生产环境差异
症状:测试通过但生产环境捕获异常失败
原因:环境变量、构建配置或浏览器兼容性差异
解决方案:
- 使用
.env.test和.env.production分离配置 - 配置测试环境使用生产模式构建:
// package.json
{
"scripts": {
"test:build": "NODE_ENV=production vite build"
}
}
- 在多种浏览器环境中运行测试:
yarn test:e2e --browser=all
测试资源与扩展阅读
官方测试工具
扩展资源
贡献测试用例
遵循贡献指南提交新的测试场景:
- 创建测试应用模板:
dev-packages/e2e-tests/create-test-app.sh my-new-test - 添加标准化测试用例:参考标准测试应用规范
- 提交PR并确保所有CI检查通过
通过以上配置,测试环境能够准确模拟生产环境中的错误场景,验证Sentry JavaScript SDK的可靠性和正确性。定期更新测试用例以覆盖新功能和边缘情况,可显著提高应用在生产环境中的错误捕获率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




