Hoja de referencia rápida de Xamarin.UITest

Importante

Visual Studio App Center está programado para retirarse el 31 de marzo de 2025. Aunque puede seguir usando Visual Studio App Center hasta que se retire por completo, hay varias alternativas recomendadas a las que puede considerar la posibilidad de migrar.

Obtenga más información sobre las escalas de tiempo y las alternativas de soporte técnico.

Este documento es una hoja de referencia rápida que condensa cierta información de UITest para una referencia rápida, contiene los temas siguientes:

Escritura de pruebas

Este fragmento de código es una reutilizable TestFixture para una clase de prueba en una sola plataforma:

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
    }
}

En el caso de las soluciones que implican Tanto Android como iOS, el código siguiente le ayudará a escribir UITests multiplataforma.

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

Las soluciones de Xamarin.Forms deben seguir las instrucciones descritas en la guía Automatización de las pruebas de Xamarin.Forms con Xamarin.UITest y App Center.

Inicialización de Xamarin.UITest en iOS

Agregue el siguiente fragmento de código al FinishedLaunching método de la clase AppDelegate :

#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 Test Cloud Agent usa API de Apple no públicas, lo que hace que el App Store rechace las aplicaciones. El enlazador de Xamarin.iOS quitará Xamarin Test Cloud Agent del IPA final si el código no hace referencia explícitamente a ningún lugar. Las compilaciones de versión no tienen la ENABLE_TEST_CLOUD variable del compilador, lo que hace que Xamarin Test Cloud Agent se quite de la agrupación de aplicaciones. Las compilaciones de depuración tienen definida la directiva del compilador, lo que impide que el enlazador quite Xamarin Test Cloud Agent.

Determinación del identificador de dispositivo para el simulador de iOS

Puede determinar el UUID para los simuladores de iOS en un equipo, use el instruments comando como se muestra a continuación:

$ 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]

Iniciar una instancia del simulador de iOS

Es posible ejecutar UITests en una versión específica de iOS y un simulador mediante el identificador de dispositivo.

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

Restablecer un simulador de iOS a valores predeterminados de fábrica

Este fragmento de código se puede usar para detener un simulador de iOS determinado y restablecerlo de nuevo a los valores predeterminados de fábrica:

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();
}

Fragmentos de código

En esta sección se proporcionan algunos fragmentos de código que pueden resultar útiles para escribir UITests.

Consulta de elementos basados en el valor de propiedad

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

Habilitar capturas de pantalla localmente

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

En el ejemplo de código anterior se colocan capturas de pantalla en el directorio donde está el ensamblado de prueba, asignando un nombre a la imagen screenshot-X-png.

Invocar un método en un elemento AppResult o ui

Es posible ejecutar métodos nativos en vistas subyacentes con el AppQuery.Invoke método . El método invocado debe coincidir con el nombre del método nativo, no con el nombre del método de C#. Por ejemplo, para invocar el setGravity método en un dispositivo Android TextView:

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

Invoke usa el método Java TextView.setGravity y no la propiedad TextView.Gravity de C#.

Control de permisos de Android

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

Si instala mediante .ApkFile(apkpath) en lugar de PreferIdeSettings(), la aplicación se concede con permisos "todos", que quitan los elementos emergentes de permisos. En el .ApkFile(apkpath) método , apkpath debe apuntar al archivo apk compilado.