🔍 MR: feat: SDK-提前合并基础base参数到缓存里面。

代码变更影响范围深度分析与回归测试指南 · 由 AI 极速推演生成

项目仓库:PwaSlotCash
分支流向h5-70055-dev-kitsdkh5-70055-dev
分析触发人:lipeifeng

🧠 回归测试专项拓扑脑图

graph TD Root[🔍 回归测试拓扑脑图] --> A[🟢 交互与渲染] Root --> B[🔵 逻辑完整性] Root --> C[🟣 性能与极值] A --> A1[页面加载与跳转] A --> A2[按钮点击与表单] B --> B1[新老用户缓存兼容] B --> B2[基础参数合并准确性] C --> C1[弱网连续上报] C --> C2[缓存清空重入] style Root fill:#ff9900,stroke:#333,stroke-width:2px,color:#fff style A fill:#28a745,stroke:#333,stroke-width:1px,color:#fff style B fill:#007bff,stroke:#333,stroke-width:1px,color:#fff style C fill:#6f42c1,stroke:#333,stroke-width:1px,color:#fff
🔍 点击全屏放大查看

📋 核心变更内容与测试边界提醒

💡 关键变动逻辑:
🚨 【高危必测区】
🛡️ 【安全豁免区】
📈 【极值边界点】

📊 风险评估级别

🟡
medium Risk
当前合并请求的整体发布风险评级

⚠️ 潜在隐患与风险点

  • 1
    [数据覆盖丢失] 旧版本缓存数据上报时,若未正确识别缺失字段,可能导致当前事件的关键信息被基础参数错误覆盖,造成数据记录不全。
  • 2
    [上报延迟卡顿] 基础参数合并逻辑前置,若处理不当可能在用户快速操作时阻塞主线程,导致页面点击响应变慢或出现短暂假死。

🗺️ 业务波及页面与反向依赖调用链

受改动波及路由入口 业务功能与波及说明 反向依赖链路 trace 路径
无显著波及入口

📋 回归测试专项用例

🎯 测试维度:交互与渲染验证

受影响模块 用例标题 前置条件 测试步骤 预期结果
全局页面 页面加载与跳转流畅度检查 网络正常,设备缓存状态未知 1. 打开首页
2. 点击导航菜单切换不同业务页面
3. 观察页面加载动画与内容展示
页面流畅加载,内容完整显示,无白屏或加载失败提示
活动页/表单页 按钮点击与表单提交反馈 进入活动页或表单页 1. 点击页面内的抽奖或提交按钮
2. 观察按钮状态变化
3. 查看弹出的结果提示
按钮点击后显示加载状态,结果弹窗正常弹出且内容准确

🎯 测试维度:业务逻辑完整性

受影响模块 用例标题 前置条件 测试步骤 预期结果
用户中心/首页 新老用户缓存数据兼容验证 使用旧版本缓存数据登录 1. 清除浏览器缓存后首次登录
2. 执行一次页面浏览操作
3. 检查后台上报记录
上报数据包含完整的基础环境信息与当前操作记录,无字段缺失
全局页面 基础环境参数合并准确性 切换不同网络环境 1. 切换手机网络为4G或WiFi
2. 触发一次表单提交
3. 核对上报数据中的网络状态与设备信息
上报数据准确反映当前网络类型与设备型号,未出现参数错乱

🎯 测试维度:性能与加载极值

受影响模块 用例标题 前置条件 测试步骤 预期结果
高频操作页 弱网环境连续操作上报 使用网络限速工具模拟3G弱网 1. 在弱网环境下快速连续点击提交按钮5次
2. 观察页面响应与提示
3. 检查最终上报的数据条数
页面未卡死,按钮有防重复点击提示,最终仅成功上报有效数据且无重复堆积
全局页面 本地缓存清空后首次进入 手动清空本地存储数据 1. 清空浏览器本地缓存
2. 重新打开应用首页
3. 连续进行3次不同页面的跳转操作
首次加载速度正常,后续跳转流畅,所有操作均被准确记录且无报错

📂 本次 MR 代码变更审阅 (GitHub 级体验)

可通过左侧文件列表快速定位跳转,右侧包含文件卡片化高亮 Diff 细节

src/Fwk/Kit/Track/EData.ts
+8 -1
@@ -4,6 +4,7 @@ import { CacheManager } from '@/Fwk/Kit/Track/CacheManager';
import KitLog from '../KitLog';
import { KitTrack } from './KitTrack';
+import { RecodeKey } from '@/Fwk/Kit/Track/TrackConst';
export class EData {
private readonly id: number;
@@ -41,7 +42,13 @@ export class EData {
this.json = new JsonData();
}
- KitTrack.MergeBase(this.json);
+ // 兼容老用户:旧缓存没有基础 base 数据时只补缺失字段,避免覆盖事件发生时的数据。
+ if (
+ !Object.prototype.hasOwnProperty.call(this.json.jObject, RecodeKey.SDK_CHANNEL_VERSION)
+ ) {
+ KitTrack.MergeBase(this.json, false);
+ }
+
return this.json;
}
src/Fwk/Kit/Track/KitEvent.ts
+7 -28
@@ -3,12 +3,10 @@
/// </summary>
/// <author>xiexingwu</author>
import { JsonData } from '@/Fwk/Kit/JsonData';
-import { RecodeKey } from '@/Fwk/Kit/Track/TrackConst';
import { CacheManager } from './CacheManager';
-
-type KitAPIStatic = typeof import('../KitAPI').default;
-const loadKitAPI = (): KitAPIStatic => (require('../KitAPI') as typeof import('../KitAPI')).default;
+import { KitTrack } from '@/Fwk/Kit/Track/KitTrack';
+import Util from '@/Master/Util';
export class KitEvent extends JsonData {
private EbKey1 = 'eb_key1';
@@ -92,32 +90,13 @@ export class KitEvent extends JsonData {
public Commit() {
if (this.isSubmitted) return;
this.isSubmitted = true;
- const KitAPI = loadKitAPI();
this.put(this.EVENT, this._name);
this.put(this.SRC, this._src);
- this.put(this.TIME_STAMP, KitAPI.GetNowMills());
- //是否为升级用户
- this.put(RecodeKey.IS_UPGRADE_USER, KitAPI.isUpdateUser ? 1 : 0);
- //用户账号
- this.put(RecodeKey.CUSTOM_USER_ID, KitAPI.kitUserId);
- //用户手机
- this.put(RecodeKey.CUSTOM_USER_MOBILE, KitAPI.kitUserMobile);
- //用户邮箱
- this.put(RecodeKey.CUSTOM_USER_EMAIL, KitAPI.kitUserEmail);
- //versionName
- this.put(RecodeKey.VERSION_NAME, KitAPI.versionName);
- //versionCode
- this.put(RecodeKey.VERSION_CODE, KitAPI.versionCode);
- //安装天数
- this.put(RecodeKey.INSTALL_DAYS, KitAPI.GetActiveDay());
- //安装小时
- this.put(RecodeKey.INSTALL_HOURS, KitAPI.GetActiveHours());
-
- //网络状态
- this.put(RecodeKey.NET, KitAPI.GetNetworkType());
- this.put(RecodeKey.VPN_USR, KitAPI.isVpnConnected() ? 1 : 0);
- // this.put(RecodeKey.MEMORY, MemoryHelper.getTotalMemory()/1024)
- // this.put(RecodeKey.USR_ABS, KitAB.getAbExperimentData()?.ToString() ?? "");
+ this.put(this.TIME_STAMP, Util.localTimeStampMill);
+
+ // 提前合并基础base参数到缓存里面
+ KitTrack.MergeBase(this);
+
CacheManager.submit(this);
// if (KitLog.IsLog){
src/Fwk/Kit/Track/KitTrack.ts
+52 -17
@@ -45,6 +45,10 @@ export class KitTrack {
private static baseJson: JsonData;
+ private static EnsureBaseJson() {
+ if (!this.baseJson) this.InitBaseJson();
+ }
+
private static InitBaseJson() {
this.baseJson = new JsonData();
//sdk的版本号
@@ -83,30 +87,61 @@ export class KitTrack {
this.baseJson.put(RecodeKey.h5_clarity_id, KitAPI.h5ClarityId);
}
- static MergeBase(json: JsonData) {
+ static MergeBase(json: JsonData, overwrite = true) {
+ this.EnsureBaseJson();
+ const putBase = (key: string, value: number | boolean | string | JsonData | null) => {
+ if (
+ overwrite ||
+ json.jObject[key] === undefined ||
+ json.jObject[key] === null ||
+ json.jObject[key] === ''
+ ) {
+ json.put(key, value);
+ }
+ };
+
// 遍历 obj2 的所有键值对并添加到 obj1
const keys = Object.keys(this.baseJson.jObject);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
- json.put(key, this.baseJson.jObject[key]);
+ putBase(key, this.baseJson.jObject[key]);
}
// if (KitAPI.IS_IOS) json.put(RecodeKey.IFA, KitAPI.ADID);
- json.put(RecodeKey.GOOGLE_AID, KitAPI.ADID);
- json.put(RecodeKey.TP_DEVICE_ID, KitAPI.GetSmID());
- json.put(RecodeKey.MEDIA_SOURCE, KitAdjust.GetDistributor(false));
- json.put(RecodeKey.CAMPAIGN, KitAdjust.GetSecondDistributor());
- json.put(RecodeKey.ADSET_ADSET_ID, KitAdjust.GetCreative());
- json.put(RecodeKey.ADGROUP_NAME, KitAdjust.GetAdGroup());
- json.put(RecodeKey.h5_is_pwa, KitAPI.GetIsPWA);
- json.put(RecodeKey.h5_ua_parser, KitAPI.GetUaParser);
- json.put(RecodeKey.h5_os, KitAPI.h5Os);
- json.put(RecodeKey.h5_os_version, KitAPI.h5OsVersion);
- json.put(RecodeKey.h5_device, KitAPI.h5Device);
- json.put(RecodeKey.h5_browser, KitAPI.h5Browser);
- json.put(RecodeKey.h5_browser_version, KitAPI.h5BrowserVersion);
- json.put(RecodeKey.h5_clarity_id, KitAPI.h5ClarityId);
-
+ putBase(RecodeKey.GOOGLE_AID, KitAPI.ADID);
+ putBase(RecodeKey.TP_DEVICE_ID, KitAPI.GetSmID());
+ putBase(RecodeKey.MEDIA_SOURCE, KitAdjust.GetDistributor(false));
+ putBase(RecodeKey.CAMPAIGN, KitAdjust.GetSecondDistributor());
+ putBase(RecodeKey.ADSET_ADSET_ID, KitAdjust.GetCreative());
+ putBase(RecodeKey.ADGROUP_NAME, KitAdjust.GetAdGroup());
+ putBase(RecodeKey.h5_is_pwa, KitAPI.GetIsPWA);
+ putBase(RecodeKey.h5_ua_parser, KitAPI.GetUaParser);
+ putBase(RecodeKey.h5_os, KitAPI.h5Os);
+ putBase(RecodeKey.h5_os_version, KitAPI.h5OsVersion);
+ putBase(RecodeKey.h5_device, KitAPI.h5Device);
+ putBase(RecodeKey.h5_browser, KitAPI.h5Browser);
+ putBase(RecodeKey.h5_browser_version, KitAPI.h5BrowserVersion);
+ putBase(RecodeKey.h5_clarity_id, KitAPI.h5ClarityId);
+
+ //是否为升级用户
+ putBase(RecodeKey.IS_UPGRADE_USER, KitAPI.isUpdateUser ? 1 : 0);
+ //用户账号
+ putBase(RecodeKey.CUSTOM_USER_ID, KitAPI.kitUserId);
+ //用户手机
+ putBase(RecodeKey.CUSTOM_USER_MOBILE, KitAPI.kitUserMobile);
+ //用户邮箱
+ putBase(RecodeKey.CUSTOM_USER_EMAIL, KitAPI.kitUserEmail);
+ //versionName
+ putBase(RecodeKey.VERSION_NAME, KitAPI.versionName);
+ //versionCode
+ putBase(RecodeKey.VERSION_CODE, KitAPI.versionCode);
+ //安装天数
+ putBase(RecodeKey.INSTALL_DAYS, KitAPI.GetActiveDay());
+ //安装小时
+ putBase(RecodeKey.INSTALL_HOURS, KitAPI.GetActiveHours());
+ //网络状态
+ putBase(RecodeKey.NET, KitAPI.GetNetworkType());
+ putBase(RecodeKey.VPN_USR, KitAPI.isVpnConnected() ? 1 : 0);
}
static TrackALive(key: string) {