UITest 和 Xamarin.Forms 入门
重要
Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但有几种建议的替代方法可以考虑迁移到其中。
UITest 可与 Xamarin.Forms 一起使用,以编写 UI 测试,以在数百台设备上在云中运行。
概述
使用 App Center Test,开发人员可为 iOS 和 Android 应用编写自动化用户界面测试。 经过一些细微调整,可使用 Xamarin.UITest 来测试 Xamarin.Forms 应用,包括共享相同的测试代码。 本文介绍结合使用 Xamarin.UITest 和 Xamarin.Forms 的特定使用技巧。
本指南假定用户已具备一定的 Xamarin.UITest 知识。 若要掌握 Xamarin.UITest 知识,建议遵循以下指南:
将 UITest 项目添加到 Xamarin.Forms 解决方案后,即可采用用于 Xamarin.Android 或 Xamarin.iOS 应用程序的相同步骤为 Xamarin.Forms 应用程序编写和运行测试。
要求
请参阅 Xamarin.UITest,确认项目已准备好进行自动化 UI 测试。
向 Xamarin.Forms 应用添加 UITest 支持
UITest 通过激活屏幕上的控件并在用户通常与应用程序交互的任何位置提供输入来自动执行用户界面。 若要通过按某一按钮或在框中输入文本启用测试,测试代码需要某种可识别屏幕上控件的方法。
若要启用引用控件的 UITest 代码,每个控件均需一个唯一标识符。 在 Xamarin.Forms 中,建议使用 AutomationId
属性设置此标识符,如下所示:
var b = new Button {
Text = "Click me",
AutomationId = "MyButton"
};
var l = new Label {
Text = "Hello, Xamarin.Forms!",
AutomationId = "MyLabel"
};
还可在 XAML 中设置 AutomationId
属性:
<Button x:Name="b" AutomationId="MyButton" Text="Click me"/>
<Label x:Name="l" AutomationId="MyLabel" Text="Hello, Xamarin.Forms!" />
注意
AutomationId
是 BindableProperty
,也可使用绑定的表达式进行设置。
唯一 AutomationId
需添加到测试所需的所有控件(包括按钮、文本项和可能需要查询其值的标签)。
警告
如果尝试设置多次的属性,AutomationId
将引发一InvalidOperationException
个Element
。
iOS 应用程序项目
若要在 iOS 上运行测试, 必须将 Xamarin 测试云代理 NuGet 包 添加到项目中。 添加后,将以下代码 AppDelegate.FinishedLaunching
复制到方法中:
#if ENABLE_TEST_CLOUD
// requires Xamarin Test Cloud Agent
Xamarin.Calabash.Start();
#endif
Calabash 程序集使用非公共 Apple API,这会导致 App Store 拒绝应用。 但是,如果未从代码中显式引用 Calabash 程序集,则 Xamarin.iOS 链接器会从最终 IPA 中将其删除。
注意
默认情况下,发布版本没有 ENABLE_TEST_CLOUD
编译器变量,这会导致从应用捆绑包中删除 Calabash 程序集。 但是,调试生成默认定义了编译器指令,从而阻止链接器删除程序集。
以下屏幕截图显示有关调试版本的 ENABLE_TEST_CLOUD
编译器变量设置:
Android 应用程序项目
与 iOS 不同,Android 项目不需要任何特殊的启动代码。
编写 UITest
有关编写 UITest 的信息,请参阅 UITest 文档。
使用 Xamarin.Forms UI 中的 AutomationId
编写任何 UITest 之前,必须确保 Xamarin.Forms 应用程序用户界面上的脚本可编辑。 确保用户界面中的所有控件都有 AutomationId
,以便在测试代码中引用它们。
在 UITest 中引用 AutomationId
编写 UITest 时,AutomationId
值会在每个平台上以不同方式公开:
- iOS 使用
id
字段。 - Android 使用
label
字段。
若要编写可在 iOS 和 Android 上找到 AutomationId
的跨平台 UITest,请使用 Marked
测试查询:
app.Query(c=>c.Marked("MyButton"))
短格式 app.Query("MyButton")
同样适用。
将 UITest 项目添加到现有解决方案
Visual Studio 提供了一个模板,帮助将 Xamarin.UITest 项目添加到现有 Xamarin.Forms 解决方案:
右键单击解决方案,然后选择“ 文件 > 新建项目”。
从 Visual C# 模板中,选择“测试”类别。 选择 UI 测试应用>跨平台模板:
此步骤将 包含 NUnit、 Xamarin.UITest 和 NUnitTestAdapter NuGet 包的新项目添加到解决方案:
NUnitTestAdapter 是第三方测试运行程序,它允许 Visual Studio 从 Visual Studio 运行 NUnit 测试。
新项目中还包含两个类。 AppInitializer 类包含有助于初始化和设置测试的代码。 另一个类 Tests 包含有助于启动 UITest 的 boilerplate 代码。
将项目引用从 UITest 项目添加到 Xamarin.Android 项目:
此步骤允许 NUnitTestAdapter 从 Visual Studio 为 Android 应用运行 UITest。
将 Xamarin.UITest 添加到 Xamarin.Forms 解决方案后,可以创建 UITest、在本地运行 UITest 并将其提交到 App Center 测试。
总结
使用一种简单机制即可轻松通过 Xamarin.UITest 测试 Xamarin.Forms 应用程序,以将 AutomationId
公开为测试自动化的唯一视图标识符。 将 UITest 项目添加到 Xamarin.Forms 解决方案后,即可采用用于 Xamarin.Android 或 Xamarin.iOS 应用程序的相同步骤为 Xamarin.Forms 应用程序编写和运行测试。
有关如何将测试提交到 App Center 测试的信息,请参阅 提交适用于 Xamarin.Android 的 UITest 或 提交适用于 Xamarin.iOS 的 UITest。 有关 UITest 的详细信息,请参阅 App Center Test 文档。