使用 REPL

创建 Xamarin.UITests 的一个重要工具是 rePL (read-eval-print-loop) 。 REPL 是一个类似控制台的环境,可在其中动态试验 UITest 表达式。 REPL 评估它们,在应用中实时运行它们,并记录详细输出。 表达式可以从 REPL 工具复制,并直接在 UITest 项目中使用。

启动 REPL

REPL 只能通过运行调用 方法的测试来 IApp.Repl() 启动:

[TestFixture]
public class Tests
{
    AndroidApp app;

    [SetUp]
    public void BeforeEachTest()
    {
        app = ConfigureApp.Android.StartApp();
    }

    [Test]
    public void CreditCardNumber_TooShort_DisplayErrorMessage()
    {
        app.Repl();
    }
}

运行并调用测试时 .Repl() ,Xamarin.UITest 将停止测试,并启动终端窗口中的 REPL:

提示

如果 macOS 上未显示 REPL 窗口,请转到"系统首选项">"安全"&"隐私">"隐私 > 自动化",搜索 "Visual Studio",并确保 选中"终端"。 然后尝试再次启动它。

有三种方法可以退出 REPL:

  • Ctrl-C
  • 键入 退出
  • 键入 退出

REPL 关闭时,Xamarin.UITest 将继续执行测试的其余部分。

使用 REPL

REPL 提供 的实例 IApp ,该实例允许与应用程序交互。 REPL 还提供了两个用于创建 Xamarin.UITests 的命令: tree 命令和 copy 命令。

常见工作流是使用 命令或 来识别屏幕上的视图,并 tree IApp.Flash 获取有关这些视图的元数据。 该信息用于创建和 AppQueries 激增将形成测试的步骤。 然后,可以使用 命令将工作复制到剪贴板, copy 以便将其粘贴到测试中。

使用树命令发现视图

tree该命令将显示屏幕上可见的视图的分层列表:

使用 IApp.Flash 发现视图

许多 Xamarin.UITest API 方法接受 AppQuery 对象以查找屏幕上的视图。 IApp.Flash()方法有助于在 REPL 中测试这些查询。 IApp.Flash() 会通过使查询结果闪烁来突出显示查询结果,并返回有关结果中视图的一些详细信息。

例如,以下代码片段演示如何查找 Android 活动上可见的 EditText 所有视图:

>>> app.Flash(c=>c.Class("EditText"))                               
Flashing query for Class("EditText") gave 1 results.
[
  {
    "Id": "creditCardNumberText",
    "Description": "android.widget.EditText{528165e4 VFED..CL .F...... 139,70-941,178 #7f050001 app:id/creditCardNumberText}",
    "Rect": {
      "Width": 802.0,
      "Height": 108.0,
      "X": 139.0,
      "Y": 274.0,
      "CenterX": 540.0,
      "CenterY": 328.0
    },
    "Label": null,
    "Text": "",
    "Class": "android.widget.EditText",
    "Enabled": true
  }
]

我们可以使用 Flash 方法帮助创建 AppQuery ,以与其他 API 一起使用来生成测试。

在测试中创建步骤

让我们看看如何使用 REPL 在测试中快速创建和尝试各个步骤。

例如,可以使用上述命令 tree 的结果。 如果需要测试在 中输入 ID 为 EditText creditCardNumberText的文本,它可以使用 IApp.EnterText 方法:

>>> app.EnterText(c=>c.Marked("creditCardNumberText"), "1234567890123456")
Using element matching Marked("creditCardNumberText").
Tapping coordinates [ 540, 328 ].

同样,如果测试需要模拟用户点击按钮,可以使用 IApp.Tap 方法:

>>> app.Tap(c=>c.Marked("validateButton"))
Using element matching Marked("validateButton").
Tapping coordinates [ 540, 533 ]. 

使用 copy 命令

复制将保留在会话期间输入的命令的历史记录。 此 copy 命令将历史记录添加到剪贴板,以便可以将其粘贴到应用中:

>>> copy
Copying history to clipboard.