自动采集编写(iOS开发交流技术群:1.数据采集SDK是如何工作的)
优采云 发布时间: 2021-12-28 06:09自动采集编写(iOS开发交流技术群:1.数据采集SDK是如何工作的)
GrowingIO 是一个基于用户行为数据的增长平台。准确采集用户行为数据是公司业务的基石。只有及时、准确、可靠的数据采集,才能支撑上层的数据分析、用户画像、运营等服务。因此,公司一直非常重视数据采集SDK(Software Development Kit)的质量保证工作。
iOS开发与通信技术群:【563513413】(跳跃),无论你是大牛还是新手,欢迎加入,分享BAT,阿里巴巴面试题,面试经验,讨论技术,让大家交流、学习、成长!
为了满足客户的各种业务和技术需求,GrowingIO提供Web、Android、iOS、Hybrid等各种平台,各种小程序(微信、支付宝、今日头条等)、微信内嵌页面,以及React Native 、Flutter、Cordova、Weex、API Cloud、AppCan等众多开发框架SDK,这无疑给SDK测试带来了巨大的挑战。
本文主要介绍GrowingIO在iOS SDK测试中的具体实践,希望能为从事iOS测试的同学提供一些参考。
1. 数据采集SDK是如何工作的?
要测试一个软件或系统,首先要了解它的业务逻辑和技术实现。接下来我们简单的看一下数据采集SDK的工作原理。
GrowingIO的数据采集SDK支持非埋点(全埋点)数据采集和埋点数据采集,满足不同业务需求。其简单的结构如下:
当用户打开App、浏览不同页面、点击不同元素(如按钮、文本框、图片)、关闭App时,非嵌入式事件采集模块会自动采集并保存用户的具体行为手机本地存储(关于非埋点数据采集的具体实现,请关注GrowigIO的后续文章分享,这里不再详述)。
埋点事件采集类似,不同的是埋点事件是由App主动调用SDK的埋点API触发的。当然,不同事件的具体数据格式是不同的。
接下来是数据发送模块,主要负责通过HTTP API向数据接收服务上报数据。
需要注意的是,为了节省用户的数据流量和电量,发送程序不是实时上报的。它会根据设备的功率、网络类型和数据量来选择发送时序,数据在发送前会被压缩。并进行混淆处理,减少传输数据量,提高数据安全性。
当然,数据发送程序也会对数据报告中的各种数据发送失败、网络异常等错误进行处理,并采用适当的重试机制。
2. 如何测试?
通过以上结构分析可以看出,数据发送模块与核心数据采集业务关系不大,非常稳定,几乎没有变化,所以我们测试的重点主要是数据采集部分,尤其是数据采集部分无埋点。
要测试数据采集,首先需要有一个收录
各种页面和元素的Demo App,然后在不同页面之间切换,操作页面上的元素或者触发一个埋藏事件,然后检查采集的事件数据是否正确。
有两种方法可以检查事件数据。一种是通过日志打印出详细的事件数据,观察日志检查;另一种是通过抓包程序获取数据并发送,然后检查。
后者一般需要配置复杂的代理工具,数据量大,还需要考虑数据的解压和解密。更难准确定位事件数据。因此,在实际测试中一般采用前者。
上图是采集数据的日志截图。通过图中的事件数据,我们发现字段较多,有些字段可读性不高,人工检查耗时较长。
另外,SDK数据采集的主要逻辑基本不变,但每次修改都要覆盖足够的回归,避免遗漏错误。
一旦缺陷在线上被遗漏,造成的损失是极其昂贵的。即使缺陷在后续版本中修复,影响也难以消除,因为移动应用程序的升级周期难以控制。
此外,GrowingIO 数据采集 SDK 兼容 iOS 8 及以上版本。需要测试系统各个版本的兼容性,测试工作量明显。
好在SDK的业务变化很少,断言内容比较机械,特别适合自动化测试。而且回归测试的工作量巨大,使用自动化测试可以大大提高生产力和质量。
3. 选择一个测试框架
工人要想做好本职工作,首先要磨砺工具,选择合适的自动化测试框架,再进行自动化测试。选择框架时需要考虑几个方面:
目前支持iOS UI自动化测试的主要框架对比如下:
考虑影响测试框架选择的几个因素。
首先,使用的语言和框架决定了测试人员的持续学习成本。iOS SDK 测试人员对Objective-C 有高度的熟悉和掌握,不需要消耗额外的学习成本。测试和开发相同的技术堆栈。
其次,根据需要不时调整测试App程序。使用开发效率高、调试方便的测试框架,可以让我们在适应新的UI变化和新的需求时,获得更小的投入产出比。
基于以上考虑,KIF框架已经展示了它的优势,而KIF使用XCTest框架,使得iOS程序的测试过程和单测一样,可以完全复用单测持续集成过程,维护持续集成的成本相对降低;此外,KIF 是一个活跃的开源测试框架,具有良好的可扩展性和快速升级。有活跃的社区来讨论和解决使用过程中遇到的问题。
鉴于以上优势,我们选择KIF作为iOS的UI自动化测试框架。
KIF的全称是Keep it Functional,是一个建立在XCTest之上的UI测试框架,通过Accessibility定位特定的控件,然后使用私有的API来操作UI。由于它是建立在 XCTest 之上的,所以你可以完美的使用 XCode 的测试相关工具。
4. 自动化测试的实现
语言和工具
建立测试环境
要将Target实现添加到现有项目中,选择File → New → Target…菜单项,在iOS → Test中选择UI Testing Bundle模板,如下图:
点击下一步进入Target选项页面,设置测试项目的相关项
完成Target设置后,点击“Finish”按钮,创建成功。
要安装 pod,请在命令行终端中输入以下命令。
sudo gem 安装 cocoapods
修改或创建项目的pod文件Podfile。
目标'GrowingIOTest'做
pod'SDCycleScrollView','~> 1.75'
pod'MJRefresh'
pod'MBProgressHUD'
结尾
目标'GIOAutoTests' 做
pod'KIF','~> 3.5.1'
结尾
其中,新增以下一段
目标'GIOAutoTests' 做
pod'KIF','~> 3.5.1'
结尾
在项目目录下执行如下安装命令安装对应的依赖,测试项目就准备完成了。
吊舱安装
准备待测程序,在测试Demo工程中集成待测版本的数据采集SDK。
编写测试用例
测试环境搭建好后,下一步就是编写具体的测试用例。一般测试用例的主要步骤是:
准备测试环境,执行测试步骤,测试结果,断言测试结果,报告,清理测试环境
下面以SDK的unburied元素的点击事件的自动化测试用例为例,说明自动化用例的准备。
测试用例:
启动App,模拟用户滚动屏幕找到对话框按钮,然后点击对话框按钮。弹出对话框后,点击关闭按钮,验证点击事件是否发送数据,内容是否正确。
代码:
-(无效)设置{
// 一些初始化操作
}
-(void)tearDown{
// 一些结束动作
}
-(无效)testDialogBtnCheck{
/**
功能:点击对话框按钮检测点击事件,
**/
[[viewTester usingLabel:@"UIinterface"] 点击];
//添加向下滚动操作
[tester scrollViewWithAccessibilityLabel:@"采集
View" byFractionOfSizeHorizontal:0.0f vertical:10.0f];
[测试员waitForTimeInterval:1];
[[viewTester usingLabel:@"LabelAttribute"] tap];
[[viewTester usingLabel:@"ShowAlert"] 点击];
[测试员waitForTimeInterval:1];
[[viewTester usingLabel:@"Cancel"] tap];
[测试员waitForTimeInterval:3];
NSArray *clckEventArray = [MockEventQueue eventsFor:@"clck"];
//是否发送clck事件
if(clckEventArray.count>=2)
{
//判断点击事件是否正确发送
NSDictionary *chevent=[clckEventArray objectAtIndex:clckEventArray.count-1];
NSDictionary *clkchr=[NoburPoMeaProCheck ClckEventCheck:chevent];
//NSLog(@"检查结果:%@",clkchr);
XCTAssertEqual(clkchr[@"KeysCheck"][@"chres"], @"Passed");
NSLog(@"点击对话框按钮检测clck事件测试通过---Passed!");
}
别的
{
NSLog(@"对话框按钮被点击,clck事件测试失败:%@!",clckEventArray);
XCTAssertEqual(1, 0);
}
}
由于我们主要测试SDK的功能,所以测试Demo是我们自己设计的,主要涵盖了各种UI元素和事件。它的业务逻辑比大多数业务类应用都简单,没有特别的介绍。
这里介绍断言的设计。上一篇提到,我们自动化测试的重点是数据采集规则是否正确,不关心数据的存储和传输。
SDK在采集数据时,先将所有的事件加入到一个队列中,然后再保存到DB中,所以在进行测试的时候,只需要*敏*感*词*事件队列,就可以保存和检索需要的事件根据需要在受监视的事件队列中断言。点击事件发送的数据结构大致如下:
验证事件数据,首先要保证字段完整,每个字段不为空,即数据模式正确;其次,根据需要验证事件的具体字段,例如点击事件的类型t应该是clck。这些检查被封装在一个单独的Check方法中,如果检查通过,该方法返回Passed。
这里通过ClckEventCheck方法完成具体的业务验证。
执行测试用例
主要介绍如何通过命令行执行测试。
安装Command Line Tools(命令行工具包),App Store安装Xcode默认不会安装Command Line Tools,可以在命令行输入以下命令单独安装。
xcode-select --install
在使用命令行执行测试之前,还需要将项目设置为 Shared。打开产品→方案→管理方案,勾选项目是否共享,如果不是,勾选后面的复选框进行共享。
从命令行执行所有测试用例
xcodebuild -workspace Growing.xcworkspace \
-scheme GrowingIOTest 测试\
-sdk "iphonesimulator13.5" \
-destination platform='iOS Simulator',OS=13.5,name='iPhone 11'
执行单个用例
xcodebuild -workspace Growing.xcworkspace \
-scheme GrowingIOTest 测试\
-only-testing:GIOAutoTests/ClckEventsTest/test7DialogBtnCheck \
-sdk "iphonesimulator13.5" \
-destination platform='iOS Simulator',OS=13.5,name='iPhone 11'
xcodebuild 的更多使用请参考其使用说明。
人 xcodebuild
美化检测报告
xcodebuild 的输出读起来不是很直观。使用xcpretty可以解决这个问题,同时也可以完成测试报告的生成。
xcpretty 是一种高速灵活的 xcodebuild 输出格式化工具。其用法如下:
# 从命令行安装 xcpretty
gem 安装 xcpretty
命令行执行
xcodebuild -workspace Growing.xcworkspace \
-scheme GrowingIOTest 测试\
-sdk "iphonesimulator13.5" \
-destination platform='iOS Simulator',OS=13.5,name='iPhone 11' \
| xcpretty --report html
生成的测试报告如下:
默认输出 html 报告在 build/reports/tests.html
5. 覆盖率统计
在进行自动化测试时,我们通常希望获得测试覆盖率报告来衡量自动化测试的覆盖率。由于 KIF 是直接基于 XCTest 实现的,因此您可以轻松使用 Xcode 自带的覆盖率统计工具。设置如下:
Product → Scheme → Edit Scheme, Code Coverage 将需要统计覆盖的被测程序添加到Targets中。
测试完成后,可以获得覆盖率统计报告。
6. 持续集成
自动化测试的最大价值在于它可以代替人工进行更高效、更频繁的测试。因此,要充分发挥自动化测试的价值,最理想的解决方案就是在持续集成环节加入自动化测试。每当有代码更改时,都会自动执行测试并快速反馈结果。
我们使用Jenkins来监控代码仓库的变化。当有新的commit提交时,Jenkins会自动拉取最新的代码,调用命令行执行相应的自动化测试用例,采集
相应的测试报告,并将测试结果通过钉钉机器人及时通知相关开发人员和测试人员。
当测试失败时,相关人员可以第一时间收到结果并及时解决。
7. 总结
本文以iOS平台为例,系统介绍GrowingIO数据采集SDK的主要工作原理、测试方案的设计、自动化测试框架的选择以及自动化测试的实现。希望对从事SDK测试的同学有所启发。
后面我们还会分享GrowingIO用户触摸SDK的自动化测试、Android SDK的自动化测试等相关内容。请继续关注我们。