Sentry JavaScript SDK测试环境配置:模拟生产环境的错误场景

Sentry JavaScript SDK测试环境配置:模拟生产环境的错误场景

【免费下载链接】sentry-javascript Official Sentry SDKs for JavaScript 【免费下载链接】sentry-javascript 项目地址: https://gitcode.com/gh_mirrors/se/sentry-javascript

测试环境架构概述

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

测试套件会自动执行以下操作:

  1. 启动测试应用服务器
  2. 执行预定义用户交互(点击按钮、导航等)
  3. 捕获并验证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('用户服务错误'));
});

性能优化配置

大型应用测试可通过以下配置减少资源消耗:

  1. 禁用未使用的集成:
Sentry.init({
  defaultIntegrations: false,
  integrations: [Sentry.HttpIntegration(), Sentry.ErrorIntegration()],
});
  1. 配置采样率降低事件数量:
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

常见问题与解决方案

事件投递失败

症状:测试事件未出现在捕获列表中
排查步骤

  1. 检查浏览器控制台是否有传输错误
  2. 验证本地仓库是否正常运行:curl http://localhost:4873/-/verdaccio
  3. 查看SDK调试日志:Sentry.init({ debug: true })

解决方案

  • 确保测试应用使用正确的DSN配置
  • 清除npm缓存:npm cache clean --force
  • 重启Verdaccio服务:docker-compose restart verdaccio

事务追踪断裂

症状:前端与后端事务未关联
排查步骤

  1. 检查请求头是否包含sentry-tracebaggage
  2. 验证跨域资源共享(CORS)配置
  3. 查看追踪传播文档确认实现正确

解决方案

  • 确保前端请求包含追踪头
  • 后端启用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

测试资源与扩展阅读

官方测试工具

扩展资源

贡献测试用例

遵循贡献指南提交新的测试场景:

  1. 创建测试应用模板:dev-packages/e2e-tests/create-test-app.sh my-new-test
  2. 添加标准化测试用例:参考标准测试应用规范
  3. 提交PR并确保所有CI检查通过

通过以上配置,测试环境能够准确模拟生产环境中的错误场景,验证Sentry JavaScript SDK的可靠性和正确性。定期更新测试用例以覆盖新功能和边缘情况,可显著提高应用在生产环境中的错误捕获率。

【免费下载链接】sentry-javascript Official Sentry SDKs for JavaScript 【免费下载链接】sentry-javascript 项目地址: https://gitcode.com/gh_mirrors/se/sentry-javascript

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值