Escribir una prueba basada en el host en la Federación de Comercio

En esta página, se describe cómo escribir una prueba de dispositivo de estilo JUnit4 que ejecuta el host. Esto significa que el lado del host del agente activará acciones contra el dispositivo.

Ten en cuenta que consideramos que las pruebas "del host" y las pruebas "controladas por el host" son ligeramente distintas:

  • Prueba dirigida por el host: Es una prueba que se ejecuta en el host y que interactúa con uno o más dispositivos. El sistema en prueba (SUT) no está en el host, sino que se prueba desde él.
  • Prueba del host: Es una prueba que se ejecuta únicamente en el host y que prueba algo solo en el host, por ejemplo, pruebas de unidades.

¿Por qué crear una prueba basada en el host en lugar de una prueba de instrumentación?

Es posible que algunas pruebas requieran que afectes el estado general del dispositivo, como emitir un comando de reinicio. En el caso de prueba de instrumentación, un reinicio finalizaría la instrumentación, la prueba no podría continuar y no habría resultados disponibles.

Las pruebas dirigidas por el host también pueden generar pasos de configuración adicionales que requieren interacción con dispositivos externos de los que depende la prueba.

Una prueba dirigida por el host puede controlar estos casos de uso y permitir pruebas avanzadas del dispositivo con más situaciones. Si te encuentras en esa situación, lo más conveniente es escribir una prueba dirigida por el host.

¿Cómo se escriben las pruebas dirigidas por el host en TF?

A continuación, se muestra un ejemplo:

@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
    @Before
    public void setUp() throws Exception {
       // Some setup
    }

    @Test
    public void testCheckWeHaveDevice() throws Exception {
        Assert.assertNotNull(getDevice());
    }
}

Las pruebas dirigidas por el host en Trade Federation se basan en el ejecutor de pruebas DeviceJUnit4ClassRunner de JUnit4. La estructura general de la clase de prueba es la misma que la de una prueba normal de JUnit4:

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass
  • Assume, Assert

Extender BaseHostJunit4Test es una forma de heredar API de utilidades de prueba útiles, como las siguientes:

  • installPackage: Permite instalar un APK en el dispositivo de destino.
  • installPackageAsUser: Permite instalar un APK como un usuario en el dispositivo de destino.
  • uninstallPackage: Permite desinstalar un APK.
  • isPackageInstalled: Comprueba si un paquete está instalado o no.
  • hasDeviceFeature: Verifica si el dispositivo admite una función o no. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): Ejecuta una prueba de instrumentación en un dispositivo de destino mediante DeviceTestRunOptions para controlar todas las opciones posibles.

También proporciona acceso al objeto de dispositivo de Tradefed:

  • getDevice(): Muestra un objeto de dispositivo de TF para manipularlo.
  • getBuild(): Muestra un objeto de TF de información de compilación para obtener información sobre la compilación.
  • getAbi(): Muestra la ABI en la que se ejecuta la prueba.

Compatibilidad con Tradefed: Preparación y limpieza de dispositivos por clase

JUnit4 @BeforeClass y @AfterClass solo se aplican a métodos estáticos, lo que hace imposible usar el controlador #getDevice() para realizar alguna configuración o limpieza específica del dispositivo, única y por clase. Para resolver este problema, usa la anotación de Tradefed.

  • @BeforeClassWithInfo: Se ejecuta antes que @BeforeClass.
  • @AfterClassWithInfo: Se ejecuta después de las anotaciones @AfterClass.
   @BeforeClassWithInfo
   public static void beforeClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

   @AfterClassWithInfo
   public static void afterClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

TestInformation te permite usar el dispositivo y almacenar propiedades que se pueden utilizar en el alcance estático o no estático. BaseHostJUnit4Test admite la obtención de TestInformation en un alcance no estático a través de #getTestInformation().

Si no extiendes BaseHostJUnit4Test, puedes implementar ITestInformationReceiver para recibir el objeto TestInformation.

¿Cómo configurar una prueba dirigida por el host en Tradefed?

En el archivo de configuración XML de Tradefed, las pruebas dirigidas por el host se ejecutan a través del ejecutor HostTest.

<test class="com.android.tradefed.testtype.HostTest" >
    <option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>