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 host del arnés activará acciones contra el dispositivo.

Ten en cuenta que consideramos que las pruebas "del lado 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 lado del host: Es una prueba que se ejecuta puramente en el host y que 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 la 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 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 conveniente.

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

Aquí tienes 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 panel de prueba DeviceJUnit4ClassRunner JUnit4. 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 la 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 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 o no (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 de dispositivo Tradefed:

  • getDevice(): Muestra un objeto de dispositivo TF para manipular el dispositivo.
  • getBuild(): Muestra un objeto 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 imposibilita el uso del controlador #getDevice() para realizar una configuración o limpieza única y específica del dispositivo por clase. Para resolver este problema, usa la anotación 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 obtener TestInformation en un permiso 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 panel de prueba HostTest.

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