在 Xamarin Test Cloud 中测试一个长进程

Testing a long process in Xamarin Test Cloud

我有一个关于 Xamarin 测试云的问题,希望有人能指出正确的方向。

当用户点击我的应用程序中的按钮时,一个过程 运行s 大约需要 30 分钟。我添加了一个单元测试项目,它 运行 在模拟器中完美无缺。

但是,我需要在真实设备上进行测试,所以我决定使用 Xamarin Test Cloud。当我 运行 那里的测试时,它没有完成。正如我所说,它应该需要 30 分钟,但测试几乎立即完成。

这是我的测试代码:

[Test]
[Timeout(Int32.MaxValue)]
public async void Optimize()
{
 await Task.Run(async() =>
 {
   app.Screenshot("Start " + DateTime.Now);
   app.Tap(x => x.Marked("btnOptimize"));
   await Task.Delay(120000);
   app.Screenshot("End " + DateTime.Now);
 }
}

如果我运行在模拟器中测试,截图名称分别是(例如)"Start 12:00:00"和"End 12:30:00"(所以这意味着它运行s 30 分钟,如预期的那样)。但是,在 Test Cloud 中,我得到(例如)"Start 12:00:00" 和 "End 12:02:00",这意味着测试 运行 仅持续 2 分钟。但那是因为我添加了延迟。如果没有延迟,它只会运行 5 秒。

这就是我需要的吗?我可以加上 1800000 这样测试可以在 30 分钟内完成,但是如果我不知道时间怎么办?

谢谢,抱歉,如果这是一个基本问题

虽然我从未尝试过 30 分钟的超时长度,但 Calabash 允许您使用 wait_for 等待条件):

The following snippet is an example of how to use wait_for to detect the presence of a button on the screen:

wait_for(timeout: 60, timeout_message: "Could not find 'Sign in' button") do
    element_exists("button marked:'Sign in'")
end

参考:https://docs.xamarin.com/guides/testcloud/calabash/working-with/timeouts/

仅供参考:对于没有用户界面交互[=23=的移动设备来说,30 分钟确实很长"background processing" ],如果您的目标是 iOS/Apple Store,那么获得 Apple 提交批准的死刑判决是因为他们永远不会等待应用程序处理某事那么久....

像这样的东西应该可以完成工作:

[Test]
public async void Optimize()
{
   app.Screenshot("Start");
   app.Tap("btnOptimize");
   app.WaitForElement ("otherButton", "Timed out waiting for Button", new TimeSpan(0,30,0));
   app.Screenshot("End");
}

其中 "otherButton" 在任务完成后变为可见。 API.

中还有其他 Wait 方法可用

但是,请注意 Xamarin Test Cloud 默认情况下每次测试最多 30 分钟。可以通过联系 Xamarin 测试云支持来修改该默认值。

此外,在您的屏幕截图标题中包含 non-deterministic 信息或任何可能因设备或 运行 而异的信息不是一个好习惯。当您 运行 在不止一台设备上时,测试报告步骤和屏幕截图部分由屏幕截图标题整理,因此它们应该在不同设备上匹配以获得最佳结果。

您需要通过 Id 识别 tap 并以正确的语法添加 WaitForElement(第一个参数是您要等待的查询),如下所示。它应该适合你。

app.Screenshot("Start " + DateTime.Now); app.WaitForElement(x => x.Id("btnOptimize"),"Optimization timed out",new System.TimeSpan(0,30,0),null,null); app.Tap(x => x.Id("btnOptimize")); app.Screenshot("End " + DateTime.Now);