Android Espresso Pruebas para teléfono y tableta

Mi configuración: – Aplicación de Android con teléfono y la versión de Tablet – Estoy usando Android Espresso para UI-Tests (ahora sólo para la versión de teléfono, con el teléfono en buildagent)

Lo que quiero hacer: – Ahora quiero Espresso para distinguir entre las pruebas de teléfono y tableta – Así que la prueba A debe ser sólo ejecutar por una tableta, la prueba B sólo debe ser ejecutado por un teléfono y la prueba C tanto – Las pruebas deben ser ejecutables a través de Tarea del gradle

Tres opciones, todas las cuales son ejecutables a través de gradlew connectedAndroidTest o tareas personalizadas de gradle:

1. Utilizar org.junit.Assume

De Asunciones con asumir – junit-team / junit Wiki – Github :

El defecto JUnit runner trata las pruebas con suposiciones fallidas como ignoradas. Los corredores personalizados pueden comportarse de manera diferente.

Desafortunadamente, el com.android.support.test:runner:0.2 android.support.test.runner.AndroidJUnit4 ( com.android.support.test:runner:0.2 ) trata las suposiciones fallidas como pruebas fallidas.

Una vez que este comportamiento es fijo, lo siguiente funcionaría (consulte la opción 3 a continuación para el isScreenSw600dp() de isScreenSw600dp() ):

Sólo teléfono: todos los métodos de prueba en la clase

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

Métodos de prueba específicos

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

2. Utilice una regla personalizada de JUnit

De una regla JUnit a las pruebas condicionalmente ignoradas :

Esto nos llevó a crear una anotación ConditionalIgnore y una regla correspondiente para conectarla al runtime de JUnit. La cosa es simple y mejor explicada con un ejemplo:

 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 código aquí: JUnit regla para condicionalmente ignorar casos de prueba .

Este enfoque puede modificarse fácilmente para implementar el método isScreenSw600dp() en la Opción 3 a continuación.


3. Usar condicionales en los métodos de prueba

Esta es la opción menos elegante, sobre todo porque las pruebas totalmente ignoradas serán reportadas como aprobadas, pero es muy fácil de implementar. Aquí hay una clase completa de prueba de muestra para empezar:

 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; } } 
  • NullPointer Excepción al usar Espresso
  • Prueba de centrifugadoras dinámicas espresso
  • Android + Espresso + solicitud HTTP asíncrona -> cómo probar?
  • Actividad de ensayo y fragmento específico con espresso
  • Error = No se puede encontrar información de instrumentación para: ComponentInfo {}
  • Compruebe si el teclado flexible está visible utilizando espresso
  • Prueba Espresso que ImageView contiene un dibujable
  • Cómo utilizar Espresso Idling Resource
  • Asegurar el número adecuado de elementos en la lista con espresso
  • Appium vs Espresso para el marco de pruebas automatizado
  • Gradle JUnit Espresso en el emulador connectedAndroidTest java.lang.IncompatibleClassChangeError
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.