Loupe

[Xamarin] A la découverte de Xamarin UI Tests

Annoncé lors de l’Evolve 2014, Xamarin UI Tests est une solution permettant d’automatiser les tests d’interfaces graphiques dans vos applications iOS et Android. Nosu allons donc voir, d’un peu plus prêt, comment tout ceci se peut se mettre en place.

Basé sur Calabash, un Framework d’automatisation des tests d’interfaces graphiques sur Android et iOS, Xamarin UI Tests va vous permettre de développer des tests qui valideront les vos interfaces graphiques: est-ce que mon IHM comporte bien un bouton qui contient le texte demandé ? Est-ce qu’un click sur le bouton affiche bien la boite de dialogue ? Etc.

Couplé à Xamarin Test Cloud, vous aurez même la possibilité d’exécuter vos tests sur des centaines de devices différents, pour vous assurer que votre application s’exécute correctement quelque soit le matériel utilisé.

 

Pour mettre en place ce type de projet, il faut commencer par disposer d’une application. Dans notre cas, nous allons partir sur un projet de base. Le code AXML est donc le suivant:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/MyButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/Hello" />
</LinearLayout>

Et le code C# associé est celui-ci:

[Activity(Label = "TestXamarinUiTests", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    int count = 1;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button>(Resource.Id.MyButton);

        button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
    }
}

Une fois l’application développée, il faut créer le projet de tests. Xamarin UI Tests utilise le Framework NUnit pour exécuter vos tests donc il faut rajouter un projet de tests de type NUnit, ainsi que la référence au package Nuget de Xamarin UI Tests:

image

Une fois cette étape réalisée, il faut générer un APK qui sera utiliser pour exécuter les tests. Pour cela, il faut se mettre dans la configuration “Release” puis générer/utiliser la clé permettant de signer l’APK (depuis le menu “Tools” –> “Android” –> “Publish Android App”):

image

image

image

Attention, au moment où vous générer votre APK, pensez à bien vérifier dans les propriétés du projet que les architectures désirées sont bien sélectionnées (par exemple, ne pas oublier x86 pour les émulateurs comment le Xamarin Android Player):

image

Une fois l’APK généré, il convient maintenant d’écrire les tests! Tout d’abord, il faut configurer le contexte des runs pour lui indiquer quelle application doit être utilisée:

[TestFixture]
public class MainTests
{
     private IApp _app;

     [TestFixtureSetUp]
     public void TestFixtureSetup()
     {
          _app =
              ConfigureApp.Android.ApkFile(@"..\..\..\TestXamarinUiTests.TestXamarinUiTests-Aligned.apk")
                  .EnableLocalScreenshots()
                  .StartApp();
     }
}

Noter l’utilisation de la méthode EnableLocalScreenshots qui permet d’activer les captures d’écrans en local (dans le cas d’une utilisation commune avec Xamarin Test Cloud, les screenshots seront visibles sur le portail).

Une fois la configuration faite, il ne reste plus qu’à écrire les tests. Nous pouvons par exemple récupérer les contrôles d’un certains types:

[Test]
public void CheckThatThereIsOnlyOneButton()
{
    var results = _app.Query(query => query.All("Button"));
    
    Assert.IsTrue(results.Length == 1);
}

Ou bien nous pouvons récupérer les contrôles en utilisant leur identifiant:

[Test]
public void ClickOnTheFirstButton()
{
    _app.Tap(query => query.Id("MyButton"));

    var button = _app.Query(query => query.Id("MyButton")).FirstOrDefault();
    
    Assert.IsNotNull(button);
    Assert.AreEqual(button.Text, "1 clicks!");
}

Vous souhaitez prendre une photo pour valider visuellement que l’interface correspond à ce que vous avez imaginé ? Rien de plus simple:

var screenShotInfo = _app.Screenshot("First clic");
var directoryPath = screenShotInfo.DirectoryName;

La méthode Screenshot retourne un objet de type FileInfo que vous pouvez interroger pour avoir accès à l’image générée:

screenshot-1

Une fois les tests écrits, il ne reste plus qu’à les exécuter en utilisant Visual Studio ou Xamarin Studio. Dans le cas d’une application Android, il faut qu’un émulateur soit démarré pour que cela fonctionne (pour iOS, l’émulateur est capable de démarrer automatiquement). De plus, la durée d’exécution des tests est limitée à 15min (sauf pour les abonnés à Xamarin Test Cloud, qui n’ont pas de limite de temps).

Voici une vidéo qui vous présente le résultat de l’exécution des tests précédents, qui vous montre bien que les tests sont exécutés automatiquement et qu’ils passent au vert:

Lien direct vers la vidéo: https://www.youtube.com/watch?v=tvAUkClBpTo

Bien sur, beaucoup d’autres méthodes sont disponibles afin de tester vos applications:

image

N’hésitez pas à jeter un coup d’oeil à la documentation officielle de IApp, AndroidApp ou iOSApp.

Pour en savoir plus de manière générale sur Xamarin UI Tests, c’est par ici et par !

 

Happy coding!

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus