Тайм-аут ожидания результата ClearAppData2 при выполнении тестов пользовательского интерфейса Xamarin для Android

Я создал автоматические UI-тесты для Android и iOS для своего приложения Xamarin с помощью фреймворка Xamarin UITest. При локальном запуске тестов они работают нормально, но при запуске их на Bitrise CI тесты iOS работают нормально, но тесты пользовательского интерфейса Android продолжают давать сбои со следующим исключением:

StartFirstActivity_WaitForActivity_ExpectButtonToHaveText
SetUp : System.Exception : Timed out waiting for result of ClearAppData2
Stack trace:
  at Xamarin.UITest.Shared.Android.Commands.CommandAdbClearAppData.Execute (IProcessRunner processRunner, IAndroidSdkTools androidSdkTools) <0x38b3e90 + 0x0064b> in <filename unknown>:0 
  at Xamarin.UITest.Shared.Execution.Executor.Execute[TDep1,TDep2] (ICommand2 command) <0x32b6478 + 0x00092> in <filename unknown>:0 
  at Xamarin.UITest.Shared.Android.LocalAndroidAppLifeCycle.EnsureInstalled (Xamarin.UITest.Shared.Android.ApkFile appApkFile, Xamarin.UITest.Shared.Android.ApkFile testServerApkFile) <0x37418c8 + 0x0017a> in <filename unknown>:0 
  at Xamarin.UITest.Android.AndroidApp..ctor (IAndroidAppConfiguration appConfiguration) <0x31a15e8 + 0x0047a> in <filename unknown>:0 
  at Xamarin.UITest.Configuration.AndroidAppConfigurator.StartApp (AppDataMode appDataMode) <0x30b4298 + 0x00063> in <filename unknown>:0 
  at SightPlayer.Core.Test.AppInitializer.StartApp (Platform platform) <0x30b2448 + 0x000ef> in <filename unknown>:0 
  at SightPlayer.Core.Test.Tests.BeforeEachTest () <0x30b23f8 + 0x00013> in <filename unknown>:0 
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) <0x30b2208 + 0x00093> in <filename unknown>:0

Тест Android работает с Xamarin.UITest версии 1.3.5. Это важно, так как кажется, что до версии 1.3.3 была ошибка. Я также попытался проигнорировать провальные тесты, но затем тестовый прогон провалился с другими тестами Android. Достаточно интересно, что иногда проходят отдельные тесты.

Кто-нибудь сталкивался с таким поведением раньше? Есть ли у вас какие-либо советы, как это исправить?

При декомпиляции CommandAdbClearAppData (которая выдает исключение) я вижу

// ISSUE: reference to a compiler-generated field
string str1 = string.Format("/data/data/{0}/files/calabash_failure.out", (object)executeCAnonStorey0.svr);
// ISSUE: reference to a compiler-generated field
string str2 = string.Format("/data/data/{0}/files/calabash_finished.out", (object)executeCAnonStorey0.svr);
while (DateTime.UtcNow < utcNow + TimeSpan.FromSeconds(10.0))
{
    if (func(string.Format("ls {0}", (object)str1)).Output.Trim().Equals(str1))
        throw new Exception("Clear app data failed with " + func(string.Format("cat {0}", (object)str1)).Output);
    if (func(string.Format("ls {0}", (object)str2)).Output.Trim().Equals(str2) && func(string.Format("cat {0}", (object)str2)).Output.Trim().Equals("SUCCESSFUL"))
        return;
}
throw new Exception("Timed out waiting for result of ClearAppData2");

что указывает на то, что созданный файл не может быть найден в течение десяти секунд. Может ли быть так, что эмулятор просто слишком медленный и эмулятору требуется больше десяти секунд для создания этих файлов?

3 ответа

Я решил эту проблему, загрузив неподписанную версию APK на мое тестирующее устройство (то же самое для Xamarin Android Player). Мне пришлось снять флажок "Подписать файл.APK" в разделе "Подпись пакета Android" в свойствах проекта. Путь WaitTimes не работал для меня.

Может ли быть так, что эмулятор просто слишком медленный и эмулятору требуется больше десяти секунд для создания этих файлов?

Да, это может быть проблемой.

Есть ли у вас какие-либо советы, как это исправить?

В последних сборках dev пакета Xamarin.UITest этот интервал времени ожидания увеличен с 10 до 60 секунд.

Попробуйте https://www.nuget.org/packages/Xamarin.UITest/1.3.6.1476-dev или новее.

Я думаю, вам нужно взглянуть на некоторую конфигурацию, если ваше приложение не ожидает запуска теста.

_app = ConfigureApp.Android.EnableLocalScreenshots().ApkFile(apkFile).DeviceSerial("###").ApiKey("###").Debug().WaitTimes(new WaitTimes());  
                            .StartApp();

Реализация для времени ожидания

public class WaitTimes : IWaitTimes
{
    public TimeSpan GestureWaitTimeout
    {
        get { return TimeSpan.FromMinutes(1); }
    }
    public TimeSpan WaitForTimeout
    {
        get { return TimeSpan.FromMinutes(1); }
    }
}

2 Или, если вы ожидаете какой-либо элемент на странице, но выполняете быстрое тестирование, просто подождите элемент и затем выполните тест.

_app.WaitForElement(c => c.Marked("Login"), "Time out completed", TimeSpan.FromSeconds(15));
  var result = _app.Query(c => c.Marked("Login"));
 Assert.AreEqual(1,result.Length);
_app.Screenshot("Test passed with sucess");

Перейдите по этой ссылке на waitimes и waitelement, это поможет вам

Другие вопросы по тегам