Xamarin.UITest-Spickzettel

Wichtig

Visual Studio App Center wird am 31. März 2025 eingestellt. Sie können Visual Studio App Center zwar weiterhin verwenden, bis es vollständig eingestellt ist, es gibt jedoch mehrere empfohlene Alternativen, zu denen Sie möglicherweise eine Migration in Erwägung ziehen.

Erfahren Sie mehr über Supportzeitpläne und Alternativen.

Dieses Dokument ist ein Spickzettel, in dem einige UITest-Informationen zusammengefasst werden, um eine Kurzübersicht zu erhalten, es enthält die folgenden Themen:

Schreiben von Tests

Dieser Codeausschnitt ist ein Boilerplate TestFixture für eine Testklasse auf einer einzelnen Plattform:

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

Für Lösungen, die sowohl Android als auch iOS betreffen, hilft der folgende Code beim Schreiben plattformübergreifender UITests.

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-Lösungen sollten die Anweisungen befolgen, die im Leitfaden Zum Automatisieren von Xamarin.Forms-Tests mit Xamarin.UITest und App Center beschrieben sind.

Initialisieren von Xamarin.UITest unter iOS

Fügen Sie der Methode der AppDelegate-Klasse den FinishedLaunching folgenden Codeausschnitt hinzu:

#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

Der Xamarin Test Cloud Agent verwendet nicht öffentliche Apple-APIs, wodurch Apps vom App Store abgelehnt werden. Der Xamarin.iOS-Linker entfernt den Xamarin Test Cloud-Agent aus dem endgültigen IPA, wenn er nicht explizit vom Code referenziert wird. Releasebuilds verfügen nicht über die ENABLE_TEST_CLOUD Compilervariable, wodurch der Xamarin Test Cloud Agent aus dem App-Paket entfernt wird. Bei Debugbuilds ist die Compilerdirektive definiert, die verhindert, dass der Linker den Xamarin Test Cloud Agent entfernt.

Ermitteln der Geräte-ID für den iOS-Simulator

Sie können die UUID für die iOS-Simulatoren auf einem Computer ermitteln, und verwenden Sie den instruments Folgenden Befehl:

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

Starten einer iOS-Simulatorinstanz

Es ist möglich, UITests für eine bestimmte iOS-Version und einen bestimmten Simulator mithilfe der Geräte-ID auszuführen.

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

Zurücksetzen eines iOS-Simulators auf Werkseinstellungen

Dieser Codeausschnitt kann verwendet werden, um einen bestimmten iOS-Simulator zu beenden und ihn auf die Werkseinstellungen zurückzusetzen:

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

Codeausschnitte

In diesem Abschnitt werden einige Codeausschnitte bereitgestellt, die beim Schreiben von UITests hilfreich sein können.

Abfragen von Elementen basierend auf dem Eigenschaftswert

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

Screenshots lokal aktivieren

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

Im obigen Codebeispiel werden Screenshots in das Verzeichnis eingefügt, in dem sich die Testassembly befindet, wobei das Image screenshot-X-pngbenannt wird.

Aufrufen einer Methode für ein AppResult- oder UI-Element

Es ist möglich, native Methoden für zugrunde liegende Ansichten mit der AppQuery.Invoke -Methode auszuführen. Die aufgerufene Methode muss mit dem Namen der nativen Methode und nicht mit dem Namen der C#-Methode übereinstimmen. So rufen Sie beispielsweise die setGravity -Methode auf einem Android-Gerät TextViewauf:

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

Die Invoke verwendet die Java-Methode TextView.setGravity und nicht die C# -TextView.Gravity-Eigenschaft .

Behandeln von Android-Berechtigungen

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

Wenn Sie mithilfe .ApkFile(apkpath) von anstelle von PreferIdeSettings()installieren, werden der App "alle"-Berechtigungen gewährt, wodurch die Berechtigungs-Popups entfernt werden. In der .ApkFile(apkpath) -Methode apkpath muss auf die kompilierte apk-Datei verweisen.