测试背景
SDK 具有上百个接口,测试场景、测试用例繁多,对于修改某个模块的代码或 SDK 上线前均需要投入大量资源(人力、时间)进行回归验证。目前 QA 资源有限,希望通过梳理 SDK 的功能,尝试使用自动化测试替代部分重复性的测试工作,提升测试效率。
SDK 整体架构
SDK 主要模块如下图所示:
SDK 数据流向如下图所示:
SDK 现有功能梳理
主要功能模块 | 信息描述 | 备注 |
---|---|---|
基础数据采集 | 通过 track 接口采集事件数据,profile_x 接口采集用户属性数据,item_x 接口采集物品属性数据 | |
事件属性 | 通过自定义属性、动态公共属性、静态共属性等方式,对部分事件或全体事件增加特定的属性 | |
用户标识 | 通过 login、logout、identify、resetAnonymousId 等接口,调整、修改用户的标识信息 | |
全埋点采集 | 通过在初始化中设置,采集 App 启动、页面浏览、元素点击、退出,Fragment 采集(初始化后设置) | |
H5 打通 | 原生 SDK 和 JS SDK 实现数据打通,JS SDK 的数据将发送到原生 SDK,由原生 SDK 统一上报 | |
可视化全埋点 | 扫码连接到 SDG 前端页面,通过圈选 App 控件/页面创建可视化全埋点事件,通过对该事件的查询,可以统计到所有点击/浏览该事件的次数或用户数 | |
App 点击分析 | 扫码连接到 SA 前端页面,展示 App 页面上原生的点击情况及热力图 | |
数据加密 | SDK 开启加密后,使用接收到后台下发的密钥对采集的数据进行加密 | |
采集控制 | SDK 请求到远程配置信息后,对部分数据的采集进行限制 | |
渠道追踪 | 用户点击到第三方链接/页面后,进入到目标 App,通过调用 SDK 的激活事件,统计进入目标 App 的用户来源 | |
数据存储与上报 | 设置采集的数据存储/上报的最大条数、时间间隔 | |
计时器 | 统计某个事件的时长 | |
推送点击采集 | 采集推送消息的点击事件 | |
页面停留时长采集 | 采集当前停留在当前页面的时长 |
自动化框架设计原则
- 代码规范
- 模块清晰明确
- 通用性强
- 可拓展、可维护
- 错误机制处理机制
- 系统日志清晰,方便调试
- 报告详尽
SDK 自动化测试框架
测试框架详细设计
初始化模块
- App 集成神策 SDK,并正确完成初始化操作,其中注意开启后续自动化测试过程中所需的配置项,例如:数据加密、页面停留时长等
- 调用 SDK 获取预置属性的接口,得到设备相关基础信息,并对该基础信息进行人工校准。该基础信息非常重要,是后续所有数据检验的预期值 *
- 校准完毕后,人工启动自动化测试服务
为什么要进行人工校准?
由于 SDK 对设备信息的获取,对于用户来说是一个黑盒操作,如果不进行数据人工数据校验,直接将该份数据作为预期值的话,就可能会出现数据校验通过,但真实情况下这个值是错误的情况。
例如:SDK 获取当前设备的操作系统是 Android,事件属性中的操作系统也是 Android,但 App 是运行在 Harmony 系统上。
测试用例模块
- 将自然语言中的测试用例转换为可执行的测试代码
- 测试用例抽象化,方便多个用例使用相同模版
- 测试用例类包含的基础信息包括:测试执行前环境准备(beforeTest)、测试执行(Test)、测试完成后环境处理(afterTest)
- 灵活强,不同测试用例均可执行
- 耦合性低,调整测试用例时只需修改业务测试用例代码
- 校验机制生效,可正常判断用例测试是否通过 *
如何进行校验 ?
神策 SDK 返回的数据,不仅包括接口的返回值,还包含无返回值的接口触发的数据。例如:getDistinctId 是有返回值的接口,需要将该返回值与预期值进行比较。
track 接口并没有返回值,但会触发事件数据,我们需要截获到触发的事件数据,与预期数据进行比较。
针对不同的测试点,我们需要在测试用例中分别进行测试代码设计,从而得到可以比较的预期值与实际值。
例如:当我们需要对计时器事件的时长需要测试,就需要手动对事件触发的起止时间进行打点,得到预期值,最后再进行预期值与实际值进行比较。
测试服务模块
- 利用反射机制,获取全量用例
- 用例增加、修改、删除后,均无需进行代码调整
- 控制测试用例执行,为不同测试用例所需环境提供逻辑支持
- 全量用例测试完成,输出测试结论
数据库模块
- 每一条测试用例的执行都需要进行持久化记录,使用数据库记录上述信息是一个绝佳的选择
- 使用 ORM (Object Relational Mapping,对象关系映射)设计的数据,可以很方便的与测试用例类对应,开发者只需像操作对象那样操作数据库,而无需编写繁琐易错的 SQL 语句
- 数据库单条数据的结构在测试用例类的基础上增加额外的信息,需要包括:用例编号(数据 ID)、执行时间、优先级、用例名称、用例描述、预期结果、实际结果、是否通过、失败原因、备注等
测试报告模块
- 自动化测试需要支持实时输出及结束后输出测试结果的功能
- 实时输出测试结果,对应于 IDE 的运行日志,可动态的展示每一条测试用例的执行情况
- 结束后输出测试结果,针对各端特性,可分别为 App 端输出整体结论(包括用例执行条数、通过率、测试结论等),更丰富的测试信息需要在网页端进行展示(读取数据库模块存储的数据)
最终效果
企微机器人推送测试报告信息:
测试报告详情:
测试代码相关信息
开源 SDK 地址:https://github.com/sensorsdata/sa-sdk-android
自动化测试代码地址:https://github.com/liuweiqiang2016/SDKTest