Escribir una prueba dirigida por host en Trade Federation

Esta página describe cómo escribir una prueba de dispositivo de estilo JUnit4 impulsada por el host. Esto significa que el lado del host del arnés activará acciones contra el dispositivo.

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

  • Prueba dirigida por host: es una prueba que se ejecuta en el host que interactúa con uno o más dispositivos. El sistema bajo prueba (SUT) no está en el host en sí, sino que se está probando desde el host.
  • prueba del lado del host: es una prueba que se ejecuta puramente en el host y prueba algo solo en el host, por ejemplo, pruebas unitarias.

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

Algunas pruebas pueden requerir que afecte el estado general del dispositivo, como emitir un comando de reinicio. En el caso de prueba de instrumentación, un reinicio mataría la instrumentación, la prueba no podría continuar y no habría resultados disponibles.

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

Una prueba dirigida por host puede manejar estos casos de uso y permitir pruebas avanzadas del dispositivo con más escenarios. Si se encuentra en esa situación, escribir una prueba dirigida por el host tiene más sentido.

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

Aquí hay una muestra:

@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 están dirigidas por el ejecutor de pruebas 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

La extensión de BaseHostJunit4Test es una forma de heredar la API de utilidades de prueba útiles, como:

  • 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 : comprueba si un paquete está instalado o no.
  • hasDeviceFeature : compruebe si el dispositivo admite una función o no. ( pm list features )
  • runDeviceTests(DeviceTestRunOptions options) : Ejecute una prueba de instrumentación contra un dispositivo objetivo usando DeviceTestRunOptions para manejar todas las opciones posibles.

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

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

Soporte Tradefed: preparación y limpieza de dispositivos por clase

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

  • @BeforeClassWithInfo: se ejecuta antes de las anotaciones @BeforeClass
  • @AfterClassWithInfo: se ejecuta después de las anotaciones de @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 le permite usar el dispositivo y almacenar propiedades que se pueden usar en el ámbito estático o no estático. BaseHostJUnit4Test admite la obtención de TestInformation en un ámbito no estático a través #getTestInformation() .

Si no está ampliando BaseHostJUnit4Test , puede implementar ITestInformationReceiver para recibir el objeto TestInformation .

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

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

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