7

我使用 Xamarin UITest 框架为我的 Xamarin 应用程序创建了自动 Android 和 iOS UI 测试。在本地运行测试时,它们运行良好,但在 Bitrise CI 上运行它们时,iOS 测试运行良好,但 Android UI 测试一直失败,并出现以下异常:

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");

表示十秒内找不到生成的文件。是不是模拟器太慢了,模拟器需要十多秒才能创建这些文件?

4

3 回答 3

1

我解决了这个问题,将未签名版本的 APK 上传到我的测试设备(Xamarin Android Player 也是如此)。我不得不从项目属性中的 Android 包签名选项中取消选中“签署 .APK 文件”框。WaitTimes方法对我不起作用。

于 2016-07-21T21:57:20.810 回答
1

是不是模拟器太慢了,模拟器需要十多秒才能创建这些文件?

是的,这可能是问题所在。

你对如何解决这个问题有什么建议吗?

Xamarin.UITest nuget 包的最新开发版本已将该超时间隔从 10 秒增加到 60 秒。

尝试 Xamarin.UITest 1.3.6.1476-dev或更高版本。

于 2016-04-06T22:32:24.187 回答
1

我认为您需要查看一些配置

如果您的应用程序没有等待启动您可以实施的测试WaitTimes

像这样创建一个类:

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

    public TimeSpan WaitForTimeout
    {
        get { return TimeSpan.FromMinutes(1); }
    }
}

然后像这样实现它:

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

否则,您可以等待加载特定元素,如下所示:

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

以下是有关 WaitTime 和 WaitForElement 的更多信息,可能会有所帮助。

于 2016-04-04T07:16:13.700 回答