摘要
如何为iOS应用程序的多个大型数据集获取逼真的自动化单元测试?测试越真实,就越难以进行;而使用持续集成服务器(进行测试的唯一实际方法)会使问题更加复杂。
但是人们做到了。怎么做?
我做出了许多肤浅的断言。其中任何一个可能是不正确的。纠正它们将在很大程度上回答我的问题。
项目
这是一个iOS 9应用程序,它分析在iOS设备上拍摄的大型视频文件(全分辨率、最大帧速率、典型时长为10秒)。 (如果有必要,部分分析将通过OpenCV进行。)
客户已经给我们提供了一个概念验证(在桌面上使用Python)和数百个示例文件。总共约8 GB。
我们想尽可能多地对这些文件运行单元测试。我的问题是,我们如何针对iOS目标执行自动化单元测试来处理大型数据集?
替代方案
测试越好,执行起来就越困难:
我们将从一个OS X应用程序开始,以检查正确性和相对速度。很容易将工具指向任意数量的文件。但是,x86_64
有不同的ABI,OS X有不同的API,并且iOS具有资源限制,Mac无法复制。
这会影响正确性和性能度量:您可能会进行一些在桌面上有效但在设备上无效的优化。我们最终将不得不使用Accelerate框架,该框架在两个平台上不可能执行相同的操作。
在移植到iOS之后,我们可以使用iOS模拟器,即使对于旧目标也使用i386
(因此为32位字)。 (我发现CGFloat
的精度在平台之间变化时感到兴奋。)仍然存在ABI、性能和约束问题,而且模拟器的“iOS” API通常通过到达OS X中的近似等效项。
此外,我不认为模拟设备可以打破沙箱以读取设备树之外的文件。我们必须(我是对的吗?)将测试数据复制到每个模拟设备的存储中,在路径上,每个开发人员都会有所不同,并且不能保证在Xcode的版本之间稳定。即使解决了这个问题,即使是一个大型机器也会遇到n×m GB的问题。
(我们可以将所有“存储”文件链接到共同的副本。可靠性和稳定性问题让我更加兴奋。)
最终我们必须在设备上进行测试,因为我们需要未分页的内存、文件大小的小倍数存储以及节流的ARM处理器,而这些每年都会有显著变化。这意味着可能需要通过串行方式将视频文件传输到设备。挑战设备使用数百个(或几十个)文件是不现实的,但一个足够的测试套件可能需要8个文件,足以让人感到繁琐。
我对于在系列文件中加载和卸载到连接设备中没有简单的方法感到乐观。我想我们可以拥有单独的测试目标,每个目标包含两到三个文件,存储在每个“测试”方案的应用程序数据包中。如果有更好的方法,我宁愿不这样做。
集成
更糟糕的是:测试将是一个漫长而严格的过程,每个目标设备都需要进行测试,要求我们的开发人员承担测试主机的工作不现实(每个人都使用自己的设备并且有时不在公司)。无论如何执行测试,将测试文件提交到共享存储库中也不现实(GitHub坚决拒绝)。这指向了在连续集成服务器上构建和测试。我们不必承受这种乏味,但在设备(模拟或实际)的沙盒中保持测试数据库并将其加载到其中的实际问题并没有消失。问题
我知道这是一个已解决的问题。存在针对移动设备的大文件项目。开发人员会对它们进行测试。怎么做?