Тестирование моего приложения Xamarin.Forms для iOS с помощью Xamarin.UITest: первый тест всегда заканчивается неудачей - PullRequest
0 голосов
/ 17 января 2019

Я тестирую приложение Xamarin.iOS на реальном устройстве (iPhone 6s с iOS 12.1) с помощью Xamarin.UITest. Когда я запускаю несколько тестов пользовательского интерфейса, первый тест всегда вызывает сбой (независимо от того, что происходит внутри теста) из-за одной и той же ошибки (см. Ниже).

Окружающая среда:

  • 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 ID устройства: My-iPhone6s-UDID-With-iOS12.1

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

2019-01-17T14: 11: 33.7574050Z ID устройства: My-iPhone6s-UDID-С-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: сброс соединения по пиру

2019-01-17T14: 11: 33.9322710Z в System.Net.Sockets.Socket.EndReceive (System.IAsyncResult asyncResult) [0x00012] в <23340a11bb41423aa895298bf881ed68>: 0

2019-01-17T14: 11: 33.9340560Z в System.Net.Sockets.NetworkStream.EndRead (System.IAsyncResult asyncResult) [0x00057] в <23340a11bb41423aa895298bf881ed68>: 0

2019-01-17T14: 11: 33.9358740Z --- Конец трассировки стека внутренней исключительной ситуации ---

2019-01-17T14: 11: 33.9377100Z в System.Net.Sockets.NetworkStream.EndRead (System.IAsyncResult asyncResult) [0x0009b] в <23340a11bb41423aa895298bf881ed68>: 0

2019-01-17T14: 11: 33.9398100Z в System.IO.Stream + <> c.b__43_1 (поток System.IO.Stream, System.IAsyncResult asyncResult) [0x00000] в <98fac219bd4e453693d76fda7bd96ab0>: 0 * 1055

2019-01-17T14: 11: 33.9415720Z в System.Threading.Tasks.TaskFactory 1+FromAsyncTrimPromise 1 [TResult, TInstance] .Complete (TInstance thisRef, System.Func`3 [T1, T2, TResult] endMethod, System.IAsyncResult asyncResult, System.Boolean требуется синхронизация) [0x00000] в <98fac219bd4e453693d76fda7bd96ab0>: 0

Иногда именно эта ошибка:

SetUp: Xamarin.UITest.XDB.Exceptions.DeviceAgentException: невозможно завершить сеанс: при отправке запроса произошла ошибка

System.Net.Http.HttpRequestException: при отправке запроса произошла ошибка

System.Net.WebException: невозможно прочитать данные из транспортного соединения: соединение сбрасывается по одноранговому узлу.

System.IO.IOException: Невозможно прочитать данные из транспортного соединения: Соединение сброшено по пиру.

System.Net.Sockets.SocketException: сброс соединения по пиру

Что может быть решением для этого? Создание головоломки версии пакетов nuget позволило мне понять, что все тесты, кроме этого, работают.

Возможен фиктивный тест, но это может привести к тому, что графические сборки с этим тестом никогда не будут в состоянии "успешно", потому что этот тест не пройден = (

1 Ответ

0 голосов
/ 25 июля 2019

Мне удалось обойти эту проблему, и, действительно, любую проблему с агентом устройства, не подключающимся к тестируемому приложению.

        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();
                }
            }

Простым языком: «Если вы попытались запустить приложение и что-то пошло не так, попробуйте проверить, запущено ли тестируемое приложение, и подключитесь к нему»

Примечание. Как отмечается в комментариях https://stackoverflow.com/users/1214857/iupchris10, предостережение от этого подхода заключается в том, что при последовательном запуске тестов при вызове StartApp в теории надежно завершает работу приложения с точка сбоя - переподключение, если это не так, и вы последовательно запускаете тесты, вы просто подключитесь к работающему экземпляру приложения в любом состоянии, в котором оно было оставлено. Этот подход не предлагает никаких действий. StartApp Xamarin будет генерировать Exception, а не типизированное исключение, и поэтому для его устранения вам понадобится анализ InnerException.Message и ведение таблицы ожидаемых сбоев.

...