2017-04-20 37 views
0

我有一套测试,我正逐渐在视频文件上写测试不同的功能。 (我在我的资源包中包含一个测试视频。)逐个运行这些测试时,它们会成功。但是从Xcode的测试导航运行他们都在一起时,他们开始生产负荷的错误,如"The requested URL was not found on this server."(使用AVAssetImageGenerator - 类似的消息“无法找到该网址”是为其他文件加载操作生成的。)Xcode iOS - 使用相同资源的多个测试失败 - 如何使用1资源进行多项测试?

我可以摆脱这些错误,并通过简单地复制我的测试视频并为每个测试用例使用不同的文件,让所有测试都能够完美运行。我目前使用NSFileManagerAVAsset类从文件URL加载视频,我现在最好的猜测是测试正在并行运行,并且当测试资源视频文件被一个线程使用时被系统锁定。

这个每个测试一个文件的场景对于视频来说并不理想,因为我的测试资源文件夹正在快速增长!

跨多个测试使用一种测试资源的好方法?

编辑:我的测试中跨越不同的测试文件,我得到在所有情况下的文件URL(这始终是有效的),如

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

你能展示一个最小代码示例 - 至少有两个测试用例在一起运行时会失败,以及所有setup/teardown方法吗? – Losiowaty

回答

0

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

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

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

我最近也有类似的问题,与我自己的测试,此导航很好,在我的记忆tearDown为零,分配属性和将它们分配到setUp

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

+0

嗯不要认为这会帮助我的情况 - 正如我提到的一些我正在测试的代码使用NSFileManager,一些使用AVAsset,这些只需要文件的URL,并做自己的私人事情。 – Mete

+0

此外,如果测试没有并行运行,那么我不明白为什么代码会从其他测试单元第二次/第三次“找到”文件URL的问题。 – Mete

+0

可能与NSFileManager和AVAsset的加载方式有关该文件,而不是测试如何运行。 如果他们这样做了,而且我怀疑他们可能会这样做,并且有后台请求,那么除非您想为它们编写在主线程中执行相同操作的类别,否则您的运气并不好,这可能不是一个好主意。 我想,你可以放入某种信号标记来等待这些任务完成。但是我对这两门课几乎没有任何经验,所以我不确定如何从这里继续下去。 – royalmurder