Android Espresso Tests pour téléphone et tablette

Ma configuration: – Une application Android avec version de téléphone et de tablette – J'utilise Android Espresso pour les tests UI (maintenant uniquement pour la version du téléphone, avec le téléphone chez buildagent)

Ce que je veux faire: – Maintenant, je veux que Espresso distingue entre les tests pour le téléphone et la tablette. Donc, le test A ne doit être exécuté que par une tablette, le test B ne doit être exécuté que par un téléphone et Test C à la fois – Les tests devraient être exécutables via Tâche gradle

  • Comment choisir le bouton pour cliquer sur Robotium pour une boîte de dialogue d'alerte?
  • Android - MapView contenu dans une liste
  • Comment changer l'icône du menu de débordement Android
  • Effet de fondu entre les mises en page
  • Set textCursorDrawable programmatically
  • Changer la couleur de la barre d'état sur le changement de fragment
  • Désactiver l'affichage de la fenêtre d'exécution dans IntelliJ
  • Comparaison de Java swing MVC avec un modèle de conception Android
  • Développer une application d'écran de verrouillage Android
  • Affichage de gif dans Android
  • L'application Android se bloque lors de l'installation
  • Android: comment supprimer le fichier d'image interne
  • One Solution collect form web for “Android Espresso Tests pour téléphone et tablette”

    Trois options, toutes exécutables via les gradlew connectedAndroidTest ou custom gradle:

    1. Utilisez org.junit.Assume

    Des hypothèses avec assumer – junit-team / junit Wiki – Github :

    Le coureur JUnit par défaut traite les tests avec des hypothèses défaillantes comme ignorés. Les coureurs personnalisés peuvent se comporter différemment.

    Malheureusement, l' android.support.test.runner.AndroidJUnit4 ( com.android.support.test:runner:0.2 ) le coureur traite les hypothèses défaillantes en tant que tests défaillants.

    Une fois que ce comportement est corrigé, le suivant fonctionnerait (voir l'option 3 ci-dessous pour la source isScreenSw600dp() ):

    Téléphone uniquement: toutes les méthodes d'essai dans la classe

      @Before public void setUp() throws Exception { assumeTrue(!isScreenSw600dp()); // other setup } 

    Méthodes d'essai spécifiques

      @Test public void testA() { assumeTrue(!isScreenSw600dp()); // test for phone only } @Test public void testB() { assumeTrue(isScreenSw600dp()); // test for tablet only } 

    2. Utilisez une règle JUnit personnalisée

    D' une règle JUnit pour ignorer conditionnellement les tests :

    Cela nous a amené à créer une annotation ConditionalIgnore et une règle correspondante pour l'intégrer à l'exécution JUnit. La chose est simple et mieux expliquée avec un exemple:

     public class SomeTest { @Rule public ConditionalIgnoreRule rule = new ConditionalIgnoreRule(); @Test @ConditionalIgnore( condition = NotRunningOnWindows.class ) public void testFocus() { // ... } } public class NotRunningOnWindows implements IgnoreCondition { public boolean isSatisfied() { return !System.getProperty( "os.name" ).startsWith( "Windows" ); } } 

    ConditionalIgnoreRule code ici: JUnit règle pour ignorer conditionnellement les cas de test .

    Cette approche peut être facilement modifiée pour implémenter la méthode isScreenSw600dp() dans l'option 3 ci-dessous.


    3. Utilisez des conditions dans les méthodes d'essai

    C'est l'option la moins élégante, en particulier parce que les tests entièrement ignorés seront signalés comme transmis, mais c'est très simple à mettre en œuvre. Voici une classe d'essai préliminaire complète pour vous aider à démarrer:

     import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.ActivityInstrumentationTestCase2; import android.util.DisplayMetrics; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withId; @RunWith(AndroidJUnit4.class) public class DeleteMeTest extends ActivityInstrumentationTestCase2<MainActivity> { private MainActivity mActivity; private boolean mIsScreenSw600dp; public DeleteMeTest() { super(MainActivity.class); } @Before public void setUp() throws Exception { injectInstrumentation(InstrumentationRegistry.getInstrumentation()); setActivityInitialTouchMode(false); mActivity = this.getActivity(); mIsScreenSw600dp = isScreenSw600dp(); } @After public void tearDown() throws Exception { mActivity.finish(); } @Test public void testPreconditions() { onView(withId(R.id.your_view_here)) .check(matches(isDisplayed())); } @Test public void testA() { if (!mIsScreenSw600dp) { // test for phone only } } @Test public void testB() { if (mIsScreenSw600dp) { // test for tablet only } } @Test public void testC() { if (mIsScreenSw600dp) { // test for tablet only } else { // test for phone only } // test for both phone and tablet } private boolean isScreenSw600dp() { DisplayMetrics displayMetrics = new DisplayMetrics(); mActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); float widthDp = displayMetrics.widthPixels / displayMetrics.density; float heightDp = displayMetrics.heightPixels / displayMetrics.density; float screenSw = Math.min(widthDp, heightDp); return screenSw >= 600; } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.