Xcode iOS - 使用相同资源的多个测试失败 - 如何为多个测试使用 1 个资源?

Posted

技术标签:

【中文标题】Xcode iOS - 使用相同资源的多个测试失败 - 如何为多个测试使用 1 个资源?【英文标题】:Xcode iOS - multiple tests using same resource fail - how to use 1 resource for many tests? 【发布时间】:2017-04-20 09:24:06 【问题描述】:

我正在逐步编写一套测试,用于测试视频文件的不同功能。 (我在资源包中包含了一个测试视频。)在一个一个运行这些测试时,它们成功了。但是当从 Xcode Test Navigator 一起运行它们时,它们开始产生加载错误,例如 "The requested URL was not found on this server."(使用 AVAssetImageGenerator - 为其他文件加载操作产生类似的“找不到此 URL”消息。)

只需复制我的测试视频并为每个测试用例使用不同的文件,我就可以摆脱这些错误并让我的所有测试完美运行。我目前正在使用 NSFileManagerAVAsset 类从文件 URL 加载视频,目前我最好的猜测是测试正在并行运行,并且我的测试资源视频文件在它进入时被系统锁定由一个线程使用。

虽然我的测试资源文件夹的大小正在迅速增长,但这种每次测试一个文件的场景并不适合视频!

在多个测试中使用一个测试资源的任何好方法?

编辑:我的测试跨越不同的测试文件,并且在所有情况下我都得到了文件 URL(始终有效),例如

testVideoURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TestVideo3" withExtension:@"MOV"];

【问题讨论】:

您能否展示一个最小的代码示例 - 至少有两个测试用例一起运行时会失败,以及所有设置/拆卸方法? 【参考方案1】:

您是否尝试过创建一个辅助方法来加载文件,然后将其视为伪单例?

一些非常简单的零检查就足够了,例如:

-(VideoClass *)loadMyVideo 
    if (_myVideo == nil) 
        VideoClass *loadedVideo;
        //  load video logic here
        _myVideo = loadedVideo;
    
    return _myVideo;

我最近在自己的测试中遇到了类似的问题,这很好地导航,记住在我的 tearDown 中分配属性并在 setUp 中分配它们。

我非常怀疑测试是否并行运行,除非您明确设置它们这样做,因为默认情况下它们在主线程上同步运行。 但是,如果您对此感到担忧,那么您也可以尝试在 if 语句中使用 dispatch_once 初始化。

【讨论】:

嗯,我认为这对我的情况没有帮助 - 正如我提到的一些我正在测试的代码使用 NSFileManager,一些使用 AVAsset,这些只是获取文件 URL 并做自己的私人事情.. 另外,如果测试没有并行运行,那么我不明白为什么代码会出现第二次/第三次从其他测试单元“查找”文件 URL 的问题.. 可能与 NSFileManager 和 AVAsset 加载文件的方式有关,而不是测试的运行方式。如果他们这样做了,而且我怀疑他们很可能会使用后台请求,那么你就不走运了,除非你想为他们编写在主线程中做同样事情的类别,这可能不是一个好主意。我猜你可以加入某种信号量标记来等待这些任务完成。但是我对这两个课程的经验几乎为零,所以我不确定如何最好地从这里继续。

以上是关于Xcode iOS - 使用相同资源的多个测试失败 - 如何为多个测试使用 1 个资源?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 的 OCUnit 测试能否在 iOS 设备而不是模拟器上运行

Xcode 8 / Swift 3 中的 iOS 异步单元测试(waitForExpectations 失败)

在较旧的 iOS 模拟器上运行时 Xcode 10 测试失败 - “无法加载测试包......找不到合适的图像”

在 Xcode 升级后 Flutter iOS 构建失败错误并带有多个命令

Xcode 显示“该文档发现并修复了 4 个问题。/多个资源具有相同的名称:groupTableViewBackgroundColor。”警报

当存在多个测试类时,Xcode iOS UI 测试使用 SIGABRT 崩溃