麻烦在Xamarin.iOS上运行跨平台UITests

时间:2016-12-12 11:27:03

标签: xamarin xamarin.ios cross-platform xamarin-studio xamarin.uitest

我在共享应用程序的iOS端运行我的Xamarin UItests时遇到一些问题。测试在Android上没有问题,但我得到了一个 当我尝试在iOS上运行它们时System.Exception

  

SetUp:System.Exception:此应用包无法在运行时生效   一个模拟器。要解决此问题,请确保您的目标设备   是一个模拟器。在物理设备上运行已安装的应用程序   你可以使用安装的应用程序(“ie.eoin.myapp”)

我尝试在模拟器上以及在具有相同异常的真实设备上运行测试。下面是堆栈跟踪的开始。

Xamarin.UITest.iOS.iOSAppLauncher.LaunchAppLocal(Xamarin.UITest.Configurati`enter code here`on.IiOSAppConfiguration appConfiguration, Xamarin.UITest.Shared.Http.HttpClient httpClient, System.Boolean clearAppData) [0x0008a] in <b034e37336b84a95a2482a0c5f0be621>:0 
  at Xamarin.UITest.iOS.iOSAppLauncher.LaunchApp (Xamarin.UITest.Configuration.IiOSAppConfiguration appConfiguration, Xamarin.UITest.Shared.Http.HttpClient httpClient, Xamarin.UITest.TestCloud.TestCloudiOSAppConfiguration testCloudAppConfiguration, Xamarin.UITest.Shared.Http.HttpClient testCloudWsClient, Xamarin.UITest.Shared.Http.HttpClient xtcServicesClient, System.Boolean testCloudUseDeviceAgent) [0x0007a] in <b034e37336b84a95a2482a0c5f0be621>:0 
  at Xamarin.UITest.iOS.iOSApp..ctor (Xamarin.UITest.Configuration.IiOSAppConfiguration appConfiguration) [0x00302] in <b034e37336b84a95a2482a0c5f0be621>:0 
  at Xamarin.UITest.Configuration.iOSAppConfigurator.StartApp (Xamarin.UITest.Configuration.AppDataMode appDataMode) [0x00017] in <b034e37336b84a95a2482a0c5f0be621>:0 
  at Shared.UITest.AppInitializer.StartApp () [0x00036] in /Users/eoinahern/Documents/xamarin_projs/HomeApp.Mobile/Shared/Shared.UITests/AppInitializer.cs:23 
  at Shared.UITest.Common.SetUp () [0x00002] in /Users/eoinahern/Documents/xamarin_projs/HomeApp.Mobile/Shared/Shared.UITests/Common.cs:17 
  at Shared.UITests.MapScreensTests.SetUp () [0x00002] in /Users/eoinahern/Documents/xamarin_projs/HomeApp.Mobile/Shared/Shared.UITests/MapScreens/MapScreensTests.cs:16 
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00038] in /private/tmp/source-mono-4.6.0/bockbuild-mono-4.6.0-branch/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/corlib/System.Reflection/MonoMethod.cs:305 

startApp()类的AppInitializer方法中,路径指向bin目录中的正确.app文件。

public static IApp StartApp()
        {
            switch (TestEnvironment.Platform)
            {
                case TestPlatform.Local:
#if __IOS__
                    platform = Platform.iOS;
                    return ConfigureApp
                                    .iOS
                                    .AppBundle(GetLocalIOSTestAppPath())                                        .StartApp(Xamarin.UITest.Configuration.AppDataMode.Clear) as IApp;
#endif

}

我不确定为什么测试不会运行。我尝试过更改为实际的设备。此外,.app文件看起来像停车标志中的符号作为其图标。不确定这意味着什么。我会看看接下来意味着什么,但是现在我很难过。任何帮助表示赞赏。严重困在这里。

2 个答案:

答案 0 :(得分:0)

你解决了这个问题吗? 正如假设:也许您需要使用.ipa文件而不是.app

答案 1 :(得分:0)

希望您已经解决了这个问题,但是对于发现此问题的其他人: iOS对于真实设备与模拟器的配置非常挑剔。 This bit of the docs应该可以为您提供帮助,但总而言之:

对于真实设备,您的应用配置应如下所示:

IApp app = ConfigureApp
    .iOS
    .InstalledApp("your.app.name")
    .StartApp();

如果您使用已安装的应用程序,则必须先在设备上安装该应用程序,然后才能尝试运行测试。

对于模拟器设备,您的应用配置应如下所示:

IApp app = ConfigureApp
    .iOS
    .AppBundle("your.app.bundle")
    .StartApp();

在撰写本文时,还有InstalledApp“配置已安装的应用程序使用。将强制在物理设备上运行。”而AppBundle“配置应用程序捆绑使用。将强制在模拟器上运行。”这些区别似乎是iOS独有的。在Android上的行为有所不同。

还有两个其他应用程序配置设置可能在此处适用:DeviceIdentifierPreferIdeSettings。您可以使用“设备标识符”指定要在哪个设备上运行,但要注意的是,模拟器和设备在不同的计算机上都具有不同的ID,因此请谨慎检查该配置。PreferIdeSettings应该允许您将Visual Studio用于Mac设备定位-请参阅测试布局,单元测试板和测试应用程序。配置正确后,您将同时看到一个ios和android项目,并且目标显示类似Virtual Device / my_android_emulator (API 28)Device / Your iPhone的内容。