Cómo escribir una prueba dirigida por el host en Trade Federation

En esta página, se describe cómo escribir una prueba de dispositivo de estilo JUnit4 controlada por el host. Esto significa que el lado del arnés del host activará acciones en el dispositivo.

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

  • prueba controlada 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 el host.
  • Prueba del host: Es una prueba que se ejecuta exclusivamente en el host y prueba algo solo en el host, por ejemplo, pruebas de unidades.

¿Por qué crear una prueba controlada por 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 detendría la instrumentación, la prueba no podría continuar y no habría resultados disponibles.

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

Una prueba controlada 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, escribir una prueba controlada por el host es lo más lógico.

¿Cómo se escriben las pruebas controladas 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 controladas por el host en Trade Federation se controlan con el ejecutor de pruebas JUnit4 DeviceJUnit4ClassRunner. La estructura general de la clase de prueba es la misma que la de una prueba JUnit4 normal:

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

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

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

También proporciona acceso al objeto del dispositivo Tradefed:

  • getDevice(): Devuelve un objeto de dispositivo de TF para manipular el dispositivo.
  • getBuild(): Devuelve un objeto de TF de información de compilación para obtener información sobre la compilación.
  • getAbi(): Devuelve la ABI con 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 imposibilita el uso del controlador #getDevice() para realizar alguna configuración o limpieza por única vez y específica del dispositivo. Para resolver este problema, usa la anotación de Tradefed.

  • @BeforeClassWithInfo: Se ejecuta antes de las anotaciones @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 usar 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 controlada por el host en Tradefed?

En el archivo de configuración XML de Tradefed, las pruebas controladas 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>