Escriba una prueba impulsada por el anfitrión en Trade Federation

Esta página describe cómo escribir una prueba de dispositivo estilo JUnit4 impulsada por el host. Esto significa que el lado anfitrión del arnés desencadenará 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 basada en 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, sino que se está probando desde el host.
  • Prueba del lado del host: es una prueba que se ejecuta exclusivamente 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?

Es posible que algunas pruebas requieran que usted 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 impulsadas por el 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 basada en host puede manejar estos casos de uso y permitir pruebas avanzadas del dispositivo con más escenarios. Si se encuentra en esa situación, lo más sensato es escribir una prueba impulsada por el host.

¿Cómo se escriben las pruebas basadas en 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 impulsadas por host en Trade Federation están impulsadas 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

Extender BaseHostJunit4Test es una forma de heredar 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 : comprueba si el dispositivo admite una función o no. ( pm list features )
  • runDeviceTests(DeviceTestRunOptions options) : ejecute una prueba de instrumentación en un dispositivo de destino utilizando DeviceTestRunOptions para manejar todas las opciones posibles.

También proporcione acceso al objeto de dispositivo 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 con 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 imposible usar el controlador #getDevice() para realizar alguna configuración o limpieza específica del dispositivo, única 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 @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 de #getTestInformation() .

Si no está ampliando BaseHostJUnit4Test , puede 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 ejecutor HostTest .

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