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 obtenir la hauteur d'écran disponible moins Barre de navigation dans HoneyComb?
  • Comment mettre en œuvre la nouvelle version Google Maps de l'API v2
  • Android Lock Apps
  • Ligne dessiné au-dessous de la vue de texte ne s'affiche pas
  • Android Studio - Problème avec Android SDK sur Windows 7
  • HAXM ne fonctionne pas sur Linux
  • Comment obtenir l'étiquette localisée des types de téléphone?
  • Affichage personnalisé par clic dans Notification sur Android 2.3 ou inférieur
  • Créer un menu de style "ok en verre", dans une application en verre
  • Android Build Tools ne construit que x86_64, peu importe quoi. APK est installé via AdB, mais il est incompatible avec Play Store
  • Android: obtenez l'emplacement actuel de l'utilisateur sans utiliser GPS ou internet
  • Comment revenir au style par défaut sur EditText si j'applique un fond d'écran?
  • 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.