Google se compromete a promover la equidad racial para las comunidades negras. Ver cómo.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Orientación a un ejemplo de aplicación

Esta categoría de prueba de instrumentación no es tan diferente de las que se dirigen a las aplicaciones normales de Android. Vale la pena señalar que la aplicación de prueba que incluía la instrumentación debe firmarse con el mismo certificado que la aplicación a la que se dirige.

Tenga en cuenta que esta guía asume que ya tiene algún conocimiento en el flujo de trabajo del árbol fuente de la plataforma. De lo contrario, consulte https://source.android.com/source/requirements. El ejemplo cubierto aquí es escribir una nueva prueba de instrumentación con el paquete de destino establecido en su propio paquete de aplicación de prueba. Si no está familiarizado con el concepto, lea la introducción de prueba de Plataforma .

Esta guía utiliza la siguiente prueba para servir como muestra:

  • frameworks / base / paquetes / Shell / pruebas

Se recomienda examinar primero el código para obtener una impresión aproximada antes de continuar.

Decidir sobre una ubicación de origen

Debido a que la prueba de instrumentación estará dirigida a una aplicación, la convención es colocar el código fuente de prueba en un directorio de tests debajo de la raíz del directorio fuente de componentes en el árbol fuente de la plataforma.

Vea más discusiones sobre la ubicación de origen en el ejemplo de extremo a extremo para pruebas de autoinstrucción .

Archivo de manifiesto

Al igual que una aplicación normal, cada módulo de prueba de instrumentación necesita un archivo de manifiesto. Si nombra el archivo como AndroidManifest.xml y lo proporciona junto a Android.mk para su módulo de prueba, el archivo BUILD_PACKAGE básico BUILD_PACKAGE incluirá automáticamente.

Antes de continuar, es muy recomendable pasar primero por la Descripción general del manifiesto de la aplicación .

Esto proporciona una descripción general de los componentes básicos de un archivo de manifiesto y sus funcionalidades.

Se puede acceder a la última versión del archivo de manifiesto para el cambio de gerrit de muestra en: https://android.googlesource.com/platform/frameworks/base/+/master/packages/Shell/tests/AndroidManifest.xml

Aquí se incluye una instantánea para mayor comodidad:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.shell.tests">

    <application>
        <uses-library android:name="android.test.runner" />

        <activity
            android:name="com.android.shell.ActionSendMultipleConsumerActivity"
            android:label="ActionSendMultipleConsumer"
            android:theme="@android:style/Theme.NoDisplay"
            android:noHistory="true"
            android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
            </intent-filter>
        </activity>
    </application>

    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
        android:targetPackage="com.android.shell"
        android:label="Tests for Shell" />

</manifest>
 

Algunas observaciones selectas en el archivo de manifiesto:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.shell.tests">
 

El atributo del package es el nombre del paquete de la aplicación: este es el identificador único que el marco de la aplicación de Android utiliza para identificar una aplicación (o en este contexto: su aplicación de prueba). Cada usuario en el sistema solo puede instalar una aplicación con ese nombre de paquete.

Como se trata de un paquete de aplicación de prueba, independiente del paquete de aplicación bajo prueba, se debe utilizar un nombre de paquete diferente: una convención común es agregar un sufijo .test .

Además, este atributo del package es el mismo que lo que ComponentName#getPackageName() , y también lo mismo que usaría para interactuar con varios comandos sub pm través de adb shell .

Tenga en cuenta también que, aunque el nombre del paquete suele tener el mismo estilo que el nombre del paquete Java, en realidad tiene muy pocas cosas que ver con él. En otras palabras, su paquete de aplicación (o prueba) puede contener clases con cualquier nombre de paquete, aunque, por otro lado, puede optar por la simplicidad y tener su nombre de paquete Java de nivel superior en su aplicación o prueba idéntica al nombre del paquete de la aplicación.

 <uses-library android:name="android.test.runner" />
 

Esto es necesario para todas las pruebas de Instrumentación, ya que las clases relacionadas se empaquetan en un archivo de biblioteca jar de marco separado, por lo tanto, se requieren entradas de classpath adicionales cuando el marco de aplicación invoca el paquete de prueba.

 android:targetPackage="com.android.shell"
 

Esto establece el paquete de destino de la instrumentación en com.android.shell.tests . Cuando se invoca la instrumentación a través am instrument comando am instrument , el marco reinicia el proceso com.android.shell.tests e inyecta el código de instrumentación en el proceso para la ejecución de la prueba. Esto también significa que el código de prueba tendrá acceso a todas las instancias de clase que se ejecutan en la aplicación bajo prueba y puede ser capaz de manipular el estado dependiendo de los ganchos de prueba expuestos.

Archivo de configuración simple

Cada nuevo módulo de prueba debe tener un archivo de configuración para dirigir el sistema de compilación con metadatos del módulo, dependencias en tiempo de compilación e instrucciones de empaquetado. En la mayoría de los casos, la opción de archivo Blueprint basada en Soong es suficiente. Consulte Configuración de prueba simple para más detalles.

Archivo de configuración compleja

Para pruebas más complejas, también debe escribir un archivo de configuración de prueba para el arnés de prueba de Android, Trade Federation .

La configuración de prueba puede especificar opciones especiales de configuración del dispositivo y argumentos predeterminados para proporcionar la clase de prueba.

Se puede acceder a la última versión del archivo de configuración para el cambio de gerrit de muestra en: frameworks / base / packages / Shell / tests / AndroidTest.xml

Aquí se incluye una instantánea para mayor comodidad:

 <configuration description="Runs Tests for Shell.">
    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
        <option name="test-file-name" value="ShellTests.apk" />
    </target_preparer>

    <option name="test-suite-tag" value="apct" />
    <option name="test-tag" value="ShellTests" />
    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
        <option name="package" value="com.android.shell.tests" />
        <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
    </test>
</configuration>
 

Algunas observaciones selectas en el archivo de configuración de prueba:

 <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
  <option name="test-file-name" value="ShellTests.apk"/>
</target_preparer>
 

Esto le dice a la Federación de Comercio que instale ShellTests.apk en el dispositivo de destino usando un target_preparer especificado. Hay muchos preparadores de objetivos disponibles para los desarrolladores en Trade Federation y estos se pueden usar para garantizar que el dispositivo esté configurado correctamente antes de la ejecución de la prueba.

 <test class="com.android.tradefed.testtype.AndroidJUnitTest">
  <option name="package" value="com.android.shell.tests"/>
  <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
</test>
 

Esto especifica la clase de prueba de la Federación de Comercio que se utilizará para ejecutar la prueba y pasa en el paquete en el dispositivo que se ejecutará y el marco del corredor de prueba que es JUnit en este caso.

Mire aquí para obtener más información sobre las configuraciones del módulo de prueba

Características de JUnit4

El uso de la biblioteca de android-support-test como corredor de prueba permite la adopción de nuevas clases de prueba de estilo JUnit4, y el cambio de gerrit de muestra contiene un uso muy básico de sus características.

Se puede acceder al último código fuente para el cambio de gerrit de muestra en: frameworks / base / packages / Shell / tests / src / com / android / shell / BugreportReceiverTest.java

Si bien los patrones de prueba suelen ser específicos para los equipos de componentes, existen algunos patrones de uso generalmente útiles.

 @SmallTest
@RunWith(AndroidJUnit4.class)
public final class FeatureFactoryImplTest {
 

Una diferencia significativa en JUnit4 es que ya no se requieren pruebas para heredar de una clase de prueba base común; en su lugar, escribe pruebas en clases simples de Java y usa anotaciones para indicar ciertas configuraciones y restricciones de prueba. En este ejemplo, estamos instruyendo que esta clase se ejecute como una prueba JUnit4 de Android.

La anotación @SmallTest especificó un tamaño de prueba para toda la clase de prueba: todos los métodos de prueba agregados a esta clase de prueba heredan esta anotación de tamaño de prueba. configuración de la clase previa a la prueba, desmantelamiento posterior a la prueba y tearDown clase posterior a la prueba: similar a los métodos setUp y tearDown en JUnit4. Test anotación de Test se utiliza para anotar la prueba real.

     @Before
    public void setup() {
    ...
    @Test
    public void testGetProvider_shouldCacheProvider() {
    ...
 

@Before utiliza la anotación @Before en los métodos para realizar la configuración previa a la prueba. Aunque no se usa en este ejemplo, también existe @After para el desmontaje posterior a la prueba. Del mismo modo, las anotaciones @BeforeClass y @AfterClass se pueden usar en métodos por JUnit4 para realizar la configuración antes de ejecutar todas las pruebas en una clase de prueba, y luego desmontarlas. Tenga en cuenta que la configuración del alcance de clase y los métodos de desmontaje deben ser estáticos.

En cuanto a los métodos de prueba, a diferencia de la versión anterior de JUnit, ya no necesitan comenzar el nombre del método con test , en su lugar, cada uno de ellos debe estar anotado con @Test . Como de costumbre, los métodos de prueba deben ser públicos, no declarar ningún valor de retorno, no tomar parámetros y pueden arrojar excepciones.

         Context context = InstrumentationRegistry.getTargetContext();
 

Debido a que las pruebas JUnit4 ya no requieren una clase base común, ya no es necesario obtener instancias de Context través de getContext() o getTargetContext() través de métodos de clase base; en cambio, el nuevo corredor de pruebas los administra a través de InstrumentationRegistry donde se almacena la configuración contextual y ambiental creada por el marco de instrumentación. A través de esta clase, también puede llamar a:

  • getInstrumentation() : la instancia a la clase Instrumentation
  • getArguments() : los argumentos de la línea de comando pasados ​​a un am instrument través de -e <key> <value>

Construye y prueba localmente

Para los casos de uso más comunes, emplee Atest .

Para casos más complejos que requieren una personalización más pesada, siga las instrucciones de instrumentación .