为AWS Device Farm构buildXCTest UItesting

我正在尝试将我们的iOS XCUITests设置为在AWS Device Farm上运行,但似乎无论如何构build和上载它们,testing都将无法运行。 它们在XCode中本地运行时执行并通过,但不会在AWS Device Farm上运行。

我已经设置了绝对最简单的应用程序,我可以设法隔离这个问题。 它由单个标签的单个视图和validation标签存在的UItesting组成。

以下是AWS Device Farm界面中显示的错误。

在这里输入图像说明

挖掘日志文件揭示了这一点(在“应用程序输出”日志文件中):

2016-04-03 19:07:39.842 XCTRunner[195:28521] Running tests... 2016-04-03 19:07:39.868 XCTRunner[195:28521] Unable to load configuration data from specified path ; error: The file name is invalid. 2016-04-03 19:07:39.872 XCTRunner[195:28521] Looking for test bundles in /var/mobile/Containers/Bundle/Application/883D7F70-E525-4478-9E5E-C87F72A83879/MyTestAppUITests-Runner.app/PlugIns 2016-04-03 19:07:39.875 XCTRunner[195:28521] Found test bundle at /var/mobile/Containers/Bundle/Application/883D7F70-E525-4478-9E5E-C87F72A83879/MyTestAppUITests-Runner.app/PlugIns/MyTestAppUITests.xctest 2016-04-03 19:07:39.878 XCTRunner[195:28521] Looking for configurations in /var/mobile/Containers/Bundle/Application/883D7F70-E525-4478-9E5E-C87F72A83879/MyTestAppUITests-Runner.app/PlugIns/MyTestAppUITests.xctest 2016-04-03 19:07:39.879 XCTRunner[195:28521] No configurations found, creating a default configuration that will run all tests. 2016-04-03 19:07:39.993 XCTRunner[195:28521] XCTestConfigurationHook: Using Test MyTestAppUITests/testExample 2016-04-03 19:07:39.995 XCTRunner[195:28521] XCTestConfigurationHook: Using Test MyTestAppUITests/testExample 2016-04-03 19:07:39.995 XCTRunner[195:28521] XCTestConfigurationHook: Using Test MyTestAppUITests/testExample Test Suite 'Selected tests' started at 2016-04-03 19:07:40.008 Test Suite 'MyTestAppUITests' started at 2016-04-03 19:07:40.014 Test Case '-[MyTestAppUITests testExample]' started. 2016-04-03 19:07:40.021 XCTRunner[195:28521] *** Assertion failure in -[XCUIApplication init], /Library/Caches/com.apple.xbs/Sources/XCTest_iOS/XCTest-10112/XCTestFramework/UI Testing/XCUIApplication.m:72 2016-04-03 19:07:40.022 XCTRunner[195:28521] XCTestConfigurationHook: Ignoring skipped tests 2016-04-03 19:07:40.023 XCTRunner[195:28521] XCTestConfigurationHook: Using Test MyTestAppUITests/testExample 2016-04-03 19:07:40.025 XCTRunner[195:28521] XCTestConfigurationHook: Using Session ID 75B97C9E-6F14-4F88-A242-64B79C9A0F04 <unknown>:0: error: -[MyTestAppUITests testExample] : failed: caught "NSInternalInconsistencyException", "No target application path specified via test configuration: <XCTestConfiguration: 0x1652af60> testBundleURL:file:///var/mobile/Containers/Bundle/Application/883D7F70-E525-4478-9E5E-C87F72A83879/MyTestAppUITests-Runner.app/PlugIns/MyTestAppUITests.xctest/ testBundleRelativePath:(null) productModuleName:(null) testsToSkip:(null) testsToRun:MyTestAppUITests/testExample reportResultsToIDE:no sessionIdentifier:<__NSConcreteUUID 0x1655e5c0> 75B97C9E-6F14-4F88-A242-64B79C9A0F04 pathToXcodeReportingSocket:(null) disablePerformanceMetrics:no treatMissingBaselinesAsFailures:no baselineFileURL:(null) baselineFileRelativePath:(null) targetApplicationPath:(null) targetApplicationBundleID:(null) reportActivities:no testsMustRunOnMainThread:no initializeForUITesting:no " ( 0 CoreFoundation 0x22c90123 <redacted> + 150 1 libobjc.A.dylib 0x22436e17 objc_exception_throw + 38 2 CoreFoundation 0x22c8ffe1 <redacted> + 0 3 Foundation 0x23463b19 <redacted> + 92 4 XCTest 0x002625a1 -[XCUIApplication init] + 216 5 MyTestAppUITests 0x01d8a4b7 -[MyTestAppUITests setUp] + 182 6 XCTest 0x002433bf __24-[XCTestCase invokeTest]_block_invoke_2 + 198 7 XCTest 0x00274661 -[XCTestContext performInScope:] + 308 8 XCTest 0x002432f3 -[XCTestCase invokeTest] + 184 9 XCTest 0x00243a4f -[XCTestCase performTest:] + 566 10 XCTest 0x00241375 -[XCTestSuite performTest:] + 460 11 XCTest 0x00241375 -[XCTestSuite performTest:] + 460 12 XCTest 0x0024e88d -[XCTestObservationCenter _observeTestExecutionForBlock:] + 716 13 XCTest 0x00275c7f _XCTestMain + 1150 14 CoreFoundation 0x22c535b1 <redacted> + 12 15 CoreFoundation 0x22c5306d <redacted> + 216 16 CoreFoundation 0x22c515e1 <redacted> + 784 17 CoreFoundation 0x22ba4bf9 CFRunLoopRunSpecific + 520 18 CoreFoundation 0x22ba49e5 CFRunLoopRunInMode + 108 19 GraphicsServices 0x23df0ac9 GSEventRunModal + 160 20 UIKit 0x26e34ba1 UIApplicationMain + 144 21 XCTRunner 0x000fa255 XCTRunner + 33365 22 libdyld.dylib 0x22853873 <redacted> + 2 ) Test Case '-[MyTestAppUITests testExample]' failed (0.239 seconds). Test Suite 'MyTestAppUITests' failed at 2016-04-03 19:07:40.256. Executed 1 test, with 1 failure (1 unexpected) in 0.239 (0.242) seconds Test Suite 'Selected tests' failed at 2016-04-03 19:07:40.259. Executed 1 test, with 1 failure (1 unexpected) in 0.239 (0.251) seconds 

我看起来像MyAppUITests-Runner.app应用程序没有包含一个configuration文件,它允许它的目标是正确的应用程序。 所以我怀疑这与我用来构build和上传应用程序及其UItesting的过程有关。

我用来生成应用程序ipa文件的过程是:

  1. 在Xcode中,单击产品>存档
  2. 在pipe理器窗口中select存档,然后单击导出button
  3. select“保存为临时部署”,然后单击下一步
  4. select“使用本地签名资产”进行供应
  5. select“为所有兼容设备导出一个应用程序”
  6. “包括空中安装清单”是联合国检查
  7. 检查“从位码重build”
  8. 将ipa导出到桌面上的文件夹

我用来生成UITests ipa文件的过程是(遵循http://docs.aws.amazon.com/devicefarm/latest/developerguide/test-types-ios-xctest-ui.html中的说明):

  1. 在Xcode中,select“Generic iOS Device”作为构build目标
  2. 单击产品>构build>testing
  3. 打开项目的XCode Derived Data文件夹,进入Build> Intermediates> Debug-iphoneos。 这包含2个文件:MyTestApp.app和MyTestAppUITests-Runner.app
  4. 在桌面上创build一个名为“Payload”的新目录
  5. 将MyTestAppUITests-Runner.app文件复制到Payload目录中
  6. 右键点击Payload并select“Compress'Payload'”
  7. 将生成的Payload.zip文件重命名为mytestapp-uitests.ipa

我也尝试将MyTestApp.app和MyTestAppUITests-Runner.app包括到mytestapp-uitests.ipa文件中,但是这也不起作用。

在设备场中运行testing:

  1. 在我的testing项目中,点击“创build一个新的运行”
  2. selectAndroid / iOS
  3. 上传之前生成的MyTestApp.ipa文件(从导出文件)并单击下一步
  4. 从列表中select“XCTest UI”,然后上传mytestapp-uitests.ipa文件

在这里输入图像说明

  1. select运行iOS 9.2.1的iPad Air 2,iPad Air和iPad 2组成的设备池
  2. 将设备状态保留为默认设置
  3. 点击开始运行

请注意,如果我使用相同的应用程序ipa文件并运行内置的Fuzztesting,这些工作没有任何问题 – 我可以看到与我的testing应用程序的单一标签截图。

我看不到任何明显的缺失。 我需要做些什么才能做到这一点?

我在AWS设备农场团队工作。 以下引用的分析是正确的。

我看起来像MyAppUITests-Runner.app应用程序没有包含一个configuration文件,它允许它的目标是正确的应用程序。 所以我怀疑这与我用来构build和上传应用程序及其UItesting的过程有关。

我们目前正在修复如果.ipac文件从.ipa中丢失,没有findtesting的问题。

这个问题的解决方法,直到它被固定,让你运行是在本地运行你的testing,这将生成.app / Plugins文件夹下的.xctestconfiguration文件

在打包上传到设备场之前,请确保xapptestconfiguration文件存在于.app软件包下

Fuzztesting将起作用,因为它不使用您的testing代码。 它只需要你的应用程序,并运行一个自定义的模糊testing。

关于* -Runner.app的位置的另一个注意事项是你应该能够从Xcode的产品文件夹下find它,但只要你能得到它的东西应该没事的。

更新这个问题已经被修复,因为这个post的原始时间已经不再需要在你的testing运行器中有一个xctestconfiguration文件了。

我有类似的问题。 我多挖一点,看起来下面可能是testing失败的原因。

“无法收到来自testmanagerd的XCTest包就绪消息,错误代码-7”

看起来setup和teardown方法默认运行,因此通过。 我不确定。 但是,我会尝试从日志中获取更多信息。

更简单的解决scheme是更改派生数据文件夹的位置 – (在Xcode Preferneces – > Locations下)。

派生的数据文件夹位置更改 例如我把它放在我的用户文件夹(类似于我的文档)

这个错误在经过数小时的不必要的争斗之后马上就消失了。 (看起来像一个Xcode错误)

Interesting Posts