export interface TestStep { action: string; checkpoint: string; }
export interface TestCase { id: string; title: string; level: string; automatable: boolean; manualReason?: string; moduleCode: string; moduleName: string; coveredApis: string[]; preconditions: string; testSteps: TestStep[]; expectedResult: string; postconditions: string; sourceCaseId: string; }
export interface Module { code: string; name: string; description: string; priority: string; testCases: TestCase[]; }
export const suiteDescription: string = "被测库 react-native-avoid-softinput 解决「软键盘弹出遮挡输入框」问题:监听键盘尺寸变化,按聚焦控件到窗口底边的距离把内容容器(组件路径)或 RN 根视图(模块路径)整体上移,聚焦控件在纵向 ScrollView 内且剩余可滚距离足够时改由 ScrollView 滚动承担,键盘收起时复位,并把键盘显示/隐藏/高度变化/已施加偏移四类事件抛给 JS。引入原因:表单页、聊天页、评论框等有底部输入框的 RN 应用普遍需要键盘避让,而 RN 自带方案不可控(无法自定 offset/缓动/时长、无事件可观测),故引入本库并适配到鸿蒙。鸿蒙适配形态 = 1 个 TurboModule(AvoidSoftInput,15 方法)+ 1 个 Fabric ArkTS 组件(AvoidSoftInputView,7 props / 4 事件)+ 4 个 device 事件 + 9 个 JS 侧公开入口,共 41 个契约项。上游基线 5.0.0,对齐基准为上游 Android。";
export const libraryName: string = "react-native-avoid-softinput";
export const modules: Module[] = [
{
"code": "F-01",
"name": "全局避让开关控制",
"description": "覆盖全局避让开关控制相关功能、边界条件与可观察结果。",
"priority": "P0",
"testCases": [
{
"id": "F-01-01",
"title": "验证开启避让功能后键盘弹出触发聚焦区域位移调整",
"level": "L0",
"automatable": true,
"moduleCode": "F-01",
"moduleName": "全局避让开关控制",
"coveredApis": [
"AvoidSoftInput",
"setEnabled"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-01-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-01-01 与“验证开启避让功能后键盘弹出触发聚焦区域位移调整”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-01-01】按钮,等待【状态】= done(约 12 秒;页面程序化聚焦底部输入框真实唤起软键盘并收起,共三轮:第 1 轮 setEnabled(true) 弹出到位后调用 setEnabled(false) 再收起;第 2 轮保持 false 弹收;第 3 轮 setEnabled(true) 弹收) (API: setEnabled, 参数: enabled=true/false/true)",
"checkpoint": "【状态】= done;【R1 启用到位偏移】> 0;【R1 启用期弹出帧数】> 1;【R1 禁用后收起偏移】= 0;【R2 禁用到位偏移】= 0;【R2 禁用期弹出帧数】= 0;【R3 重新启用到位偏移】> 0;【结果】= PASS;本测试点判据:键盘弹出后聚焦区域产生位移,位移量大于 0"
}
],
"expectedResult": "键盘弹出后聚焦区域产生位移,位移量大于 0",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F01-002"
},
{
"id": "F-01-02",
"title": "验证关闭避让功能后键盘弹出不再新增位移调整",
"level": "L0",
"automatable": true,
"moduleCode": "F-01",
"moduleName": "全局避让开关控制",
"coveredApis": [
"AvoidSoftInput",
"setEnabled"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-01-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-01-02 与“验证关闭避让功能后键盘弹出不再新增位移调整”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-01-02】按钮,等待【状态】= done(约 12 秒;页面程序化聚焦底部输入框真实唤起软键盘并收起,共三轮:第 1 轮 setEnabled(true) 弹出到位后调用 setEnabled(false) 再收起;第 2 轮保持 false 弹收;第 3 轮 setEnabled(true) 弹收) (API: setEnabled, 参数: enabled=true/false/true)",
"checkpoint": "【状态】= done;【R1 启用到位偏移】> 0;【R1 启用期弹出帧数】> 1;【R1 禁用后收起偏移】= 0;【R2 禁用到位偏移】= 0;【R2 禁用期弹出帧数】= 0;【R3 重新启用到位偏移】> 0;【结果】= PASS;本测试点判据:键盘弹出后聚焦区域不产生新增位移"
}
],
"expectedResult": "键盘弹出后聚焦区域不产生新增位移",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F01-002"
},
{
"id": "F-01-03",
"title": "验证关闭避让功能后已施加的位移在键盘收起时仍被正确复位",
"level": "L1",
"automatable": true,
"moduleCode": "F-01",
"moduleName": "全局避让开关控制",
"coveredApis": [
"AvoidSoftInput",
"setEnabled"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-01-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-01-03 与“验证关闭避让功能后已施加的位移在键盘收起时仍被正确复位”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-01-03】按钮,等待【状态】= done(约 12 秒;页面程序化聚焦底部输入框真实唤起软键盘并收起,共三轮:第 1 轮 setEnabled(true) 弹出到位后调用 setEnabled(false) 再收起;第 2 轮保持 false 弹收;第 3 轮 setEnabled(true) 弹收) (API: setEnabled, 参数: enabled=true/false/true)",
"checkpoint": "【状态】= done;【R1 启用到位偏移】> 0;【R1 启用期弹出帧数】> 1;【R1 禁用后收起偏移】= 0;【R2 禁用到位偏移】= 0;【R2 禁用期弹出帧数】= 0;【R3 重新启用到位偏移】> 0;【结果】= PASS;本测试点判据:键盘收起后已施加位移归零,不受启用态影响"
}
],
"expectedResult": "键盘收起后已施加位移归零,不受启用态影响",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F01-002"
}
]
},
{
"code": "F-02",
"name": "避让偏移量配置",
"description": "覆盖避让偏移量配置相关功能、边界条件与可观察结果。",
"priority": "P0",
"testCases": [
{
"id": "F-02-01",
"title": "验证设置正数附加偏移量后位移计算叠加该数值",
"level": "L0",
"automatable": true,
"moduleCode": "F-02",
"moduleName": "避让偏移量配置",
"coveredApis": [
"AvoidSoftInput",
"setAvoidOffset"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-02-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-02-01 与“验证设置正数附加偏移量后位移计算叠加该数值”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-02-01】按钮,等待【状态】= done(约 35 秒;模块路径依次执行 setAvoidOffset(0/40/-40) 三轮真实弹收,再执行 setEasing(linear/easeIn/easeOut/easeInOut/bounce) 五轮真实弹收,结束后复位 0/linear) (API: setAvoidOffset / setEasing, 参数: offset=0/40/-40;easing=linear/easeIn/easeOut/easeInOut/bounce)",
"checkpoint": "【状态】= done;【模块 avoidOffset=0 到位偏移】> 0;【模块 差值(40)】在 40±1 内;【模块 差值(-40)】在 -40±1 内;【模块 linear/easeIn/easeOut/easeInOut/bounce 四分位/中点】均有真实读数;【模块参数矩阵】= PASS;【结果】= PASS;本测试点判据:位移结果 = 基线位移 + 正偏移量"
}
],
"expectedResult": "位移结果 = 基线位移 + 正偏移量",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-004"
},
{
"id": "F-02-02",
"title": "验证附加偏移量为 0 时位移计算保持基线行为",
"level": "L0",
"automatable": true,
"moduleCode": "F-02",
"moduleName": "避让偏移量配置",
"coveredApis": [
"AvoidSoftInput",
"setAvoidOffset"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-02-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-02-02 与“验证附加偏移量为 0 时位移计算保持基线行为”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-02-02】按钮,等待【状态】= done(约 35 秒;模块路径依次执行 setAvoidOffset(0/40/-40) 三轮真实弹收,再执行 setEasing(linear/easeIn/easeOut/easeInOut/bounce) 五轮真实弹收,结束后复位 0/linear) (API: setAvoidOffset / setEasing, 参数: offset=0/40/-40;easing=linear/easeIn/easeOut/easeInOut/bounce)",
"checkpoint": "【状态】= done;【模块 avoidOffset=0 到位偏移】> 0;【模块 差值(40)】在 40±1 内;【模块 差值(-40)】在 -40±1 内;【模块 linear/easeIn/easeOut/easeInOut/bounce 四分位/中点】均有真实读数;【模块参数矩阵】= PASS;【结果】= PASS;本测试点判据:位移结果等于基线位移"
}
],
"expectedResult": "位移结果等于基线位移",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-004"
},
{
"id": "F-02-03",
"title": "验证设置负数附加偏移量后位移计算允许部分内容被遮挡",
"level": "L1",
"automatable": true,
"moduleCode": "F-02",
"moduleName": "避让偏移量配置",
"coveredApis": [
"AvoidSoftInput",
"setAvoidOffset"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-02-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-02-03 与“验证设置负数附加偏移量后位移计算允许部分内容被遮挡”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-02-03】按钮,等待【状态】= done(约 35 秒;模块路径依次执行 setAvoidOffset(0/40/-40) 三轮真实弹收,再执行 setEasing(linear/easeIn/easeOut/easeInOut/bounce) 五轮真实弹收,结束后复位 0/linear) (API: setAvoidOffset / setEasing, 参数: offset=0/40/-40;easing=linear/easeIn/easeOut/easeInOut/bounce)",
"checkpoint": "【状态】= done;【模块 avoidOffset=0 到位偏移】> 0;【模块 差值(40)】在 40±1 内;【模块 差值(-40)】在 -40±1 内;【模块 linear/easeIn/easeOut/easeInOut/bounce 四分位/中点】均有真实读数;【模块参数矩阵】= PASS;【结果】= PASS;本测试点判据:位移结果 = 基线位移 + 负偏移量,且结果小于基线位移"
}
],
"expectedResult": "位移结果 = 基线位移 + 负偏移量,且结果小于基线位移",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-004"
}
]
},
{
"code": "F-03",
"name": "缓动函数配置",
"description": "覆盖缓动函数配置相关功能、边界条件与可观察结果。",
"priority": "P1",
"testCases": [
{
"id": "F-03-01",
"title": "验证设置为 linear 缓动(默认值)后动画插值曲线符合线性特征",
"level": "L0",
"automatable": true,
"moduleCode": "F-03",
"moduleName": "缓动函数配置",
"coveredApis": [
"AvoidSoftInput",
"setEasing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-03-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-03-01 与“验证设置为 linear 缓动(默认值)后动画插值曲线符合线性特征”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-03-01】按钮,等待【状态】= done(约 35 秒;模块路径依次执行 setAvoidOffset(0/40/-40) 三轮真实弹收,再执行 setEasing(linear/easeIn/easeOut/easeInOut/bounce) 五轮真实弹收,结束后复位 0/linear) (API: setAvoidOffset / setEasing, 参数: offset=0/40/-40;easing=linear/easeIn/easeOut/easeInOut/bounce)",
"checkpoint": "【状态】= done;【模块 avoidOffset=0 到位偏移】> 0;【模块 差值(40)】在 40±1 内;【模块 差值(-40)】在 -40±1 内;【模块 linear/easeIn/easeOut/easeInOut/bounce 四分位/中点】均有真实读数;【模块参数矩阵】= PASS;【结果】= PASS;本测试点判据:位移动画速度保持恒定"
}
],
"expectedResult": "位移动画速度保持恒定",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-004"
},
{
"id": "F-03-02",
"title": "验证设置为 easeIn 缓动后动画插值曲线符合先慢后快特征",
"level": "L1",
"automatable": true,
"moduleCode": "F-03",
"moduleName": "缓动函数配置",
"coveredApis": [
"AvoidSoftInput",
"setEasing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-03-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-03-02 与“验证设置为 easeIn 缓动后动画插值曲线符合先慢后快特征”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-03-02】按钮,等待【状态】= done(约 35 秒;模块路径依次执行 setAvoidOffset(0/40/-40) 三轮真实弹收,再执行 setEasing(linear/easeIn/easeOut/easeInOut/bounce) 五轮真实弹收,结束后复位 0/linear) (API: setAvoidOffset / setEasing, 参数: offset=0/40/-40;easing=linear/easeIn/easeOut/easeInOut/bounce)",
"checkpoint": "【状态】= done;【模块 avoidOffset=0 到位偏移】> 0;【模块 差值(40)】在 40±1 内;【模块 差值(-40)】在 -40±1 内;【模块 linear/easeIn/easeOut/easeInOut/bounce 四分位/中点】均有真实读数;【模块参数矩阵】= PASS;【结果】= PASS;本测试点判据:动画起始速度低于结束速度"
}
],
"expectedResult": "动画起始速度低于结束速度",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-004"
},
{
"id": "F-03-03",
"title": "验证设置为 easeOut 缓动后动画插值曲线符合先快后慢特征",
"level": "L1",
"automatable": true,
"moduleCode": "F-03",
"moduleName": "缓动函数配置",
"coveredApis": [
"AvoidSoftInput",
"setEasing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-03-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-03-03 与“验证设置为 easeOut 缓动后动画插值曲线符合先快后慢特征”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-03-03】按钮,等待【状态】= done(约 35 秒;模块路径依次执行 setAvoidOffset(0/40/-40) 三轮真实弹收,再执行 setEasing(linear/easeIn/easeOut/easeInOut/bounce) 五轮真实弹收,结束后复位 0/linear) (API: setAvoidOffset / setEasing, 参数: offset=0/40/-40;easing=linear/easeIn/easeOut/easeInOut/bounce)",
"checkpoint": "【状态】= done;【模块 avoidOffset=0 到位偏移】> 0;【模块 差值(40)】在 40±1 内;【模块 差值(-40)】在 -40±1 内;【模块 linear/easeIn/easeOut/easeInOut/bounce 四分位/中点】均有真实读数;【模块参数矩阵】= PASS;【结果】= PASS;本测试点判据:动画起始速度高于结束速度"
}
],
"expectedResult": "动画起始速度高于结束速度",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-004"
},
{
"id": "F-03-04",
"title": "验证设置为 easeInOut 缓动后动画插值曲线符合两端渐变特征",
"level": "L1",
"automatable": true,
"moduleCode": "F-03",
"moduleName": "缓动函数配置",
"coveredApis": [
"AvoidSoftInput",
"setEasing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-03-04】直接进入详情页",
"checkpoint": "详情页标题显示 F-03-04 与“验证设置为 easeInOut 缓动后动画插值曲线符合两端渐变特征”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-03-04】按钮,等待【状态】= done(约 35 秒;模块路径依次执行 setAvoidOffset(0/40/-40) 三轮真实弹收,再执行 setEasing(linear/easeIn/easeOut/easeInOut/bounce) 五轮真实弹收,结束后复位 0/linear) (API: setAvoidOffset / setEasing, 参数: offset=0/40/-40;easing=linear/easeIn/easeOut/easeInOut/bounce)",
"checkpoint": "【状态】= done;【模块 avoidOffset=0 到位偏移】> 0;【模块 差值(40)】在 40±1 内;【模块 差值(-40)】在 -40±1 内;【模块 linear/easeIn/easeOut/easeInOut/bounce 四分位/中点】均有真实读数;【模块参数矩阵】= PASS;【结果】= PASS;本测试点判据:动画起止速度均低于中段速度"
}
],
"expectedResult": "动画起止速度均低于中段速度",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-004"
},
{
"id": "F-03-05",
"title": "验证传入未定义的缓动字符串时功能保持稳定不抛出异常",
"level": "L2",
"automatable": true,
"moduleCode": "F-03",
"moduleName": "缓动函数配置",
"coveredApis": [
"AvoidSoftInput",
"setEasing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-03-05】直接进入详情页",
"checkpoint": "详情页标题显示 F-03-05 与“验证传入未定义的缓动字符串时功能保持稳定不抛出异常”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-03-05】按钮,等待【状态】= done(约 35 秒;模块路径依次执行 setAvoidOffset(0/40/-40) 三轮真实弹收,再执行 setEasing(linear/easeIn/easeOut/easeInOut/bounce) 五轮真实弹收,结束后复位 0/linear) (API: setAvoidOffset / setEasing, 参数: offset=0/40/-40;easing=linear/easeIn/easeOut/easeInOut/bounce)",
"checkpoint": "【状态】= done;【模块 avoidOffset=0 到位偏移】> 0;【模块 差值(40)】在 40±1 内;【模块 差值(-40)】在 -40±1 内;【模块 linear/easeIn/easeOut/easeInOut/bounce 四分位/中点】均有真实读数;【模块参数矩阵】= PASS;【结果】= PASS;本测试点判据:无异常抛出,动画降级为默认缓动或按未知值静默处理"
}
],
"expectedResult": "无异常抛出,动画降级为默认缓动或按未知值静默处理",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-004"
}
]
},
{
"code": "F-04",
"name": "显示动画时序配置",
"description": "覆盖显示动画时序配置相关功能、边界条件与可观察结果。",
"priority": "P1",
"testCases": [
{
"id": "F-04-01",
"title": "验证设置显示动画延迟具体数值后上移动画按对应延迟开始",
"level": "L0",
"automatable": true,
"moduleCode": "F-04",
"moduleName": "显示动画时序配置",
"coveredApis": [
"AvoidSoftInput",
"setShowAnimationDelay",
"setShowAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-04-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-04-01 与“验证设置显示动画延迟具体数值后上移动画按对应延迟开始”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-04-01】按钮,等待【状态】= done(约 15 秒;第 1 轮保持默认完成一次真实弹收,第 2 轮 setShowAnimationDelay(500)、setShowAnimationDuration(1000)、setHideAnimationDelay(300)、setHideAnimationDuration(500) 后弹收,第 3 轮四个 setter 均不传参调用后弹收;延迟 = device shown/hidden 信号到偏移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: setShowAnimationDelay / setShowAnimationDuration / setHideAnimationDelay / setHideAnimationDuration, 参数: 设定轮 500/1000/300/500 → 复位轮四个均不传参)",
"checkpoint": "【状态】= done;【模块默认 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块默认 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【模块设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【模块复位 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块复位 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块时序矩阵】= PASS;【结果】= PASS;本测试点判据:以 device shown 信号为计时零点(不包含键盘监听 250ms 防抖),设定轮显示动画延迟实测值落在 500±120ms"
}
],
"expectedResult": "以 device shown 信号为计时零点(不包含键盘监听 250ms 防抖),设定轮显示动画延迟实测值落在 500±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-006"
},
{
"id": "F-04-02",
"title": "验证不设置显示动画延迟时按默认延迟 0ms 开始上移动画",
"level": "L1",
"automatable": true,
"moduleCode": "F-04",
"moduleName": "显示动画时序配置",
"coveredApis": [
"AvoidSoftInput",
"setShowAnimationDelay",
"setShowAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-04-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-04-02 与“验证不设置显示动画延迟时按默认延迟 0ms 开始上移动画”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-04-02】按钮,等待【状态】= done(约 15 秒;第 1 轮保持默认完成一次真实弹收,第 2 轮 setShowAnimationDelay(500)、setShowAnimationDuration(1000)、setHideAnimationDelay(300)、setHideAnimationDuration(500) 后弹收,第 3 轮四个 setter 均不传参调用后弹收;延迟 = device shown/hidden 信号到偏移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: setShowAnimationDelay / setShowAnimationDuration / setHideAnimationDelay / setHideAnimationDuration, 参数: 设定轮 500/1000/300/500 → 复位轮四个均不传参)",
"checkpoint": "【状态】= done;【模块默认 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块默认 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【模块设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【模块复位 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块复位 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块时序矩阵】= PASS;【结果】= PASS;本测试点判据:以 device shown 信号为计时零点(不包含键盘监听 250ms 防抖),默认轮与不传参复位轮显示动画延迟实测值均落在 0±120ms"
}
],
"expectedResult": "以 device shown 信号为计时零点(不包含键盘监听 250ms 防抖),默认轮与不传参复位轮显示动画延迟实测值均落在 0±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-006"
},
{
"id": "F-04-03",
"title": "验证设置显示动画时长具体数值后上移动画到位耗时随参数变化",
"level": "L0",
"automatable": true,
"moduleCode": "F-04",
"moduleName": "显示动画时序配置",
"coveredApis": [
"AvoidSoftInput",
"setShowAnimationDelay",
"setShowAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-04-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-04-03 与“验证设置显示动画时长具体数值后上移动画到位耗时随参数变化”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-04-03】按钮,等待【状态】= done(约 15 秒;第 1 轮保持默认完成一次真实弹收,第 2 轮 setShowAnimationDelay(500)、setShowAnimationDuration(1000)、setHideAnimationDelay(300)、setHideAnimationDuration(500) 后弹收,第 3 轮四个 setter 均不传参调用后弹收;延迟 = device shown/hidden 信号到偏移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: setShowAnimationDelay / setShowAnimationDuration / setHideAnimationDelay / setHideAnimationDuration, 参数: 设定轮 500/1000/300/500 → 复位轮四个均不传参)",
"checkpoint": "【状态】= done;【模块默认 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块默认 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【模块设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【模块复位 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块复位 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块时序矩阵】= PASS;【结果】= PASS;本测试点判据:从显示动画首个变化帧到末帧计时,设定轮显示动画时长实测值落在 1000±120ms"
}
],
"expectedResult": "从显示动画首个变化帧到末帧计时,设定轮显示动画时长实测值落在 1000±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-006"
},
{
"id": "F-04-04",
"title": "验证不设置显示动画时长时按默认时长 660ms 完成上移动画",
"level": "L1",
"automatable": true,
"moduleCode": "F-04",
"moduleName": "显示动画时序配置",
"coveredApis": [
"AvoidSoftInput",
"setShowAnimationDelay",
"setShowAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-04-04】直接进入详情页",
"checkpoint": "详情页标题显示 F-04-04 与“验证不设置显示动画时长时按默认时长 660ms 完成上移动画”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-04-04】按钮,等待【状态】= done(约 15 秒;第 1 轮保持默认完成一次真实弹收,第 2 轮 setShowAnimationDelay(500)、setShowAnimationDuration(1000)、setHideAnimationDelay(300)、setHideAnimationDuration(500) 后弹收,第 3 轮四个 setter 均不传参调用后弹收;延迟 = device shown/hidden 信号到偏移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: setShowAnimationDelay / setShowAnimationDuration / setHideAnimationDelay / setHideAnimationDuration, 参数: 设定轮 500/1000/300/500 → 复位轮四个均不传参)",
"checkpoint": "【状态】= done;【模块默认 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块默认 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【模块设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【模块复位 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块复位 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块时序矩阵】= PASS;【结果】= PASS;本测试点判据:从显示动画首个变化帧到末帧计时,默认轮与不传参复位轮显示动画时长实测值均落在 660±120ms"
}
],
"expectedResult": "从显示动画首个变化帧到末帧计时,默认轮与不传参复位轮显示动画时长实测值均落在 660±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-006"
}
]
},
{
"code": "F-05",
"name": "隐藏动画时序配置",
"description": "覆盖隐藏动画时序配置相关功能、边界条件与可观察结果。",
"priority": "P1",
"testCases": [
{
"id": "F-05-01",
"title": "验证设置隐藏动画延迟具体数值后复位动画按对应延迟开始",
"level": "L0",
"automatable": true,
"moduleCode": "F-05",
"moduleName": "隐藏动画时序配置",
"coveredApis": [
"setShowAnimationDelay",
"setShowAnimationDuration",
"setHideAnimationDelay",
"setHideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-05-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-05-01 与“验证设置隐藏动画延迟具体数值后复位动画按对应延迟开始”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-05-01】按钮,等待【状态】= done(约 15 秒;第 1 轮保持默认完成一次真实弹收,第 2 轮 setShowAnimationDelay(500)、setShowAnimationDuration(1000)、setHideAnimationDelay(300)、setHideAnimationDuration(500) 后弹收,第 3 轮四个 setter 均不传参调用后弹收;延迟 = device shown/hidden 信号到偏移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: setShowAnimationDelay / setShowAnimationDuration / setHideAnimationDelay / setHideAnimationDuration, 参数: 设定轮 500/1000/300/500 → 复位轮四个均不传参)",
"checkpoint": "【状态】= done;【模块默认 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块默认 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【模块设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【模块复位 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块复位 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块时序矩阵】= PASS;【结果】= PASS;本测试点判据:以 device hidden 信号为计时零点(不包含键盘监听 250ms 防抖),设定轮隐藏动画延迟实测值落在 300±120ms"
}
],
"expectedResult": "以 device hidden 信号为计时零点(不包含键盘监听 250ms 防抖),设定轮隐藏动画延迟实测值落在 300±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-006"
},
{
"id": "F-05-02",
"title": "验证不设置隐藏动画延迟时按默认延迟 0ms 开始复位动画",
"level": "L1",
"automatable": true,
"moduleCode": "F-05",
"moduleName": "隐藏动画时序配置",
"coveredApis": [
"setShowAnimationDelay",
"setShowAnimationDuration",
"setHideAnimationDelay",
"setHideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-05-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-05-02 与“验证不设置隐藏动画延迟时按默认延迟 0ms 开始复位动画”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-05-02】按钮,等待【状态】= done(约 15 秒;第 1 轮保持默认完成一次真实弹收,第 2 轮 setShowAnimationDelay(500)、setShowAnimationDuration(1000)、setHideAnimationDelay(300)、setHideAnimationDuration(500) 后弹收,第 3 轮四个 setter 均不传参调用后弹收;延迟 = device shown/hidden 信号到偏移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: setShowAnimationDelay / setShowAnimationDuration / setHideAnimationDelay / setHideAnimationDuration, 参数: 设定轮 500/1000/300/500 → 复位轮四个均不传参)",
"checkpoint": "【状态】= done;【模块默认 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块默认 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【模块设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【模块复位 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块复位 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块时序矩阵】= PASS;【结果】= PASS;本测试点判据:以 device hidden 信号为计时零点(不包含键盘监听 250ms 防抖),默认轮与不传参复位轮隐藏动画延迟实测值均落在 0±120ms"
}
],
"expectedResult": "以 device hidden 信号为计时零点(不包含键盘监听 250ms 防抖),默认轮与不传参复位轮隐藏动画延迟实测值均落在 0±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-006"
},
{
"id": "F-05-03",
"title": "验证设置隐藏动画时长具体数值后复位动画到位耗时随参数变化",
"level": "L0",
"automatable": true,
"moduleCode": "F-05",
"moduleName": "隐藏动画时序配置",
"coveredApis": [
"setShowAnimationDelay",
"setShowAnimationDuration",
"setHideAnimationDelay",
"setHideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-05-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-05-03 与“验证设置隐藏动画时长具体数值后复位动画到位耗时随参数变化”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-05-03】按钮,等待【状态】= done(约 15 秒;第 1 轮保持默认完成一次真实弹收,第 2 轮 setShowAnimationDelay(500)、setShowAnimationDuration(1000)、setHideAnimationDelay(300)、setHideAnimationDuration(500) 后弹收,第 3 轮四个 setter 均不传参调用后弹收;延迟 = device shown/hidden 信号到偏移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: setShowAnimationDelay / setShowAnimationDuration / setHideAnimationDelay / setHideAnimationDuration, 参数: 设定轮 500/1000/300/500 → 复位轮四个均不传参)",
"checkpoint": "【状态】= done;【模块默认 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块默认 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【模块设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【模块复位 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块复位 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块时序矩阵】= PASS;【结果】= PASS;本测试点判据:从隐藏动画首个变化帧到末帧计时,设定轮隐藏动画时长实测值落在 500±120ms"
}
],
"expectedResult": "从隐藏动画首个变化帧到末帧计时,设定轮隐藏动画时长实测值落在 500±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-006"
},
{
"id": "F-05-04",
"title": "验证不设置隐藏动画时长时按默认时长 220ms 完成复位动画",
"level": "L1",
"automatable": true,
"moduleCode": "F-05",
"moduleName": "隐藏动画时序配置",
"coveredApis": [
"setShowAnimationDelay",
"setShowAnimationDuration",
"setHideAnimationDelay",
"setHideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-05-04】直接进入详情页",
"checkpoint": "详情页标题显示 F-05-04 与“验证不设置隐藏动画时长时按默认时长 220ms 完成复位动画”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-05-04】按钮,等待【状态】= done(约 15 秒;第 1 轮保持默认完成一次真实弹收,第 2 轮 setShowAnimationDelay(500)、setShowAnimationDuration(1000)、setHideAnimationDelay(300)、setHideAnimationDuration(500) 后弹收,第 3 轮四个 setter 均不传参调用后弹收;延迟 = device shown/hidden 信号到偏移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: setShowAnimationDelay / setShowAnimationDuration / setHideAnimationDelay / setHideAnimationDuration, 参数: 设定轮 500/1000/300/500 → 复位轮四个均不传参)",
"checkpoint": "【状态】= done;【模块默认 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块默认 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【模块设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【模块复位 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【模块复位 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【模块时序矩阵】= PASS;【结果】= PASS;本测试点判据:从隐藏动画首个变化帧到末帧计时,默认轮与不传参复位轮隐藏动画时长实测值均落在 220±120ms"
}
],
"expectedResult": "从隐藏动画首个变化帧到末帧计时,默认轮与不传参复位轮隐藏动画时长实测值均落在 220±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-006"
}
]
},
{
"code": "F-06",
"name": "平台限定方法安全兜底",
"description": "覆盖平台限定方法安全兜底相关功能、边界条件与可观察结果。",
"priority": "P2",
"testCases": [
{
"id": "F-06-01",
"title": "验证调用平台限定的行为模拟切换方法时不触发任何原生副作用且不抛出异常",
"level": "L0",
"automatable": true,
"moduleCode": "F-06",
"moduleName": "平台限定方法安全兜底",
"coveredApis": [
"AvoidSoftInput",
"setShouldMimicIOSBehavior"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-06-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-06-01 与“验证调用平台限定的行为模拟切换方法时不触发任何原生副作用且不抛出异常”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-06-01】按钮,等待【状态】= done(约 8 秒;先完成一轮真实弹收记录基线,依次调用 setShouldMimicIOSBehavior 与五个 windowSoftInputMode 平台限定方法,再完成一轮真实弹收对比) (API: setShouldMimicIOSBehavior / setAdjustNothing / setAdjustPan / setAdjustResize / setAdjustUnspecified / setDefaultAppSoftInputMode)",
"checkpoint": "【状态】= done;【六方法调用结果】= ok;【基线到位偏移】> 0;【调用后到位偏移】> 0;【差值】= 0;【结果】= PASS;本测试点判据:调用前后避让行为无变化,无异常抛出"
}
],
"expectedResult": "调用前后避让行为无变化,无异常抛出",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-005"
},
{
"id": "F-06-02",
"title": "验证调用平台限定的输入模式调整方法时不触发任何原生副作用且不抛出异常",
"level": "L1",
"automatable": true,
"moduleCode": "F-06",
"moduleName": "平台限定方法安全兜底",
"coveredApis": [
"AvoidSoftInput",
"setAdjustNothing",
"setAdjustPan",
"setAdjustResize",
"setAdjustUnspecified",
"setDefaultAppSoftInputMode"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-06-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-06-02 与“验证调用平台限定的输入模式调整方法时不触发任何原生副作用且不抛出异常”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-06-02】按钮,等待【状态】= done(约 8 秒;先完成一轮真实弹收记录基线,依次调用 setShouldMimicIOSBehavior 与五个 windowSoftInputMode 平台限定方法,再完成一轮真实弹收对比) (API: setShouldMimicIOSBehavior / setAdjustNothing / setAdjustPan / setAdjustResize / setAdjustUnspecified / setDefaultAppSoftInputMode)",
"checkpoint": "【状态】= done;【六方法调用结果】= ok;【基线到位偏移】> 0;【调用后到位偏移】> 0;【差值】= 0;【结果】= PASS;本测试点判据:调用前后避让行为无变化,无异常抛出"
}
],
"expectedResult": "调用前后避让行为无变化,无异常抛出",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-005"
}
]
},
{
"code": "F-07",
"name": "事件订阅计数管理",
"description": "覆盖事件订阅计数管理相关功能、边界条件与可观察结果。",
"priority": "P2",
"testCases": [
{
"id": "F-07-01",
"title": "验证订阅键盘相关事件时不产生异常或崩溃",
"level": "L0",
"automatable": true,
"moduleCode": "F-07",
"moduleName": "事件订阅计数管理",
"coveredApis": [
"addListener",
"removeListeners"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-07-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-07-01 与“验证订阅键盘相关事件时不产生异常或崩溃”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-07-01】按钮,等待【状态】= done(约 8 秒;页面先调用 addListener(\"softInputShown\") 并完成一次真实弹收,再调用 removeListeners(1) 并完成第二次弹收) (API: addListener / removeListeners, 参数: eventName=\"softInputShown\" 与 count=1)",
"checkpoint": "【状态】= done;【addListener 调用结果】= ok;【removeListeners 调用结果】= ok;【softInputShown 计数】= 2;【softInputHidden 计数】= 2;【结果】= PASS;本测试点判据:订阅过程无异常抛出,应用保持响应"
}
],
"expectedResult": "订阅过程无异常抛出,应用保持响应",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-003"
},
{
"id": "F-07-02",
"title": "验证取消订阅键盘相关事件时不产生异常或崩溃",
"level": "L1",
"automatable": true,
"moduleCode": "F-07",
"moduleName": "事件订阅计数管理",
"coveredApis": [
"addListener",
"removeListeners"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-07-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-07-02 与“验证取消订阅键盘相关事件时不产生异常或崩溃”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-07-02】按钮,等待【状态】= done(约 8 秒;页面先调用 addListener(\"softInputShown\") 并完成一次真实弹收,再调用 removeListeners(1) 并完成第二次弹收) (API: addListener / removeListeners, 参数: eventName=\"softInputShown\" 与 count=1)",
"checkpoint": "【状态】= done;【addListener 调用结果】= ok;【removeListeners 调用结果】= ok;【softInputShown 计数】= 2;【softInputHidden 计数】= 2;【结果】= PASS;本测试点判据:取消订阅过程无异常抛出,应用保持响应"
}
],
"expectedResult": "取消订阅过程无异常抛出,应用保持响应",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-003"
}
]
},
{
"code": "F-08",
"name": "组件启用态位移控制",
"description": "覆盖组件启用态位移控制相关功能、边界条件与可观察结果。",
"priority": "P0",
"testCases": [
{
"id": "F-08-01",
"title": "验证组件启用态为默认值时键盘弹出对包裹内容施加位移",
"level": "L0",
"automatable": true,
"moduleCode": "F-08",
"moduleName": "组件启用态位移控制",
"coveredApis": [
"AvoidSoftInputView.enabled"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-08-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-08-01 与“验证组件启用态为默认值时键盘弹出对包裹内容施加位移”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-08-01】按钮,等待【状态】= done(约 12 秒;页面程序化聚焦底部输入框真实唤起软键盘并收起,共三轮:第 1 轮 enabled 缺省 true 弹出到位后把 enabled 切为 false 再收起;第 2 轮保持 false 弹收;第 3 轮切回 true 弹收) (API: AvoidSoftInputView.enabled, 参数: enabled=true(缺省)/false/true)",
"checkpoint": "【状态】= done;【R1 启用到位偏移】> 0;【R1 禁用后收起偏移】= 0;【R2 禁用到位偏移】= 0;【R3 重新启用到位偏移】> 0;【结果】= PASS;本测试点判据:包裹内容产生位移,位移量大于 0"
}
],
"expectedResult": "包裹内容产生位移,位移量大于 0",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F01-001"
},
{
"id": "F-08-02",
"title": "验证组件启用态关闭时键盘弹出不对包裹内容施加新增位移",
"level": "L0",
"automatable": true,
"moduleCode": "F-08",
"moduleName": "组件启用态位移控制",
"coveredApis": [
"AvoidSoftInputView.enabled"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-08-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-08-02 与“验证组件启用态关闭时键盘弹出不对包裹内容施加新增位移”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-08-02】按钮,等待【状态】= done(约 12 秒;页面程序化聚焦底部输入框真实唤起软键盘并收起,共三轮:第 1 轮 enabled 缺省 true 弹出到位后把 enabled 切为 false 再收起;第 2 轮保持 false 弹收;第 3 轮切回 true 弹收) (API: AvoidSoftInputView.enabled, 参数: enabled=true(缺省)/false/true)",
"checkpoint": "【状态】= done;【R1 启用到位偏移】> 0;【R1 禁用后收起偏移】= 0;【R2 禁用到位偏移】= 0;【R3 重新启用到位偏移】> 0;【结果】= PASS;本测试点判据:包裹内容不产生新增位移"
}
],
"expectedResult": "包裹内容不产生新增位移",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F01-001"
},
{
"id": "F-08-03",
"title": "验证组件启用态关闭时键盘收起仍能将已施加的位移正确复位",
"level": "L1",
"automatable": true,
"moduleCode": "F-08",
"moduleName": "组件启用态位移控制",
"coveredApis": [
"AvoidSoftInputView.enabled"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-08-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-08-03 与“验证组件启用态关闭时键盘收起仍能将已施加的位移正确复位”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-08-03】按钮,等待【状态】= done(约 12 秒;页面程序化聚焦底部输入框真实唤起软键盘并收起,共三轮:第 1 轮 enabled 缺省 true 弹出到位后把 enabled 切为 false 再收起;第 2 轮保持 false 弹收;第 3 轮切回 true 弹收) (API: AvoidSoftInputView.enabled, 参数: enabled=true(缺省)/false/true)",
"checkpoint": "【状态】= done;【R1 启用到位偏移】> 0;【R1 禁用后收起偏移】= 0;【R2 禁用到位偏移】= 0;【R3 重新启用到位偏移】> 0;【结果】= PASS;本测试点判据:已施加位移在键盘收起后归零"
}
],
"expectedResult": "已施加位移在键盘收起后归零",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F01-001"
}
]
},
{
"code": "F-09",
"name": "组件避让偏移量",
"description": "覆盖组件避让偏移量相关功能、边界条件与可观察结果。",
"priority": "P0",
"testCases": [
{
"id": "F-09-01",
"title": "验证避让偏移量为默认值 0 时位移计算保持基线行为",
"level": "L0",
"automatable": true,
"moduleCode": "F-09",
"moduleName": "组件避让偏移量",
"coveredApis": [
"AvoidSoftInputView.avoidOffset"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-09-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-09-01 与“验证避让偏移量为默认值 0 时位移计算保持基线行为”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-09-01】按钮,等待【状态】= done(约 12 秒;页面按 avoidOffset=0、40、-40 三档各完成一轮真实弹收,每档记录到位 appliedOffset) (API: AvoidSoftInputView.avoidOffset, 参数: avoidOffset=0/40/-40)",
"checkpoint": "【状态】= done;【avoidOffset=0 到位偏移】> 0;【avoidOffset=40 到位偏移】> 0;【avoidOffset=-40 到位偏移】> 0;【偏移量矩阵】= PASS;【结果】= PASS;本测试点判据:位移结果等于基线位移"
}
],
"expectedResult": "位移结果等于基线位移",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-001"
},
{
"id": "F-09-02",
"title": "验证避让偏移量为正值时位移计算叠加更多留空空隙",
"level": "L0",
"automatable": true,
"moduleCode": "F-09",
"moduleName": "组件避让偏移量",
"coveredApis": [
"AvoidSoftInputView.avoidOffset"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-09-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-09-02 与“验证避让偏移量为正值时位移计算叠加更多留空空隙”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-09-02】按钮,等待【状态】= done(约 12 秒;页面按 avoidOffset=0、40、-40 三档各完成一轮真实弹收,每档记录到位 appliedOffset) (API: AvoidSoftInputView.avoidOffset, 参数: avoidOffset=0/40/-40)",
"checkpoint": "【状态】= done;【avoidOffset=0 到位偏移】> 0;【avoidOffset=40 到位偏移】> 0;【avoidOffset=-40 到位偏移】> 0;【偏移量矩阵】= PASS;【结果】= PASS;本测试点判据:位移结果 = 基线位移 + 正偏移量"
}
],
"expectedResult": "位移结果 = 基线位移 + 正偏移量",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-001"
},
{
"id": "F-09-03",
"title": "验证避让偏移量为负值时位移计算允许部分内容被遮挡",
"level": "L1",
"automatable": true,
"moduleCode": "F-09",
"moduleName": "组件避让偏移量",
"coveredApis": [
"AvoidSoftInputView.avoidOffset"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-09-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-09-03 与“验证避让偏移量为负值时位移计算允许部分内容被遮挡”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-09-03】按钮,等待【状态】= done(约 12 秒;页面按 avoidOffset=0、40、-40 三档各完成一轮真实弹收,每档记录到位 appliedOffset) (API: AvoidSoftInputView.avoidOffset, 参数: avoidOffset=0/40/-40)",
"checkpoint": "【状态】= done;【avoidOffset=0 到位偏移】> 0;【avoidOffset=40 到位偏移】> 0;【avoidOffset=-40 到位偏移】> 0;【偏移量矩阵】= PASS;【结果】= PASS;本测试点判据:位移结果 = 基线位移 + 负偏移量,且结果小于基线位移"
}
],
"expectedResult": "位移结果 = 基线位移 + 负偏移量,且结果小于基线位移",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-001"
}
]
},
{
"code": "F-10",
"name": "组件缓动函数",
"description": "覆盖组件缓动函数相关功能、边界条件与可观察结果。",
"priority": "P1",
"testCases": [
{
"id": "F-10-01",
"title": "验证组件缓动函数为默认值 linear 时位移动画插值曲线符合线性特征",
"level": "L0",
"automatable": true,
"moduleCode": "F-10",
"moduleName": "组件缓动函数",
"coveredApis": [
"AvoidSoftInputView.easing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-10-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-10-01 与“验证组件缓动函数为默认值 linear 时位移动画插值曲线符合线性特征”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-10-01】按钮,等待【状态】= done(约 20 秒;页面按 easing=linear、easeIn、easeOut、easeInOut、bounce 五档各完成一轮真实弹收,每档由逐帧 appliedOffset 采样算出【四分位占比】(动画时间过 1/4 时的位移完成百分比)与【中点占比】(时间过半时的位移完成百分比)) (API: AvoidSoftInputView.easing, 参数: easing=\"linear\"/\"easeIn\"/\"easeOut\"/\"easeInOut\"/\"bounce\")",
"checkpoint": "【状态】= done;【linear 四分位/中点】包含「%」;【easeIn 四分位/中点】包含「%」;【easeOut 四分位/中点】包含「%」;【easeInOut 四分位/中点】包含「%」;【bounce 四分位/中点】包含「%」;【缓动矩阵】= PASS;【结果】= PASS;本测试点判据:位移动画速度保持恒定"
}
],
"expectedResult": "位移动画速度保持恒定",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-002"
},
{
"id": "F-10-02",
"title": "验证组件缓动函数设置为 easeIn 时位移动画插值曲线符合先慢后快特征",
"level": "L1",
"automatable": true,
"moduleCode": "F-10",
"moduleName": "组件缓动函数",
"coveredApis": [
"AvoidSoftInputView.easing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-10-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-10-02 与“验证组件缓动函数设置为 easeIn 时位移动画插值曲线符合先慢后快特征”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-10-02】按钮,等待【状态】= done(约 20 秒;页面按 easing=linear、easeIn、easeOut、easeInOut、bounce 五档各完成一轮真实弹收,每档由逐帧 appliedOffset 采样算出【四分位占比】(动画时间过 1/4 时的位移完成百分比)与【中点占比】(时间过半时的位移完成百分比)) (API: AvoidSoftInputView.easing, 参数: easing=\"linear\"/\"easeIn\"/\"easeOut\"/\"easeInOut\"/\"bounce\")",
"checkpoint": "【状态】= done;【linear 四分位/中点】包含「%」;【easeIn 四分位/中点】包含「%」;【easeOut 四分位/中点】包含「%」;【easeInOut 四分位/中点】包含「%」;【bounce 四分位/中点】包含「%」;【缓动矩阵】= PASS;【结果】= PASS;本测试点判据:动画起始速度低于结束速度"
}
],
"expectedResult": "动画起始速度低于结束速度",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-002"
},
{
"id": "F-10-03",
"title": "验证组件缓动函数设置为 easeOut 时位移动画插值曲线符合先快后慢特征",
"level": "L1",
"automatable": true,
"moduleCode": "F-10",
"moduleName": "组件缓动函数",
"coveredApis": [
"AvoidSoftInputView.easing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-10-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-10-03 与“验证组件缓动函数设置为 easeOut 时位移动画插值曲线符合先快后慢特征”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-10-03】按钮,等待【状态】= done(约 20 秒;页面按 easing=linear、easeIn、easeOut、easeInOut、bounce 五档各完成一轮真实弹收,每档由逐帧 appliedOffset 采样算出【四分位占比】(动画时间过 1/4 时的位移完成百分比)与【中点占比】(时间过半时的位移完成百分比)) (API: AvoidSoftInputView.easing, 参数: easing=\"linear\"/\"easeIn\"/\"easeOut\"/\"easeInOut\"/\"bounce\")",
"checkpoint": "【状态】= done;【linear 四分位/中点】包含「%」;【easeIn 四分位/中点】包含「%」;【easeOut 四分位/中点】包含「%」;【easeInOut 四分位/中点】包含「%」;【bounce 四分位/中点】包含「%」;【缓动矩阵】= PASS;【结果】= PASS;本测试点判据:动画起始速度高于结束速度"
}
],
"expectedResult": "动画起始速度高于结束速度",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-002"
},
{
"id": "F-10-04",
"title": "验证组件缓动函数设置为 easeInOut 时位移动画插值曲线符合两端渐变特征",
"level": "L1",
"automatable": true,
"moduleCode": "F-10",
"moduleName": "组件缓动函数",
"coveredApis": [
"AvoidSoftInputView.easing"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-10-04】直接进入详情页",
"checkpoint": "详情页标题显示 F-10-04 与“验证组件缓动函数设置为 easeInOut 时位移动画插值曲线符合两端渐变特征”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-10-04】按钮,等待【状态】= done(约 20 秒;页面按 easing=linear、easeIn、easeOut、easeInOut、bounce 五档各完成一轮真实弹收,每档由逐帧 appliedOffset 采样算出【四分位占比】(动画时间过 1/4 时的位移完成百分比)与【中点占比】(时间过半时的位移完成百分比)) (API: AvoidSoftInputView.easing, 参数: easing=\"linear\"/\"easeIn\"/\"easeOut\"/\"easeInOut\"/\"bounce\")",
"checkpoint": "【状态】= done;【linear 四分位/中点】包含「%」;【easeIn 四分位/中点】包含「%」;【easeOut 四分位/中点】包含「%」;【easeInOut 四分位/中点】包含「%」;【bounce 四分位/中点】包含「%」;【缓动矩阵】= PASS;【结果】= PASS;本测试点判据:动画起止速度均低于中段速度"
}
],
"expectedResult": "动画起止速度均低于中段速度",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-002"
}
]
},
{
"code": "F-11",
"name": "组件显示动画时序",
"description": "覆盖组件显示动画时序相关功能、边界条件与可观察结果。",
"priority": "P1",
"testCases": [
{
"id": "F-11-01",
"title": "验证组件显示动画延迟设置为具体数值时上移动画按对应延迟开始",
"level": "L0",
"automatable": true,
"moduleCode": "F-11",
"moduleName": "组件显示动画时序",
"coveredApis": [
"AvoidSoftInputView.showAnimationDelay",
"AvoidSoftInputView.showAnimationDuration",
"AvoidSoftInputView.hideAnimationDelay",
"AvoidSoftInputView.hideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-11-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-11-01 与“验证组件显示动画延迟设置为具体数值时上移动画按对应延迟开始”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-11-01】按钮,等待【状态】= done(约 10 秒;第 1 轮保持缺省值完成一次真实弹收,第 2 轮把四个 prop 设为 500/1000/300/500 再完成一次弹收;延迟 = 键盘 shown/hidden 信号到位移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: AvoidSoftInputView.showAnimationDelay / AvoidSoftInputView.showAnimationDuration / AvoidSoftInputView.hideAnimationDelay / AvoidSoftInputView.hideAnimationDuration, 参数: 缺省轮 0/660/0/220 → 设定轮 500/1000/300/500)",
"checkpoint": "【状态】= done;【缺省 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【缺省 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【时序矩阵】= PASS;【结果】= PASS;本测试点判据:以 shown 信号为计时零点(不包含键盘监听 250ms 防抖),设定轮显示动画延迟实测值落在 500±120ms"
}
],
"expectedResult": "以 shown 信号为计时零点(不包含键盘监听 250ms 防抖),设定轮显示动画延迟实测值落在 500±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-003"
},
{
"id": "F-11-02",
"title": "验证组件显示动画延迟为默认值 0 时键盘弹出后立即开始上移动画",
"level": "L1",
"automatable": true,
"moduleCode": "F-11",
"moduleName": "组件显示动画时序",
"coveredApis": [
"AvoidSoftInputView.showAnimationDelay",
"AvoidSoftInputView.showAnimationDuration",
"AvoidSoftInputView.hideAnimationDelay",
"AvoidSoftInputView.hideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-11-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-11-02 与“验证组件显示动画延迟为默认值 0 时键盘弹出后立即开始上移动画”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-11-02】按钮,等待【状态】= done(约 10 秒;第 1 轮保持缺省值完成一次真实弹收,第 2 轮把四个 prop 设为 500/1000/300/500 再完成一次弹收;延迟 = 键盘 shown/hidden 信号到位移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: AvoidSoftInputView.showAnimationDelay / AvoidSoftInputView.showAnimationDuration / AvoidSoftInputView.hideAnimationDelay / AvoidSoftInputView.hideAnimationDuration, 参数: 缺省轮 0/660/0/220 → 设定轮 500/1000/300/500)",
"checkpoint": "【状态】= done;【缺省 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【缺省 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【时序矩阵】= PASS;【结果】= PASS;本测试点判据:以 shown 信号为计时零点(不包含键盘监听 250ms 防抖),缺省轮显示动画延迟实测值落在 0±120ms"
}
],
"expectedResult": "以 shown 信号为计时零点(不包含键盘监听 250ms 防抖),缺省轮显示动画延迟实测值落在 0±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-003"
},
{
"id": "F-11-03",
"title": "验证组件显示动画时长设置为具体数值时上移动画到位耗时随参数变化",
"level": "L0",
"automatable": true,
"moduleCode": "F-11",
"moduleName": "组件显示动画时序",
"coveredApis": [
"AvoidSoftInputView.showAnimationDelay",
"AvoidSoftInputView.showAnimationDuration",
"AvoidSoftInputView.hideAnimationDelay",
"AvoidSoftInputView.hideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-11-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-11-03 与“验证组件显示动画时长设置为具体数值时上移动画到位耗时随参数变化”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-11-03】按钮,等待【状态】= done(约 10 秒;第 1 轮保持缺省值完成一次真实弹收,第 2 轮把四个 prop 设为 500/1000/300/500 再完成一次弹收;延迟 = 键盘 shown/hidden 信号到位移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: AvoidSoftInputView.showAnimationDelay / AvoidSoftInputView.showAnimationDuration / AvoidSoftInputView.hideAnimationDelay / AvoidSoftInputView.hideAnimationDuration, 参数: 缺省轮 0/660/0/220 → 设定轮 500/1000/300/500)",
"checkpoint": "【状态】= done;【缺省 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【缺省 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【时序矩阵】= PASS;【结果】= PASS;本测试点判据:从显示动画首个变化帧到末帧计时,设定轮显示动画时长实测值落在 1000±120ms"
}
],
"expectedResult": "从显示动画首个变化帧到末帧计时,设定轮显示动画时长实测值落在 1000±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-003"
},
{
"id": "F-11-04",
"title": "验证组件显示动画时长为默认值 660ms 时上移动画到位耗时符合默认时长",
"level": "L1",
"automatable": true,
"moduleCode": "F-11",
"moduleName": "组件显示动画时序",
"coveredApis": [
"AvoidSoftInputView.showAnimationDelay",
"AvoidSoftInputView.showAnimationDuration",
"AvoidSoftInputView.hideAnimationDelay",
"AvoidSoftInputView.hideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-11-04】直接进入详情页",
"checkpoint": "详情页标题显示 F-11-04 与“验证组件显示动画时长为默认值 660ms 时上移动画到位耗时符合默认时长”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-11-04】按钮,等待【状态】= done(约 10 秒;第 1 轮保持缺省值完成一次真实弹收,第 2 轮把四个 prop 设为 500/1000/300/500 再完成一次弹收;延迟 = 键盘 shown/hidden 信号到位移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: AvoidSoftInputView.showAnimationDelay / AvoidSoftInputView.showAnimationDuration / AvoidSoftInputView.hideAnimationDelay / AvoidSoftInputView.hideAnimationDuration, 参数: 缺省轮 0/660/0/220 → 设定轮 500/1000/300/500)",
"checkpoint": "【状态】= done;【缺省 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【缺省 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【时序矩阵】= PASS;【结果】= PASS;本测试点判据:从显示动画首个变化帧到末帧计时,缺省轮显示动画时长实测值落在 660±120ms"
}
],
"expectedResult": "从显示动画首个变化帧到末帧计时,缺省轮显示动画时长实测值落在 660±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-003"
}
]
},
{
"code": "F-12",
"name": "组件隐藏动画时序",
"description": "覆盖组件隐藏动画时序相关功能、边界条件与可观察结果。",
"priority": "P1",
"testCases": [
{
"id": "F-12-01",
"title": "验证组件隐藏动画延迟设置为具体数值时复位动画按对应延迟开始",
"level": "L0",
"automatable": true,
"moduleCode": "F-12",
"moduleName": "组件隐藏动画时序",
"coveredApis": [
"AvoidSoftInputView.showAnimationDelay",
"AvoidSoftInputView.showAnimationDuration",
"AvoidSoftInputView.hideAnimationDelay",
"AvoidSoftInputView.hideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-12-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-12-01 与“验证组件隐藏动画延迟设置为具体数值时复位动画按对应延迟开始”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-12-01】按钮,等待【状态】= done(约 10 秒;第 1 轮保持缺省值完成一次真实弹收,第 2 轮把四个 prop 设为 500/1000/300/500 再完成一次弹收;延迟 = 键盘 shown/hidden 信号到位移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: AvoidSoftInputView.showAnimationDelay / AvoidSoftInputView.showAnimationDuration / AvoidSoftInputView.hideAnimationDelay / AvoidSoftInputView.hideAnimationDuration, 参数: 缺省轮 0/660/0/220 → 设定轮 500/1000/300/500)",
"checkpoint": "【状态】= done;【缺省 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【缺省 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【时序矩阵】= PASS;【结果】= PASS;本测试点判据:以 hidden 信号为计时零点(不包含键盘监听 250ms 防抖),设定轮隐藏动画延迟实测值落在 300±120ms"
}
],
"expectedResult": "以 hidden 信号为计时零点(不包含键盘监听 250ms 防抖),设定轮隐藏动画延迟实测值落在 300±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-003"
},
{
"id": "F-12-02",
"title": "验证组件隐藏动画延迟为实现声明的默认值时键盘收起后按默认延迟开始复位动画",
"level": "L1",
"automatable": true,
"moduleCode": "F-12",
"moduleName": "组件隐藏动画时序",
"coveredApis": [
"AvoidSoftInputView.showAnimationDelay",
"AvoidSoftInputView.showAnimationDuration",
"AvoidSoftInputView.hideAnimationDelay",
"AvoidSoftInputView.hideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-12-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-12-02 与“验证组件隐藏动画延迟为实现声明的默认值时键盘收起后按默认延迟开始复位动画”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-12-02】按钮,等待【状态】= done(约 10 秒;第 1 轮保持缺省值完成一次真实弹收,第 2 轮把四个 prop 设为 500/1000/300/500 再完成一次弹收;延迟 = 键盘 shown/hidden 信号到位移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: AvoidSoftInputView.showAnimationDelay / AvoidSoftInputView.showAnimationDuration / AvoidSoftInputView.hideAnimationDelay / AvoidSoftInputView.hideAnimationDuration, 参数: 缺省轮 0/660/0/220 → 设定轮 500/1000/300/500)",
"checkpoint": "【状态】= done;【缺省 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【缺省 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【时序矩阵】= PASS;【结果】= PASS;本测试点判据:以 hidden 信号为计时零点(不包含键盘监听 250ms 防抖),缺省轮隐藏动画延迟实测值落在 0±120ms"
}
],
"expectedResult": "以 hidden 信号为计时零点(不包含键盘监听 250ms 防抖),缺省轮隐藏动画延迟实测值落在 0±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-003"
},
{
"id": "F-12-03",
"title": "验证组件隐藏动画时长设置为具体数值时复位动画到位耗时随参数变化",
"level": "L0",
"automatable": true,
"moduleCode": "F-12",
"moduleName": "组件隐藏动画时序",
"coveredApis": [
"AvoidSoftInputView.showAnimationDelay",
"AvoidSoftInputView.showAnimationDuration",
"AvoidSoftInputView.hideAnimationDelay",
"AvoidSoftInputView.hideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-12-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-12-03 与“验证组件隐藏动画时长设置为具体数值时复位动画到位耗时随参数变化”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-12-03】按钮,等待【状态】= done(约 10 秒;第 1 轮保持缺省值完成一次真实弹收,第 2 轮把四个 prop 设为 500/1000/300/500 再完成一次弹收;延迟 = 键盘 shown/hidden 信号到位移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: AvoidSoftInputView.showAnimationDelay / AvoidSoftInputView.showAnimationDuration / AvoidSoftInputView.hideAnimationDelay / AvoidSoftInputView.hideAnimationDuration, 参数: 缺省轮 0/660/0/220 → 设定轮 500/1000/300/500)",
"checkpoint": "【状态】= done;【缺省 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【缺省 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【时序矩阵】= PASS;【结果】= PASS;本测试点判据:从隐藏动画首个变化帧到末帧计时,设定轮隐藏动画时长实测值落在 500±120ms"
}
],
"expectedResult": "从隐藏动画首个变化帧到末帧计时,设定轮隐藏动画时长实测值落在 500±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-003"
},
{
"id": "F-12-04",
"title": "验证组件隐藏动画时长为默认值 220ms 时复位动画到位耗时符合默认时长",
"level": "L1",
"automatable": true,
"moduleCode": "F-12",
"moduleName": "组件隐藏动画时序",
"coveredApis": [
"AvoidSoftInputView.showAnimationDelay",
"AvoidSoftInputView.showAnimationDuration",
"AvoidSoftInputView.hideAnimationDelay",
"AvoidSoftInputView.hideAnimationDuration"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-12-04】直接进入详情页",
"checkpoint": "详情页标题显示 F-12-04 与“验证组件隐藏动画时长为默认值 220ms 时复位动画到位耗时符合默认时长”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-12-04】按钮,等待【状态】= done(约 10 秒;第 1 轮保持缺省值完成一次真实弹收,第 2 轮把四个 prop 设为 500/1000/300/500 再完成一次弹收;延迟 = 键盘 shown/hidden 信号到位移首个变化帧的间隔,时长 = 首个变化帧到末帧的间隔) (API: AvoidSoftInputView.showAnimationDelay / AvoidSoftInputView.showAnimationDuration / AvoidSoftInputView.hideAnimationDelay / AvoidSoftInputView.hideAnimationDuration, 参数: 缺省轮 0/660/0/220 → 设定轮 500/1000/300/500)",
"checkpoint": "【状态】= done;【缺省 show 延迟/时长 ms】的两个实测值分别落在 0±120ms / 660±120ms;【缺省 hide 延迟/时长 ms】的两个实测值分别落在 0±120ms / 220±120ms;【设定 show 延迟/时长 ms】的两个实测值分别落在 500±120ms / 1000±120ms;【设定 hide 延迟/时长 ms】的两个实测值分别落在 300±120ms / 500±120ms;【时序矩阵】= PASS;【结果】= PASS;本测试点判据:从隐藏动画首个变化帧到末帧计时,缺省轮隐藏动画时长实测值落在 220±120ms"
}
],
"expectedResult": "从隐藏动画首个变化帧到末帧计时,缺省轮隐藏动画时长实测值落在 220±120ms",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F05-003"
}
]
},
{
"code": "F-13",
"name": "键盘状态事件",
"description": "覆盖键盘状态事件相关功能、边界条件与可观察结果。",
"priority": "P0",
"testCases": [
{
"id": "F-13-01",
"title": "验证键盘从隐藏变为显示时触发显示事件并携带键盘高度数值",
"level": "L0",
"automatable": true,
"moduleCode": "F-13",
"moduleName": "键盘状态事件",
"coveredApis": [
"softInputShown",
"softInputHidden",
"softInputHeightChanged",
"softInputAppliedOffsetChanged",
"AvoidSoftInput.onSoftInputShown",
"AvoidSoftInput.onSoftInputHidden",
"AvoidSoftInput.onSoftInputHeightChange",
"AvoidSoftInput.onSoftInputAppliedOffsetChange"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-13-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-13-01 与“验证键盘从隐藏变为显示时触发显示事件并携带键盘高度数值”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-13-01】按钮,等待【状态】= done(约 5 秒;页面程序化聚焦底部输入框真实唤起软键盘、等模块偏移动画结束、收起并等复位结束) (API: AvoidSoftInput.onSoftInputShown / AvoidSoftInput.onSoftInputHidden / AvoidSoftInput.onSoftInputHeightChange / AvoidSoftInput.onSoftInputAppliedOffsetChange, 参数: listener 各自累计计数并记录载荷)",
"checkpoint": "【状态】= done;【softInputShown 计数】= 1;【softInputHidden 计数】= 1;【softInputHeightChanged 计数】> 0;【softInputAppliedOffsetChanged 计数】> 10;【收起期 appliedOffset 帧数】> 1;【softInputShown 高度】> 0;【softInputHidden 高度】= 0;【结果】= PASS;本测试点判据:事件触发且 softInputHeight 大于检测阈值"
}
],
"expectedResult": "事件触发且 softInputHeight 大于检测阈值",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-001"
},
{
"id": "F-13-02",
"title": "验证键盘从显示变为隐藏时触发隐藏事件并携带键盘高度数值",
"level": "L0",
"automatable": true,
"moduleCode": "F-13",
"moduleName": "键盘状态事件",
"coveredApis": [
"softInputShown",
"softInputHidden",
"softInputHeightChanged",
"softInputAppliedOffsetChanged",
"AvoidSoftInput.onSoftInputShown",
"AvoidSoftInput.onSoftInputHidden",
"AvoidSoftInput.onSoftInputHeightChange",
"AvoidSoftInput.onSoftInputAppliedOffsetChange"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-13-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-13-02 与“验证键盘从显示变为隐藏时触发隐藏事件并携带键盘高度数值”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-13-02】按钮,等待【状态】= done(约 5 秒;页面程序化聚焦底部输入框真实唤起软键盘、等模块偏移动画结束、收起并等复位结束) (API: AvoidSoftInput.onSoftInputShown / AvoidSoftInput.onSoftInputHidden / AvoidSoftInput.onSoftInputHeightChange / AvoidSoftInput.onSoftInputAppliedOffsetChange, 参数: listener 各自累计计数并记录载荷)",
"checkpoint": "【状态】= done;【softInputShown 计数】= 1;【softInputHidden 计数】= 1;【softInputHeightChanged 计数】> 0;【softInputAppliedOffsetChanged 计数】> 10;【收起期 appliedOffset 帧数】> 1;【softInputShown 高度】> 0;【softInputHidden 高度】= 0;【结果】= PASS;本测试点判据:事件触发且 softInputHeight 低于检测阈值"
}
],
"expectedResult": "事件触发且 softInputHeight 低于检测阈值",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-001"
},
{
"id": "F-13-03",
"title": "验证键盘高度发生变化时触发高度变化事件并携带最新高度数值",
"level": "L0",
"automatable": true,
"moduleCode": "F-13",
"moduleName": "键盘状态事件",
"coveredApis": [
"softInputShown",
"softInputHidden",
"softInputHeightChanged",
"softInputAppliedOffsetChanged",
"AvoidSoftInput.onSoftInputShown",
"AvoidSoftInput.onSoftInputHidden",
"AvoidSoftInput.onSoftInputHeightChange",
"AvoidSoftInput.onSoftInputAppliedOffsetChange"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-13-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-13-03 与“验证键盘高度发生变化时触发高度变化事件并携带最新高度数值”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-13-03】按钮,等待【状态】= done(约 5 秒;页面程序化聚焦底部输入框真实唤起软键盘、等模块偏移动画结束、收起并等复位结束) (API: AvoidSoftInput.onSoftInputShown / AvoidSoftInput.onSoftInputHidden / AvoidSoftInput.onSoftInputHeightChange / AvoidSoftInput.onSoftInputAppliedOffsetChange, 参数: listener 各自累计计数并记录载荷)",
"checkpoint": "【状态】= done;【softInputShown 计数】= 1;【softInputHidden 计数】= 1;【softInputHeightChanged 计数】> 0;【softInputAppliedOffsetChanged 计数】> 10;【收起期 appliedOffset 帧数】> 1;【softInputShown 高度】> 0;【softInputHidden 高度】= 0;【结果】= PASS;本测试点判据:事件触发且 softInputHeight 等于最新高度"
}
],
"expectedResult": "事件触发且 softInputHeight 等于最新高度",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-001"
},
{
"id": "F-13-04",
"title": "验证键盘状态在防抖窗口内多次变化时仅触发一次对应事件",
"level": "L1",
"automatable": false,
"manualReason": "页面与库真实消费点已提供系统键盘驱动、debounce前原始avoidPx及JS回抛时间轴;仍须联合审计两条时间轴,页面不得自行写死PASS。",
"moduleCode": "F-13",
"moduleName": "键盘状态事件",
"coveredApis": [
"softInputShown",
"softInputHidden",
"softInputHeightChanged",
"softInputAppliedOffsetChanged",
"AvoidSoftInput.onSoftInputShown",
"AvoidSoftInput.onSoftInputHidden",
"AvoidSoftInput.onSoftInputHeightChange",
"AvoidSoftInput.onSoftInputAppliedOffsetChange"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-13-04】直接进入详情页",
"checkpoint": "详情页标题显示 F-13-04 与“验证键盘状态在防抖窗口内多次变化时仅触发一次对应事件”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-13-04】;页面真实唤起系统键盘后发起收起请求,并在120ms后重新聚焦同一真实输入框;导出生产 SoftInputListener 的 AvoidSoftInputConsumed RAW/DISPATCH 日志,并与详情页及 AvoidSoftInputDebounced 日志中的 JS softInputHeightChanged 回抛逐时标对照",
"checkpoint": "原始高度变化次数 ≥ 2;同一 250ms 窗口内 JS softInputHeightChanged 回抛次数 = 1;无额外 softInputShown/softInputHidden 误触发;证据不足时不得判 PASS"
}
],
"expectedResult": "250ms 内多次变化只产生一次事件回抛",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F13-004"
},
{
"id": "F-13-05",
"title": "验证模块侧订阅的键盘状态变化事件与组件侧事件使用一致的语义化事件名",
"level": "L1",
"automatable": true,
"moduleCode": "F-13",
"moduleName": "键盘状态事件",
"coveredApis": [
"AvoidSoftInputView.onSoftInputShown",
"AvoidSoftInputView.onSoftInputHidden",
"AvoidSoftInputView.onSoftInputHeightChange",
"AvoidSoftInputView.onSoftInputAppliedOffsetChange",
"softInputHeightChanged",
"softInputAppliedOffsetChanged"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-13-05】直接进入详情页",
"checkpoint": "详情页标题显示 F-13-05 与“验证模块侧订阅的键盘状态变化事件与组件侧事件使用一致的语义化事件名”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-13-05】按钮,等待【状态】= done(约 5 秒;页面先调用 AvoidSoftInput.setEnabled(true) 使模块处于启用态,再程序化聚焦 AvoidSoftInputView 内的底部输入框真实唤起软键盘、等上移动画结束、收起并等复位结束,结束后 setEnabled(false)) (API: AvoidSoftInputView.onSoftInputShown / AvoidSoftInputView.onSoftInputHidden / AvoidSoftInputView.onSoftInputHeightChange / AvoidSoftInputView.onSoftInputAppliedOffsetChange / AvoidSoftInput.onSoftInputHeightChange / AvoidSoftInput.onSoftInputAppliedOffsetChange, 参数: 组件回调与 device 事件 softInputHeightChanged / softInputAppliedOffsetChanged 的回调各自累计计数)",
"checkpoint": "【状态】= done;【组件 onSoftInputShown】= 1;【模块 softInputShown】= 1;【组件 onSoftInputHidden】= 1;【模块 softInputHidden】= 1;【组件 onSoftInputHeightChange】> 0;【模块 softInputHeightChanged】> 0;【组件 onSoftInputAppliedOffsetChange】> 1;【模块 softInputAppliedOffsetChanged】= 0;【结果】= PASS;本测试点判据:事件名为 softInputShown/softInputHidden/softInputHeightChanged,不含 topXxx 前缀"
}
],
"expectedResult": "事件名为 softInputShown/softInputHidden/softInputHeightChanged,不含 topXxx 前缀",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F04-002"
}
]
},
{
"code": "F-14",
"name": "位移逐帧事件",
"description": "覆盖位移逐帧事件相关功能、边界条件与可观察结果。",
"priority": "P1",
"testCases": [
{
"id": "F-14-01",
"title": "验证键盘弹出位移动画过程中持续触发已施加偏移量变化事件",
"level": "L0",
"automatable": true,
"moduleCode": "F-14",
"moduleName": "位移逐帧事件",
"coveredApis": [
"softInputShown",
"softInputHidden",
"softInputHeightChanged",
"softInputAppliedOffsetChanged",
"AvoidSoftInput.onSoftInputShown",
"AvoidSoftInput.onSoftInputHidden",
"AvoidSoftInput.onSoftInputHeightChange",
"AvoidSoftInput.onSoftInputAppliedOffsetChange"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-14-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-14-01 与“验证键盘弹出位移动画过程中持续触发已施加偏移量变化事件”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-14-01】按钮,等待【状态】= done(约 5 秒;页面程序化聚焦底部输入框真实唤起软键盘、等模块偏移动画结束、收起并等复位结束) (API: AvoidSoftInput.onSoftInputShown / AvoidSoftInput.onSoftInputHidden / AvoidSoftInput.onSoftInputHeightChange / AvoidSoftInput.onSoftInputAppliedOffsetChange, 参数: listener 各自累计计数并记录载荷)",
"checkpoint": "【状态】= done;【softInputShown 计数】= 1;【softInputHidden 计数】= 1;【softInputHeightChanged 计数】> 0;【softInputAppliedOffsetChanged 计数】> 10;【收起期 appliedOffset 帧数】> 1;【softInputShown 高度】> 0;【softInputHidden 高度】= 0;【结果】= PASS;本测试点判据:动画过程中事件触发次数大于 1"
}
],
"expectedResult": "动画过程中事件触发次数大于 1",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-001"
},
{
"id": "F-14-02",
"title": "验证键盘收起复位动画过程中持续触发已施加偏移量变化事件",
"level": "L1",
"automatable": true,
"moduleCode": "F-14",
"moduleName": "位移逐帧事件",
"coveredApis": [
"softInputShown",
"softInputHidden",
"softInputHeightChanged",
"softInputAppliedOffsetChanged",
"AvoidSoftInput.onSoftInputShown",
"AvoidSoftInput.onSoftInputHidden",
"AvoidSoftInput.onSoftInputHeightChange",
"AvoidSoftInput.onSoftInputAppliedOffsetChange"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-14-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-14-02 与“验证键盘收起复位动画过程中持续触发已施加偏移量变化事件”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-14-02】按钮,等待【状态】= done(约 5 秒;页面程序化聚焦底部输入框真实唤起软键盘、等模块偏移动画结束、收起并等复位结束) (API: AvoidSoftInput.onSoftInputShown / AvoidSoftInput.onSoftInputHidden / AvoidSoftInput.onSoftInputHeightChange / AvoidSoftInput.onSoftInputAppliedOffsetChange, 参数: listener 各自累计计数并记录载荷)",
"checkpoint": "【状态】= done;【softInputShown 计数】= 1;【softInputHidden 计数】= 1;【softInputHeightChanged 计数】> 0;【softInputAppliedOffsetChanged 计数】> 10;【收起期 appliedOffset 帧数】> 1;【softInputShown 高度】> 0;【softInputHidden 高度】= 0;【结果】= PASS;本测试点判据:动画过程中事件触发次数大于 1"
}
],
"expectedResult": "动画过程中事件触发次数大于 1",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-001"
},
{
"id": "F-14-03",
"title": "验证已施加偏移量变化事件在动画过程中不被防抖丢弃,逐帧触发",
"level": "L2",
"automatable": true,
"moduleCode": "F-14",
"moduleName": "位移逐帧事件",
"coveredApis": [
"softInputShown",
"softInputHidden",
"softInputHeightChanged",
"softInputAppliedOffsetChanged",
"AvoidSoftInput.onSoftInputShown",
"AvoidSoftInput.onSoftInputHidden",
"AvoidSoftInput.onSoftInputHeightChange",
"AvoidSoftInput.onSoftInputAppliedOffsetChange"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-14-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-14-03 与“验证已施加偏移量变化事件在动画过程中不被防抖丢弃,逐帧触发”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-14-03】按钮,等待【状态】= done(约 5 秒;页面程序化聚焦底部输入框真实唤起软键盘、等模块偏移动画结束、收起并等复位结束) (API: AvoidSoftInput.onSoftInputShown / AvoidSoftInput.onSoftInputHidden / AvoidSoftInput.onSoftInputHeightChange / AvoidSoftInput.onSoftInputAppliedOffsetChange, 参数: listener 各自累计计数并记录载荷)",
"checkpoint": "【状态】= done;【softInputShown 计数】= 1;【softInputHidden 计数】= 1;【softInputHeightChanged 计数】> 0;【softInputAppliedOffsetChanged 计数】> 10;【收起期 appliedOffset 帧数】> 1;【softInputShown 高度】> 0;【softInputHidden 高度】= 0;【结果】= PASS;本测试点判据:事件触发频率与动画帧率量级一致,未出现 250ms 级合并"
}
],
"expectedResult": "事件触发频率与动画帧率量级一致,未出现 250ms 级合并",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-001"
}
]
},
{
"code": "F-15",
"name": "Hooks 状态归约",
"description": "覆盖Hooks 状态归约相关功能、边界条件与可观察结果。",
"priority": "P1",
"testCases": [
{
"id": "F-15-01",
"title": "验证收到高度为 0 的通知时归约状态判定键盘未显示且高度归零",
"level": "L0",
"automatable": true,
"moduleCode": "F-15",
"moduleName": "Hooks 状态归约",
"coveredApis": [
"useSoftInputShown",
"useSoftInputHidden",
"useSoftInputHeightChanged",
"useSoftInputAppliedOffsetChanged",
"useSoftInputState"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-15-01】直接进入详情页",
"checkpoint": "详情页标题显示 F-15-01 与“验证收到高度为 0 的通知时归约状态判定键盘未显示且高度归零”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-15-01】按钮,等待【状态】= done(约 5 秒;页面程序化聚焦底部输入框真实唤起软键盘、等偏移动画结束时抓拍归约状态、收起并等复位结束) (API: useSoftInputShown / useSoftInputHidden / useSoftInputHeightChanged / useSoftInputAppliedOffsetChanged / useSoftInputState, 参数: 各 hook 回调累计计数,useSoftInputState 返回值在弹出态与收起态各抓拍一次)",
"checkpoint": "【状态】= done;【useSoftInputShown 计数】= 1;【useSoftInputHidden 计数】= 1;【useSoftInputHeightChanged 计数】> 0;【useSoftInputAppliedOffsetChanged 计数】> 1;【弹出时 isSoftInputShown】= true;【弹出时 softInputHeight】> 0;【isSoftInputShown】= false;【softInputHeight】= 0;【结果】= PASS;本测试点判据:isSoftInputShown=false,softInputHeight=0"
}
],
"expectedResult": "isSoftInputShown=false,softInputHeight=0",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-002"
},
{
"id": "F-15-02",
"title": "验证键盘从未显示状态收到非零高度通知时归约状态判定键盘已显示并更新高度",
"level": "L0",
"automatable": true,
"moduleCode": "F-15",
"moduleName": "Hooks 状态归约",
"coveredApis": [
"useSoftInputShown",
"useSoftInputHidden",
"useSoftInputHeightChanged",
"useSoftInputAppliedOffsetChanged",
"useSoftInputState"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-15-02】直接进入详情页",
"checkpoint": "详情页标题显示 F-15-02 与“验证键盘从未显示状态收到非零高度通知时归约状态判定键盘已显示并更新高度”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "点击【运行 F-15-02】按钮,等待【状态】= done(约 5 秒;页面程序化聚焦底部输入框真实唤起软键盘、等偏移动画结束时抓拍归约状态、收起并等复位结束) (API: useSoftInputShown / useSoftInputHidden / useSoftInputHeightChanged / useSoftInputAppliedOffsetChanged / useSoftInputState, 参数: 各 hook 回调累计计数,useSoftInputState 返回值在弹出态与收起态各抓拍一次)",
"checkpoint": "【状态】= done;【useSoftInputShown 计数】= 1;【useSoftInputHidden 计数】= 1;【useSoftInputHeightChanged 计数】> 0;【useSoftInputAppliedOffsetChanged 计数】> 1;【弹出时 isSoftInputShown】= true;【弹出时 softInputHeight】> 0;【isSoftInputShown】= false;【softInputHeight】= 0;【结果】= PASS;本测试点判据:isSoftInputShown=true,softInputHeight 等于收到的高度"
}
],
"expectedResult": "isSoftInputShown=true,softInputHeight 等于收到的高度",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "F03-002"
},
{
"id": "F-15-03",
"title": "验证键盘已处于显示状态时收到新的非零高度通知仅更新高度值,显示状态保持不变",
"level": "L1",
"automatable": false,
"manualReason": "需在键盘保持显示时稳定制造第二个不同的非零高度(例如切换可控键盘布局或专项注入),并在两次通知后分别抓取 useSoftInputState;普通单次弹收不能证明该状态转移。",
"moduleCode": "F-15",
"moduleName": "Hooks 状态归约",
"coveredApis": [
"useSoftInputShown",
"useSoftInputHidden",
"useSoftInputHeightChanged",
"useSoftInputAppliedOffsetChanged",
"useSoftInputState"
],
"preconditions": "应用冷启动进入首页;与其他用例隔离执行;按测试信息准备本用例所需输入、权限和设备状态",
"testSteps": [
{
"action": "在首页六列用例网格点击【F-15-03】直接进入详情页",
"checkpoint": "详情页标题显示 F-15-03 与“验证键盘已处于显示状态时收到新的非零高度通知仅更新高度值,显示状态保持不变”,且可见测试信息、测试步骤、预期结果及输出/实际结果模块"
},
{
"action": "在键盘保持显示状态下,先记录第 1 个非零 softInputHeight 与 useSoftInputState,再通过可控键盘布局或专项注入产生第 2 个不同的非零高度并再次记录状态",
"checkpoint": "两次 softInputHeight 均 > 0 且数值不同;两次 isSoftInputShown 均为 true;第二次 useSoftInputState.softInputHeight 等于第二次通知值;证据不足时不得判 PASS"
}
],
"expectedResult": "isSoftInputShown 保持 true,softInputHeight 更新为新值",
"postconditions": "使用详情页返回箭头回到首页;清理本用例产生的会话、权限弹窗、输入焦点和临时状态,下一条用例冷启动执行",
"sourceCaseId": "MANUAL"
}
]
}
];
export const allCases: TestCase[] = modules.flatMap(module => module.testCases);
export const caseById: Record<string, TestCase> = Object.fromEntries(allCases.map(item => [item.id, item]));
export function findTestCase(id: string): TestCase | undefined { return caseById[id]; }