Xamarin.UITest 备忘单

重要

Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但你可以考虑迁移到几个建议的替代方法。

详细了解支持时间线和替代方法。

本文档是一个速查表,它压缩了一些 UITest 信息以供快速参考,它包含以下主题:

编写测试

此代码片段是单个平台上测试类的样本 TestFixture

using System;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.Android;
using Xamarin.UITest.Queries;

namespace MyApp.MyUITests
{
    [TestFixture]
    public class Tests
    {
        IApp app;

        [SetUp]
        public void BeforeEachTest()
        {
            // Uncomment the line that's appropriate for the platform:
            // app = ConfigureApp.Android.StartApp();
            // app = ConfigureApp.iOS.StartApp();
        }

        // Test cases here
    }
}

对于同时涉及 Android 和 iOS 的解决方案,以下代码将有助于编写跨平台 UITest。

using System;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.Queries;

namespace MyApp.MyCrossPlatformUITests
{

    public class AppInitializer
    {
        public static IApp StartApp(Platform platform)
        {
            if(platform == Platform.Android)
            {
                return ConfigureApp.Android.StartApp();
            }
            return ConfigureApp.iOS.StartApp();
        }
    }

    [TestFixture(Platform.Android)]
    [TestFixture(Platform.iOS)]
    public class Tests
    {
        IApp app;
        Platform platform;

        public Tests(Platform platform)
        {
            this.platform = platform;
        }

        [SetUp]
        public void BeforeEachTest()
        {
            app = AppInitializer.StartApp(platform);
        }
    }
}

Xamarin.Forms 解决方案应遵循 使用 Xamarin.UITest 和 App Center 自动执行 Xamarin.Forms 测试指南中所述的说明。

在 iOS 上初始化 Xamarin.UITest

将以下代码片段添加到 FinishedLaunchingAppDelegate 类的 方法:

#region Code for starting up the Xamarin Test Cloud Agent

// Newer version of Visual Studio for Mac and Visual Studio provide the
// ENABLE_TEST_CLOUD compiler directive to prevent the Calabash DLL from
// being included in the released version of the application.
#if ENABLE_TEST_CLOUD
Xamarin.Calabash.Start();
#endif
#endregion

Xamarin 测试云代理使用非公共 Apple API,这会导致应用被App Store拒绝。 Xamarin.iOS 链接器将从最终 IPA 中删除 Xamarin 测试云代理(如果代码未在任何位置显式引用)。 发布版本没有 ENABLE_TEST_CLOUD 编译器变量,这会导致从应用程序包中删除 Xamarin 测试云代理。 调试生成定义了编译器指令,从而阻止链接器删除 Xamarin 测试云代理。

确定 iOS 模拟器的设备 ID

可以确定计算机上 iOS 模拟器的 UUID,请使用 instruments 如下所示的 命令:

$ xcrun xctrace list devices
Known Devices:
bushmaster [5A4B28A1-392A-59FB-81C5-137E881D61E9]
Resizable iPad (8.1 Simulator) [B3BF8A06-2938-4B74-BF87-16C223F8690C]
Resizable iPhone (8.1 Simulator) [E712409B-CFCC-409A-8162-627B6254EB3C]
iPad 2 (7.1 Simulator) [E8572F8F-227B-4DB0-8C92-590DC770360D]
iPad 2 (8.1 Simulator) [1F425263-3F96-4DAB-B843-0D041C3C71EA]
iPad Air (7.1 Simulator) [2863AFF6-D9FC-45E8-8385-E2A548F19002]
iPad Air (8.1 Simulator) [BBCF5CF2-20A4-4C47-9FA5-EBFF7311B071]
iPad Retina (7.1 Simulator) [B7CBB024-E1D3-4B24-8C20-3E9F7B54CF61]
iPad Retina (8.1 Simulator) [3E21ECD3-397A-4251-AEB6-2ADCF29AEE89]
iPhone 4s (7.1 Simulator) [D36354DD-D6A3-4E08-A25B-276620D844B8]
iPhone 4s (8.1 Simulator) [5C8FE602-8BA7-494D-A113-66C8B9AB3CB7]
iPhone 5 (7.1 Simulator) [C696E83D-F9FE-4DBC-8C67-FA0FC533246E]
iPhone 5 (8.1 Simulator) [9A8A5D92-A7D9-4A3C-81AA-97A9924F7D09]
iPhone 5s (7.1 Simulator) [6CDF5B5C-A315-4A8C-9D38-29437FE59C6D]
iPhone 5s (8.1 Simulator) [3F1C286F-3D5D-47B2-92B8-66B673BD0236]
iPhone 6 (8.1 Simulator) [995FF713-9DE4-460B-800E-F5A20FD93AA7]
iPhone 6 Plus (8.1 Simulator) [AB1C20F6-BFFC-4C80-879C-F19A7E3F0B5C]

启动 iOS 模拟器实例

可以使用设备 ID 在特定 iOS 版本和模拟器上运行 UITests。

const string simId = "3F1C286F-3D5D-47B2-92B8-66B673BD0236"; //iPhone 5s (8.1 Simulator)
app = ConfigureApp.iOS.DeviceIdentifier(simId).StartApp();

将 iOS 模拟器重置为出厂默认值

此代码片段可用于停止给定的 iOS 模拟器,并将其重置回出厂默认值:

static void ResetSimulator(string deviceId)
{
    var shutdownCmdLine = string.Format("simctl shutdown {0}", deviceId);
    var shutdownProcess = Process.Start("xcrun", shutdownCmdLine);
    shutdownProcess.WaitForExit();

    var eraseCmdLine = string.Format("simctl erase {0}", deviceId);
    var eraseProcess = Process.Start("xcrun", eraseCmdLine);
    eraseProcess.WaitForExit();
}

代码段

本部分将提供一些有助于编写 UITest 的代码片段。

基于属性值查询元素

//Finds all elements that have a "hint" property with a value of "Search"
app.Query(e => e.All().Property("hint", "Search"));

在本地启用屏幕截图

app = ConfigureApp.Android
    .EnableLocalScreenshots()
    .StartApp();

上面的代码示例将屏幕截图放入测试程序集所在的目录中,将映像 screenshot-X-png命名为 。

对 AppResult 或 UI 元素调用方法

可以使用 方法在基础视图 AppQuery.Invoke 上执行本机方法。 调用的方法必须与本机方法名称匹配,而不是 C# 方法名称。 例如,若要在 Android TextView上调用 setGravity 方法,

app.Query(e => e.Id("userName").Invoke("setGravity", 1)); //center text

使用 Invoke Java TextView.setGravity 方法,而不是 C# TextView.Gravity 属性。

处理 Android 权限

ConfigureApp.Android.Debug().ApkFile(apkpath).StartApp()

如果使用 而不是 PreferIdeSettings()进行安装.ApkFile(apkpath),则会向应用授予“所有”权限,这将删除权限弹出窗口。 在 方法中 .ApkFile(apkpath)apkpath 必须指向已编译的 apk 文件。