¿Existe una manera de escribir una prueba de unidad para una API de destino

Estoy en el proceso de escribir ensayos instrumentados de Android en un área fueron Robolectric sombras personalizadas quedan cortos.

Idealmente, queremos escribir código que sea flexible en todas las versiones del SDK de Android sin embargo estoy en una situación de caso de borde donde necesito escribir una prueba de unidad individual para un método que funciona sólo Marshmallow.

También tengo que escribir una prueba de unidad que sólo funciona para Lollipop y bajo debido a las diferencias en las dependencias del sistema operativo (es decir, java.lang.NoClassDefFoundError)

¿Hay de todos modos puedo hacer esto a través de Junit4-como anotaciones o algo similar a lo que hace Robolectric donde se puede ignorar la ejecución de las pruebas si el SDK no es un buen ajuste?

No quiero escribir código así:

// MarshmallowWidgetTest.java @Test public void testPrintName() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // ...asserts... } } // LollipopWidgetTest.java @Test public void testPrintName() { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { // ...asserts... } } 

No estoy muy familiarizado con la unidad de pruebas o Robolectric , pero porque en el momento de escribir las pruebas de unidad por mí no había soporte para API 23 He utilizado esa configuración:

 @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) //this guy public class MainActivityTest { MainActivity_ activity = Robolectric.setupActivity(MainActivity_.class); } 

Así como usted ve hay una anotación que puede utilizar para sus clases de prueba.


EDITAR:

Lo siento que me centró sólo en Robolectric marco de prueba, no problema principal.

Para anotar las pruebas de instrumentación para la API específica que utilizaría:

1. Clase con @Antes de la anotación

Cree una clase con anotación @Before, donde verificará la API de los dispositivos probados. Si está mal, las pruebas fallarían en este método. Utilice fail(); método.

2. Utilice la anotación @SdkSuppress

Indica que una prueba o clase específica requiere un nivel API mínimo para ejecutarse.

Las pruebas se omitirán cuando se ejecuten en plataformas android menos que el nivel especificado.

De: http://developer.android.com/reference/android/support/test/filters/SdkSuppress.html

Por lo tanto, si establecía @SdkSuppress(minSdkVersion=23) , se ejecutaría sólo en dispositivos Android Marshmallow y si @ @SdkSuppress(minSdkVersion=20) se ejecutaría sólo en dispositivos API 5.0 superiores.

Lea también: http://www.vogella.com/tutorials/AndroidTesting/article.html

3. Cree su propia anotación como @SdkOnly

Tal vez este artículo sería útil: http://help.testdroid.com/customer/portal/articles/1256803-using-annotations-in-android-instrumentation-tests

4. Crear suites para sus pruebas de instrumentación específicas

Para ello, utilizaría @RunWith() y Suites.SuiteClasses() .

Para organizar la ejecución de sus pruebas unitarias instrumentadas, puede agrupar una colección de clases de prueba en una clase de suite de pruebas y ejecutar estas pruebas juntas. Los conjuntos de pruebas pueden anidarse; El conjunto de pruebas puede agrupar otros conjuntos de pruebas y ejecutar todas sus clases de prueba de componentes juntos.

Un paquete de pruebas está contenido en un paquete de prueba, similar al paquete de aplicación principal. Por convención, el nombre del paquete de paquete de prueba normalmente termina con el sufijo .suite (por ejemplo, com.example.android.testing.mysample.suite).

Para crear una suite de pruebas para sus pruebas unitarias, importe las RunWith JUnit RunWith y Suite . En el conjunto de pruebas, agregue las @RunWith(Suite.class) y @Suite.SuitClasses() . En la @Suite.SuiteClasses() , liste las clases de prueba individuales o las suites de prueba como argumentos.

El siguiente ejemplo muestra cómo implementar un conjunto de pruebas denominado UnitTestSuite que agrupa y ejecuta las clases de prueba CalculatorInstrumentationTest y CalculatorAddParameterizedTest .

 import com.example.android.testing.mysample.CalculatorAddParameterizedTest; import com.example.android.testing.mysample.CalculatorInstrumentationTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; // Runs all unit tests. @RunWith(Suite.class) @Suite.SuiteClasses({CalculatorInstrumentationTest.class, CalculatorAddParameterizedTest.class}) public class UnitTestSuite {} 

De: http://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html

5. Recursos útiles

Espero que ayude

  • Robolectric + OkHttp + retrofit + prueba de unidad rxJava
  • Ejecución de una prueba de unidad específica con gradle
  • ¿Hay alguien por ahí usando Robolectric sin Maven en IntelliJ?
  • Comprobación de que se ha iniciado una actividad con FLAG_ACTIVITY_CLEAR_TOP
  • Android: Unidad de pruebas de aplicaciones Android con Robolectric y Mockito
  • Cómo deshabilitar las pruebas de unidad de estudio de Android (androidTest)
  • Separar las pruebas de integración de las pruebas unitarias en Android Studio
  • Servicios Roboeléctricos y de Intención
  • Cobertura de código con jacoco para una biblioteca de Android
  • ¿Cómo configurar gradle para usar logback-classic SOLAMENTE para las pruebas de unidad en Android?
  • Archivo de cobertura de código Jacoco vacío que conduce a informes de cobertura falsa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.