79 votes

Comment tester une application Android à travers de multiples Activités?

Nous sommes la construction d'un complexe de l'application Android, composé de plusieurs écrans et des flux de travail, réparties à travers de nombreuses Activités. Notre flux de travail sont similaires à ce que vous pourriez voir sur une Banque distributeur automatique de billets, par exemple, il y a un Activity pour les identifiants de connexion que les transitions d'un menu principal, Activity qui peut passer à d'autres activités en fonction de l'utilisateur sur le choix.

Depuis que nous avons tellement de nombreux flux de travail, nous avons besoin de créer des tests automatisés qui s'étendent sur plusieurs activités afin que nous puissions tester un flux de travail de bout en bout. Par exemple, à l'aide de l'ATM exemple, nous voulons entrer un NIP valide, vérifiez que nous envoie le menu principal, choisissez de retirer de l'argent, vérifier que nous sommes sur la retirer de l'argent de l'écran, etc., etc., et finalement nous retrouver sur le menu principal ou "connecté".

Nous avons joué avec le test Api qui viendra avec Android (par exemple, ActivityInstrumentationTestCase2) et la Tomographie, mais ils ne semblent capables de tester au-delà des limites d'un seul Activity, et si l'on peut trouver une certaine utilité dans ces outils de tests unitaires, ils ne seront pas répondre à nos besoins pour les scénarios de test qui coupe à travers de multiples Activités.

Nous sommes ouverts à un xUnit cadre, les scripts, le GUI enregistreurs/lecture, etc. et il serait souhaitable que tous les conseils.

65voto

SingleShot Points 9258

Je me sens un peu à l'aise pour répondre à ma propre bounty question, mais ici il est...

J'ai cherché haut et bas sur le présent et ne peux pas croire il n'y a pas de réponse publié n'importe où. Je suis venu très près. Je peux certainement exécuter des tests qui couvrent les activités de maintenant, mais ma mise en œuvre semble avoir quelques problèmes de timing où les tests ne sont pas toujours transmettre de manière fiable. C'est le seul exemple que je connais que les tests à travers de multiples activités avec succès. J'espère que mon extraction et de préservation de l'anonymat de ne pas introduire des erreurs. C'est une approche simpliste de test où j'ai taper un nom d'utilisateur et mot de passe dans une activité de connexion, et d'observer un bon message de bienvenue est affiché sur un autre "bienvenue" activité:

package com.mycompany;

import android.app.*;
import android.content.*;
import android.test.*;
import android.test.suitebuilder.annotation.*;
import android.util.*;
import android.view.*;
import android.widget.*;

import static org.hamcrest.core.Is.*;
import static org.hamcrest.core.IsNull.*;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.*;
import static com.mycompany.R.id.*;

public class LoginTests extends InstrumentationTestCase {

   @MediumTest
   public void testAValidUserCanLogIn() {

      Instrumentation instrumentation = getInstrumentation();

      // Register we are interested in the authentication activiry...
      Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(AuthenticateActivity.class.getName(), null, false);

      // Start the authentication activity as the first activity...
      Intent intent = new Intent(Intent.ACTION_MAIN);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      intent.setClassName(instrumentation.getTargetContext(), AuthenticateActivity.class.getName());
      instrumentation.startActivitySync(intent);

      // Wait for it to start...
      Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
      assertThat(currentActivity, is(notNullValue()));

      // Type into the username field...
      View currentView = currentActivity.findViewById(username_field);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(EditText.class));
      TouchUtils.clickView(this, currentView);
      instrumentation.sendStringSync("MyUsername");

      // Type into the password field...
      currentView = currentActivity.findViewById(password_field);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(EditText.class));
      TouchUtils.clickView(this, currentView);
      instrumentation.sendStringSync("MyPassword");

      // Register we are interested in the welcome activity...
      // this has to be done before we do something that will send us to that
      // activity...
      instrumentation.removeMonitor(monitor);
      monitor = instrumentation.addMonitor(WelcomeActivity.class.getName(), null, false);

      // Click the login button...
      currentView = currentActivity.findViewById(login_button;
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(Button.class));
      TouchUtils.clickView(this, currentView);

      // Wait for the welcome page to start...
      currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
      assertThat(currentActivity, is(notNullValue()));

      // Make sure we are logged in...
      currentView = currentActivity.findViewById(welcome_message);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(TextView.class));
      assertThat(((TextView)currentView).getText().toString(), is("Welcome, MyUsername!"));
   }
}

Ce code n'est évidemment pas très lisible. J'ai extrait une simple bibliothèque avec un anglais qui ressemble à de l'API si je peux juste dire des choses comme ceci:

type("myUsername").intoThe(username_field);
click(login_button);

Je l'ai testé à une profondeur d'environ 4 activités et je suis convaincu que l'approche fonctionne bien comme je l'ai dit, il semble y avoir occasionnellement un problème de timing, je n'ai pas complètement compris. Je suis toujours intéressé par de tout autres moyens de tester les différentes activités.

22voto

Jonas Söderström Points 2811

Jetez un oeil à Robotium
un " open-source framework de test créé pour rendre automatique de la boîte noire test des applications Android nettement plus rapide et plus facile que ce qui est possible avec Android instrumentation tests out-of-the-box.'

Page d'accueil: http://www.robotium.org/
Source: http://github.com/jayway/robotium

Veuillez noter que le Robotium projet est maintenu par la société où je travaille

8voto

Renas Points 1523

Vous pouvez toujours utiliser Robotium. Il prend en charge blackbox tests comme le Sélénium, mais pour Android. Vous le trouverez à Robotium.org

4voto

John Lehmann Points 1659

Je suis surpris que personne n'a mentionné quelques-uns des principaux automatisé fonctionnelle des outils de test. En comparaison avec Robotium, ceux-ci ne nécessite pas l'écriture de code Java.

MonkeyTalk: un outil open-source soutenu par la société des Gorilles de la Logique. Avantages: permet l'enregistrement ainsi qu'une augmentation du niveau de langage de script plus facile pour les utilisateurs non-techniques, et est multi-plateforme (iOS comprend). Compte tenu de ces avantages sont les exigences, nous avons constaté que cela soit la meilleure solution. Il permet également la personnalisation au-delà de ce qui peut être fait dans leur langage de script à l'aide de Javascript.

Calebasse-Android: un outil open-source pour le Concombre de caractéristiques de style. Pour: fonctionnalités d'écriture dans le Cornichon langue qui est des Affaires Lisible, Spécifique au Domaine de la Langue, qui permet de décrire les logiciels de comportement sans préciser comment ce comportement est mis en œuvre. Similaire, mais pas exact de support est disponible pour iOS en concombre-ios. Capacités d'enregistrement ne sont pas aussi bonnes, car ils produisent une sortie binaire.

Quelques autres références:

3voto

Brian Kyckelhahn Points 329

J'ai créé un record-et-la lecture de l'outil pour Android et mis à disposition sur GitHub. Il est facile à configurer et à utiliser, ne nécessite aucune programmation, va à l'encontre de véritables appareils (qui n'ont pas à être ancrée) et enregistre automatiquement des captures d'écran qu'il joue les tests.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X