Partager via


Aide-mémoire Xamarin.UITest

Important

La mise hors service de Visual Studio App Center est prévue pour le 31 mars 2025. Bien que vous puissiez continuer à utiliser Visual Studio App Center jusqu’à sa mise hors service complète, il existe plusieurs alternatives recommandées vers lesquelles vous pouvez envisager la migration.

En savoir plus sur les chronologies et les alternatives de support.

Ce document est une aide-mémoire qui condense certaines informations UITest pour une référence rapide. Il contient les rubriques suivantes :

Écriture des tests

Cet extrait de code est réutilisable TestFixture pour une classe de test sur une plateforme unique :

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

Pour les solutions impliquant à la fois Android et iOS, le code suivant vous aidera à écrire des UITests multiplateformes.

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

Les solutions Xamarin.Forms doivent suivre les instructions décrites dans le guide Automatisation des tests Xamarin.Forms avec Xamarin.UITest et App Center.

Initialisation de Xamarin.UITest sur iOS

Ajoutez l’extrait de code suivant à la FinishedLaunching méthode de la classe 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

L’agent cloud de test Xamarin utilise des API Apple non publiques, ce qui entraîne le rejet des applications par le App Store. L’éditeur de liens Xamarin.iOS supprime l’agent cloud de test Xamarin de l’IPA final s’il n’est référencé explicitement nulle part par le code. Les builds de mise en production n’ont pas la ENABLE_TEST_CLOUD variable du compilateur, ce qui entraîne la suppression de l’agent cloud de test Xamarin du bundle d’applications. Les builds de débogage ont la directive du compilateur définie, ce qui empêche l’éditeur de liens de supprimer l’agent cloud de test Xamarin.

Déterminer l’ID d’appareil pour le simulateur iOS

Vous pouvez déterminer l’UUID pour les simulateurs iOS sur un ordinateur. Utilisez la instruments commande comme indiqué ci-dessous :

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

Démarrage d’une instance de simulateur iOS

Il est possible d’exécuter UITests sur une version et un simulateur iOS spécifiques à l’aide de l’ID d’appareil.

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

Réinitialiser un simulateur iOS aux paramètres d’usine par défaut

Cet extrait de code peut être utilisé pour arrêter un simulateur iOS donné et le rétablir aux paramètres d’usine par défaut :

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

Extraits de code

Cette section fournit des extraits de code qui peuvent être utiles pour l’écriture d’UITests.

Interrogation d’éléments en fonction de la valeur de propriété

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

Activer les captures d’écran localement

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

L’exemple de code ci-dessus place des captures d’écran dans le répertoire où se trouve l’assembly de test, en nommant l’image screenshot-X-png.

Appeler une méthode sur un élément AppResult ou ui

Il est possible d’exécuter des méthodes natives sur les vues sous-jacentes avec la AppQuery.Invoke méthode . La méthode appelée doit correspondre au nom de la méthode native, et non au nom de la méthode C#. Par exemple, pour appeler la setGravity méthode sur un android TextView:

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

utilise la Invoke méthode Java TextView.setGravity et non la propriété C# TextView.Gravity .

Gestion des autorisations Android

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

Si vous installez à la .ApkFile(apkpath) place de PreferIdeSettings(), l’application dispose d’autorisations « all », ce qui supprime les fenêtres contextuelles d’autorisation. Dans la .ApkFile(apkpath) méthode , apkpath doit pointer vers le fichier apk compilé.