为AWS Device Farm构建XCTest UI测试

时间:2016-04-06 05:28:51

标签: ios xcode aws-device-farm

我尝试将我们的iOS XCUIT项目设置为在AWS Device Farm上运行,但无论我如何构建和上传它们,测试都无法运行。它们在XCode中本地运行时执行并传递,但不在AWS Device Farm上运行。

我设置了一个绝对最简单的应用程序,我可以设法尝试隔离此问题。它由一个带有单个Label的View和一个用于验证标签是否存在的UI Test组成。

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

enter image description here

深入了解日志文件会显示此信息(在"应用程序输出"日志文件中):

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应用程序看起来没有包含一个配置文件,该文件允许它定位正确的应用程序。所以我怀疑它与我用来构建和上传应用程序及其UI测试的过程有关。

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

  1. 在Xcode中,点击产品&gt;归档
  2. 在管理器窗口中选择存档,然后单击导出按钮
  3. 选择&#34;保存进行特别部署&#34;然后单击“下一步”
  4. 选择&#34;使用本地签名资产&#34;供应
  5. 选择&#34;为所有兼容设备导出一个应用&#34;
  6. &#34;包括无线安装的清单&#34;是经过联合国检查的
  7. &#34;从bitcode重建&#34;已检查
  8. 将ipa导出到桌面上的文件夹
  9. 我用来生成UITests ipa文件的过程是(按照http://docs.aws.amazon.com/devicefarm/latest/developerguide/test-types-ios-xctest-ui.html的说明):

    1. 在Xcode中,选择&#34;通用iOS设备&#34;作为构建目标
    2. 点击产品&gt; Build for&gt;测试
    3. 打开项目的XCode Derived Data文件夹,转到Build&gt;中间体&gt;调试的iPhoneOS。这包含2个文件:MyTestApp.app和MyTestAppUITests-Runner.app
    4. 创建一个名为&#34; Payload&#34;的新目录。在桌面上
    5. 将MyTestAppUITests-Runner.app文件复制到Payload目录
    6. 右键点击有效负载并选择&#34;压缩&#39;有效负载&#39;&#34;
    7. 将生成的Payload.zip文件重命名为mytestapp-uitests.ipa
    8. 我还尝试将MyTestApp.app和MyTestAppUITests-Runner.app包含在mytestapp-uitests.ipa文件中,但这也不起作用。

      在Device Farm中运行测试:

      1. 在我的测试项目中,点击&#34;创建新的运行&#34;
      2. 选择Android / iOS
      3. 上传之前生成的MyTestApp.ipa文件(从导出存档),然后单击下一步
      4. 选择&#34; XCTest UI&#34;从列表中,上传mytestapp-uitests.ipa文件
      5. enter image description here

        1. 选择包含iPad Air 2,iPad Air和iPad 2的设备池,全部运行iOS 9.2.1
        2. 将设备状态保留为默认设置
        3. 点击开始运行
        4. 请注意,如果我使用相同的应用程序ipa文件并运行内置的Fuzz测试,这些工作没有任何问题 - 我可以使用我的测试应用程序及其单个标签查看屏幕截图。

          我无法看到任何我想念的明显事物。我需要做些什么来完成这项工作?

3 个答案:

答案 0 :(得分:4)

我在AWS Device Farm团队工作。 您在下面引用的分析是在正确的道路上。

  

对我来说,MyAppUITests-Runner.app应用程序看起来没有包含一个配置文件,该文件允许它定位正确的应用程序。所以我怀疑它与我用来构建和上传应用程序及其UI测试的过程有关。

我们目前正在修复一个问题,即如果.ipa中缺少.xctest配置文件,则不会检测到测试。

此问题的解决方法在修复以使您运行之前是在本地运行测试,这将在.app / Plugins文件夹下生成.xctestconfiguration文件

在打包上传到设备场之前,请确保.c包下存在xctestconfiguration文件

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

关于* -Runner.app的位置的另一个注意事项是你应该能够在Xcode的Products文件夹下找到它,但只要你能找到它就应该没事。

<强>更新 自该帖子的原始时间以来,此问题已得到修复,并且不再需要在测试运行器中包含xctestconfiguration文件。

答案 1 :(得分:1)

我有类似的问题。我稍微挖了一下,似乎下面可能是测试失败的原因。

  

“无法从testmanagerd收到XCTest捆绑就绪消息,错误代码为-7”

默认情况下,设置和拆卸方法都会运行并因此通过。我不确定。但是,我会尝试从日志中获取更多信息。

答案 2 :(得分:0)

更简单的解决方案是更改派生数据文件夹的位置 - (在Xcode Preferneces下 - &gt; Locations。

Derived Data Folder Location Change 例如,我把它放在我的用户文件夹中(类似于我的文件)

这个错误在经过几个小时不成功的战斗后立即消失了。 (看起来像Xcode错误)