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 controlada por el host. Esto significa que el lado del host del agente activará acciones en el dispositivo.

Ten en cuenta que consideramos “del lado del host” de prueba y "controlado por hosts" las pruebas sean un poco diferentes:

  • Prueba basada en host: Es una prueba que se ejecuta en el host y que interactúa con uno o o más dispositivos. El sistema a prueba (SUT) no está en el host, pero que se prueban desde el host.
  • Prueba del lado del host: Es una prueba que se ejecuta que solo se ejecuta en el host y 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?

Algunas pruebas podrían requerir que modifiques el estado general del dispositivo, como emitir una comando de reinicio. En el caso de la prueba de instrumentación, un reinicio eliminaría el la instrumentación, la prueba no pudo continuar y no habrá resultados disponibles.

Las pruebas controladas por 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 basada en el host puede manejar estos casos de uso y permitir pruebas avanzadas de el dispositivo con más situaciones. Si estás en esa situación, escribir un prueba basada en hosts tiene más sentido.

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

Aquí hay 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 host en la Federación de Comercio se realizan mediante 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

Cómo extender BaseHostJunit4Test es una forma de heredar una API de utilidades de prueba útil, como la siguiente:

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

También proporciona acceso al objeto del dispositivo Tradefed:

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

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

@BeforeClass y @AfterClass de JUnit4 solo se pueden aplicar a métodos estáticos. lo que impide usar el controlador #getDevice() para hacer algunas configuración o limpieza específicas del dispositivo, una sola vez y por clase. Para resolver este problema, usa la anotación 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 las propiedades que se pueden usarse en el alcance estático o no estático. BaseHostJUnit4Test admite obtener el TestInformation en un alcance no estático a través de #getTestInformation()

Si no estás extendiendo BaseHostJUnit4Test, puedes implementar ITestInformationReceiver para recibir el objeto TestInformation.

Cómo configurar una prueba basada en host en Tradefed

En el archivo de configuración XML de Tradefed, las pruebas controladas por el host se ejecutan a través del Prueba de host Runner.

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