【问题标题】:Testing my Xamarin.Forms iOS Application with Xamarin.UITest: The first test always fails使用 Xamarin.UITest 测试我的 Xamarin.Forms iOS 应用程序:第一次测试总是失败
【发布时间】:2019-06-11 19:41:19
【问题描述】:

我正在使用 Xamarin.UITest 在真实设备(带有 iOS 12.1 的 iPhone 6s)上测试 Xamarin.iOS 应用程序。 当我运行我的几个 UI 测试时,第一个测试总是会崩溃(不管测试内部发生了什么),因为相同的错误(见下文)。

环境是:

  • Xamarin.UITest 2.2.7

  • NUnitTestAdapter 2.1.1

  • NUnit 2.6.3

  • Xamarin.TestCloud.Agent 0.21.7

设置是:

[SetUp]
public void Setup(){
     this.app = ConfigureApp.iOS
        .EnableLocalScreenshots()
                .InstalledApp("my.app.bundle")
                .DeviceIdentifier("My-iPhone6s-UDID-With-iOS12.1")  
                .StartApp();
}

[Test]
public void FirstTestThatCouldBeEmpty(){
     //But doesn't have to be empty to produce the error    
}

产生的错误:

2019-01-17T14:11:20.4902700Z 1 - ClearData:> 2019-01-17T14:11:20.4916340Z bundleId: my.app.bundle 2019-01-17T14:11:20.4929580Z deviceId: My-iPhone6s-UDID-With-iOS12.1

2019-01-17T14:11:33.7561260Z 3 - LaunchTestAsync:

2019-01-17T14:11:33.7574050Z deviceId: My-iPhone6s-UDID-With-iOS12.1

2019-01-17T14:11:33.9279420Z 5 - HTTP 请求失败,重试限制达到

2019-01-17T14:11:33.9302300Z 异常:System.Net.Http.HttpRequestException:发送请求时出错 ---> System.Net.WebException:无法从传输连接读取数据:连接由同行重置。 ---> System.IO.IOException:无法从传输连接读取数据:连接被对等方重置。 ---> System.Net.Sockets.SocketException: Connection reset by peer

2019-01-17T14:11:33.9322710Z at System.Net.Sockets.Socket.EndReceive (System.IAsyncResult asyncResult) [0x00012] in :0

2019-01-17T14:11:33.9340560Z 在 System.Net.Sockets.NetworkStream.EndRead (System.IAsyncResult asyncResult) [0x00057] 在 :0

2019-01-17T14:11:33.9358740Z --- 内部异常堆栈跟踪结束 ---

2019-01-17T14:11:33.9377100Z 在 System.Net.Sockets.NetworkStream.EndRead (System.IAsyncResult asyncResult) [0x0009b] 在 :0

2019-01-17T14:11:33.9398100Z 在 System.IO.Stream+c.b__43_1(System.IO.Stream 流,System.IAsyncResult asyncResult)[0x00000] 在 :0

2019-01-17T14:11:33.9415720Z 在 System.Threading.Tasks.TaskFactory1+FromAsyncTrimPromise1[TResult,TInstance].Complete (TInstance thisRef, System.Func`3[T1,T2,TResult] endMethod, System.IAsyncResult asyncResult, System.Boolean requiresSynchronization) [0x00000] in :0

有时是这个错误:

SetUp:Xamarin.UITest.XDB.Exceptions.DeviceAgentException:无法结束会话:发送请求时出错

System.Net.Http.HttpRequestException : 发送请求时出错

System.Net.WebException:无法从传输连接读取数据:连接被对等方重置。

System.IO.IOException : 无法从传输连接中读取数据:连接被对等方重置。

System.Net.Sockets.SocketException : 对等方重置连接

有什么办法可以解决这个问题? 做 nuget 包的版本难题让我走到了这一步,除了这个之外,所有测试都在工作。

一个虚拟测试是可能的,但是那些测试的无数构建将永远不会处于“成功”状态,因为这个测试失败 =(

【问题讨论】:

  • 这可能看起来很奇怪,但是您是否尝试过重新启动设备并再次运行它?
  • 这可能和这个问题相同:stackoverflow.com/questions/50024536/…
  • 是的,我检查了那个线程,但是你提到的线程中的解决方案是针对模拟器的。我正在物理设备上进行测试。不幸的是,这对我没有帮助。
  • 使用 Xamarin UI Test 3.0.0 时我也会遇到这种情况。我还没有找到解决方法。其他也请注意,除了硬件上的不同,这里是“connection reset by peer”而不是“connection denied”
  • 我能够通过保存来自 TestFixtureSetup 的异常并在安装过程中抛出它来获得更详细的日志。我将省略您已经粘贴的部分。 pastebin.com/etgzQZLZ 。请注意,这并不总是在 DeleteSessionAsync 期间失败(例如,如果您手动重新启动被测应用),但总是在 LaunchTestAsync 中的某个地方失败。

标签: xamarin xamarin.ios automated-tests ui-testing xamarin.uitest


【解决方案1】:

我能够找到解决此问题的方法,以及设备代理未连接到被测应用的任何问题。

        public static IApp StartApp(Platform platform)
        {
            if (platform == Platform.iOS)
            {
                try
                {
                    return ConfigureApp.iOS
                       .InstalledApp("com.example")
#if DEBUG
                       .Debug()
#endif
                       .StartApp();
                }
                catch
                {
                    return ConfigureApp.iOS
                       .InstalledApp("com.example")
#if DEBUG
                        .Debug()
#endif
                       .ConnectToApp();
                }
            }

用简单的语言:“如果您尝试启动应用程序,但出现问题,请尝试查看被测应用程序是否已启动并连接到它”

注意:正如 cmets 中提到的 https://stackoverflow.com/users/1214857/iupchris10,这种方法的一个警告是,当您连续运行测试时,StartApp 调用将理论上可靠地关闭应用程序,要点失败是重新连接,如果没有,并且您正在连续运行测试,您只需连接到正在运行的应用程序实例,无论它处于何种状态。这种方法不提供追索权。 Xamarin 的 StartApp 将抛出异常,而不是类型化异常,因此缓解这种情况将依赖于您解析 InnerException.Message 并保留预期失败的表。

【讨论】:

  • 这种方法的副作用是应用程序不会重新启动 - 您只需继续连接到已经在前台运行的应用程序。因此,在第一次测试之后发生的任何测试都可能不在预期的正确屏幕上。
  • @iupchris10 谢谢 :) 这值得添加到适当的帖子中,这样人们就不必深入研究 cmets,谢谢。 E. 我刚刚做的。如果 StartApp 工作,它确实会停止正在运行的实例,但是......我们正在吞下错误,所以我们不知道这是否真的工作,如果它不工作,你是完全正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 2021-03-19
  • 2012-08-14
  • 2013-10-24
  • 2017-06-11
  • 2015-07-29
  • 2018-03-08
相关资源
最近更新 更多