Condividi tramite


Foglio informativo Xamarin.UITest

Importante

Visual Studio App Center è pianificato per il ritiro il 31 marzo 2025. Anche se è possibile continuare a usare Visual Studio App Center fino a quando non viene completamente ritirato, esistono diverse alternative consigliate a cui è possibile prendere in considerazione la migrazione.

Altre informazioni sulle sequenze temporali di supporto e sulle alternative.

Questo documento è un foglio informativo che condensa alcune informazioni uiTest per riferimento rapido, che contiene gli argomenti seguenti:

Scrittura di test

Questo frammento di codice è un boilerplate TestFixture per una classe di test in una singola piattaforma:

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

Per le soluzioni che coinvolgono sia Android che iOS, il codice seguente consentirà di scrivere uiTest multipiattaforma.

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

Le soluzioni Xamarin.Forms devono seguire le istruzioni descritte nella guida Automazione dei test di Xamarin.Forms con Xamarin.UITest e App Center.

Inizializzazione di Xamarin.UITest in iOS

Aggiungere il frammento di codice seguente al FinishedLaunching metodo della 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

Xamarin Test Cloud Agent usa API Apple non pubbliche, che causano il rifiuto delle app da parte del App Store. Il linker Xamarin.iOS rimuoverà l'agente cloud di test di Xamarin dall'IPA finale se non fa riferimento in modo esplicito in qualsiasi punto del codice. Le build di versione non hanno la ENABLE_TEST_CLOUD variabile del compilatore, che causa la rimozione dell'agente cloud di test di Xamarin dal bundle dell'app. Le compilazioni di debug hanno la direttiva del compilatore definita, impedendo al linker di rimuovere l'agente cloud di test di Xamarin.

Determinare l'ID dispositivo per il simulatore iOS

È possibile determinare l'UUID per i simulatori iOS in un computer, usare il instruments comando come illustrato di seguito:

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

Avvio di un'istanza del simulatore iOS

È possibile eseguire UITest in una versione e un simulatore iOS specifici usando l'ID dispositivo.

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

Ripristinare le impostazioni predefinite di un simulatore iOS

Questo frammento di codice può essere usato per arrestare un simulatore iOS specificato e ripristinarne le impostazioni predefinite:

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

Frammenti di codice

Questa sezione fornirà alcuni frammenti di codice che possono essere utili per la scrittura di test dell'interfaccia utente.

Esecuzione di query sugli elementi in base al valore della proprietà

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

Abilitare screenshot in locale

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

L'esempio di codice precedente inserisce gli screenshot nella directory in cui si trova l'assembly di test, assegnando un nome all'immagine screenshot-X-png.

Richiamare un metodo su un elemento AppResult o dell'interfaccia utente

È possibile eseguire metodi nativi sulle viste sottostanti con il AppQuery.Invoke metodo . Il metodo richiamato deve corrispondere al nome del metodo nativo, non al nome del metodo C#. Ad esempio, per richiamare il setGravity metodo in un android TextView:

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

Invoke Usa il metodo Java TextView.setGravity e non la proprietà C# TextView.Gravity.

Gestione delle autorizzazioni Android

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

Se si installa usando .ApkFile(apkpath) invece di PreferIdeSettings(), l'app viene concessa con autorizzazioni "all", che rimuovono i popup di autorizzazione. .ApkFile(apkpath) Nel metodo apkpath deve puntare al file apk compilato.