Esta página describe cómo escribir un nuevo ejecutor de pruebas en Tradefed.
Fondo
Si tiene curiosidad sobre el lugar de los ejecutores de pruebas en la arquitectura Tradefed, consulte Estructura de un ejecutor de pruebas .
Este no es un requisito previo para escribir un nuevo ejecutor de pruebas; Los corredores de prueba se pueden escribir de forma aislada.
Mínimo indispensable: implementar la interfaz
Lo mínimo para calificar como ejecutor de pruebas Tradefed es implementar la interfaz IRemoteTest y más específicamente el método run(TestInformation testInfo, ITestInvocationListener listener)
.
Este método es el que invoca el arnés cuando se utiliza el ejecutor de pruebas, similar a Java Runnable.
Cada parte de ese método se considera parte de la ejecución del ejecutor de pruebas.
Informar los resultados del corredor de pruebas
El método run
en la interfaz base brinda acceso a un objeto de escucha de tipo ITestInvocationListener
. Este objeto es la clave para informar resultados estructurados del corredor de pruebas al arnés.
Al informar resultados estructurados, un ejecutor de pruebas tiene las siguientes propiedades:
- Informe una lista adecuada de todas las pruebas que se realizaron, cuánto tiempo tomaron y si aprobaron, reprobaron individualmente o en algunos otros estados.
- Informe las métricas asociadas con las pruebas, si corresponde, por ejemplo, métricas de tiempo de instalación.
- Se adapta a la mayoría de las herramientas de infraestructura, por ejemplo, mostrar resultados y métricas, etc.
- Generalmente es más fácil de depurar ya que hay un seguimiento más granular de la ejecución.
Dicho esto, informar resultados estructurados es opcional; Es posible que un ejecutor de pruebas simplemente desee evaluar el estado de toda la ejecución como PASADA o FALLADA sin ningún detalle de la ejecución real.
Se pueden invocar los siguientes eventos al oyente para notificar al arnés sobre el progreso actual de las ejecuciones:
- testRunStarted: Notifica el inicio de un grupo de casos de prueba que están relacionados entre sí.
- testStarted: Notifica el comienzo del inicio de un caso de prueba.
- testFailed/testIgnored: Notifica el cambio de estado del caso de prueba en curso. Un caso de prueba sin ningún cambio de estado se considera aprobado.
- testEnded: Notifica el final del caso de prueba.
- testRunFailed: notifica que el estado general de la ejecución del grupo de casos de prueba es fallido. Una ejecución de prueba puede ser aprobada o fallida independientemente de los resultados de los casos de prueba , dependiendo de lo que se esperaba la ejecución. Por ejemplo, un binario que ejecuta varios casos de prueba podría informar todos los casos de prueba aprobados pero con un código de salida de error (por cualquier motivo: archivos filtrados, etc.).
- testRunEnded: Notifica el final del grupo de casos de prueba.
Mantener y garantizar el orden adecuado de las devoluciones de llamada es responsabilidad del implementador del ejecutor de pruebas, por ejemplo, garantizar que se llame a testRunEnded
en caso de excepción mediante una cláusula finally
.
Las devoluciones de llamadas de casos de prueba ( testStarted
, testEnded
, etc.) son opcionales. Es posible que se realice una ejecución de prueba sin ningún caso de prueba.
Puede notar que esta estructura de eventos está inspirada en la estructura típica de JUnit . Esto tiene el propósito de mantener las cosas cercanas a algo básico sobre lo que los desarrolladores generalmente tienen conocimiento.
Informar registros del ejecutor de pruebas
Si está escribiendo su propia clase de prueba o corredor de Tradefed, implementará IRemoteTest y obtendrá un ITestInvocationListener
a través del método run()
. Este oyente se puede utilizar para registrar archivos de la siguiente manera:
listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);
Prueba con un dispositivo
La interfaz mínima anterior permite ejecutar pruebas muy simples que están aisladas y no requieren ningún recurso particular, por ejemplo, pruebas unitarias de Java.
Los redactores de pruebas que quieran pasar al siguiente paso de prueba de dispositivos necesitarán las siguientes interfaces:
- IDeviceTest permite recibir el objeto
ITestDevice
que representa el dispositivo bajo prueba y proporciona la API para interactuar con él. - IBuildReceiver permite que la prueba obtenga el objeto
IBuildInfo
creado en el paso del proveedor de compilación que contiene toda la información y los artefactos relacionados con la configuración de la prueba.
Los ejecutores de pruebas generalmente están interesados en estas interfaces para obtener artefactos relacionados con la ejecución, por ejemplo archivos adicionales, y obtener el dispositivo bajo prueba que será el objetivo durante la ejecución.
Prueba con múltiples dispositivos
Tradefed admite la ejecución de pruebas en varios dispositivos al mismo tiempo. Esto es útil cuando se prueban componentes que requieren una interacción externa, como un emparejamiento de teléfono y reloj.
Para escribir un ejecutor de pruebas que pueda usar múltiples dispositivos, necesitará implementar IMultiDeviceTest , lo que permitirá recibir un mapa de ITestDevice
a IBuildInfo
que contiene la lista completa de representaciones de dispositivos y su información de compilación asociada.
El definidor de la interfaz siempre se llamará antes que el método run
, por lo que es seguro asumir que la estructura estará disponible cuando se llame a run
.
Pruebas conscientes de sus configuraciones.
Algunas implementaciones de ejecutores de pruebas pueden necesitar información sobre la configuración general para funcionar correctamente, por ejemplo, algunos metadatos sobre la invocación o qué target_preparer
se ejecutó antes, etc.
Para lograr esto, un ejecutor de pruebas puede acceder al objeto IConfiguration
del que forma parte y en el que se ejecuta. Consulte la descripción del objeto de configuración para obtener más detalles.
Para la implementación del ejecutor de pruebas, deberá implementar IConfigurationReceiver para recibir el objeto IConfiguration
.
Corredor de pruebas flexible
Los ejecutores de pruebas pueden proporcionar una forma flexible de ejecutar sus pruebas si tienen un control granular sobre ellas; por ejemplo, un ejecutor de pruebas JUnit puede ejecutar individualmente cada prueba unitaria.
Esto permite que el arnés y la infraestructura más grandes aprovechen ese control fino y que los usuarios ejecuten parcialmente el corredor de prueba mediante filtrado .
El soporte de filtrado se describe en la interfaz ITestFilterReceiver , que permite recibir conjuntos de filtros de include
y exclude
para las pruebas que deben o no ejecutarse.
Nuestra convención es que se ejecutará una prueba IFF si coincide con uno o más de los filtros de inclusión Y no coincide con ninguno de los filtros de exclusión. Si no se proporcionan filtros de inclusión, se deben ejecutar todas las pruebas siempre que no coincidan con ninguno de los filtros de exclusión.