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
- ¿Cómo hago que Espresso espere hasta que Data Binding haya actualizado la Vista con el modelo de datos?
- IncompatibleClassChangeError: android.support.design.internal.NavigationMenuView
- ProgressBars y Espresso
- Espresso - Juego SeekBar
- Android.os.BaseBundle no se burla
- Cómo utilizar Espresso Idling Resource para llamadas de red
- ¿Cómo depurar las pruebas de instrumentación en Android Studio?
- Espresso ¿cómo probar si la actividad está terminada?
- Android Studio no reconoce las importaciones de Espresso
- ¿Cómo puedo probar por Espresso android.widget.TextView setError?
- Pedido de prueba con espresso
- Cómo hacer clic en el índice en el menú de opciones con Espresso Android
- ¿Cómo volver a ejecutar la prueba fallada en Espresso? - lluvia de ideas
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; } }
- Cómo abrir un archivo en Android mediante un intento
- Square LeakCanary No se puede encontrar el símbolo