Manejo de opciones en Tradefed

El manejo de opciones se encuentra en el centro del enfoque modular de la Federación de Comercio. En particular, las opciones son el mecanismo mediante el cual el desarrollador, el integrador y el ejecutor de pruebas pueden trabajar juntos sin tener que duplicar el trabajo de cada uno. En pocas palabras, nuestra implementación del manejo de opciones permite que la desarrollador marcar a un miembro de la clase Java como configurable, momento en el cual el valor de ese miembro puede ser aumentada o anulada por el integrador y, posteriormente, puede ser aumentada o anulada por el ejecutor de pruebas. Este mecanismo funciona con todos los tipos intrínsecos de Java, así como con cualquier Instancias Map o Collection de tipos intrínsecos

Nota: El mecanismo de control de opciones solo funciona para clases. mediante la implementación de uno de los interfaces de usuario incluidas en el ciclo de vida de la prueba, y solo cuando esa clase se instancia de la maquinaria del ciclo de vida.

Desarrollador

Para comenzar, el desarrollador marca un miembro con la anotación @Option. Especifican (como mínimo) los valores name y description, que especifica el nombre del argumento asociado con esa opción y la descripción que se muestra en la consola de TF cuando el comando se ejecuta con --help o --help-all.

A modo de ejemplo, supongamos que queremos crear una prueba de teléfono funcional que realice llamadas en varios números de teléfono y espera recibir una secuencia de tonos DTMF de cada número posterior se conecta.

public class PhoneCallFuncTest extends IRemoteTest {
    @Option(name = "timeout", description = "How long to wait for connection, in millis")
    private long mWaitTime = 30 * 1000;  // 30 seconds

    @Option(name = "call", description = "Key: Phone number to attempt. " +
            "Value: DTMF to expect. May be repeated.")
    private Map<String, String> mCalls = new HashMap<String, String>;

    public PhoneCallFuncTest() {
        mCalls.add("123-456-7890", "01134");  // default
    }

Eso es todo lo que se requiere para que el desarrollador configure dos puntos de configuración para esa prueba. Entonces, podrían salir y usar mWaitTime y mCalls como de costumbre, sin prestar mucha atención al hecho de que son configurables. Debido a que los campos @Option se establecen después de que se crea una instancia de la clase, pero antes de que se llame al método run, esto proporciona una forma fácil para que los implementadores configuren valores predeterminados o realicen algún tipo de filtrado en los campos Map y Collection, que de otro modo solo se pueden agregar.

Empresa integradora

El integrador trabaja en el mundo de las configuraciones, que se escriben en XML. El formato de configuración permite que el integrador establezca (o adjunte) un valor para cualquier campo @Option. Por ejemplo: supongamos que el integrador quisiera definir una prueba de latencia más baja que llame al número predeterminado, además de como una prueba de larga duración que llama a una variedad de números. Podrían crear un par de configuraciones que podrían verse de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?>
<configuration description="low-latency default test; low-latency.xml">
    <test class="com.example.PhoneCallFuncTest">
        <option name="timeout" value="5000" />
    </test>
</configuration>
<?xml version="1.0" encoding="utf-8"?>
<configuration description="call a bunch of numbers; many-numbers.xml">
    <test class="com.example.PhoneCallFuncTest">
        <option name="call" key="111-111-1111" value="#*#*TEST1*#*#" />
        <option name="call" key="222-222-2222" value="#*#*TEST2*#*#" />
        <!-- ... -->
    </test>
</configuration>

Ejecutor de pruebas

El ejecutor de pruebas también tiene acceso a estos puntos de configuración a través de la consola de la Federación de Comercio. En primer lugar, ejecutan un comando (es decir, un archivo de configuración y todos sus argumentos) con el Instrucción run command <name> (o run <name> para abreviar). Más allá de eso, pueden especificar cualquier lista de argumentos que formen parte del comando, que puede reemplazar o adjuntar a los campos especificados por los objetos del ciclo de vida dentro de cada configuración.

Para ejecutar la prueba de baja latencia con los números de teléfono many-numbers, el Test Runner podría ejecutar lo siguiente:

tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#

O, para obtener un efecto similar desde la dirección opuesta, el ejecutor de pruebas podría reducir el tiempo de espera hora para la prueba many-numbers:

tf> run many-numbers.xml --timeout 5000

Orden de las opciones

Puedes notar que la implementación subyacente de la opción call es una Map. así que cuando se repite --call en la línea de comandos, todos están almacenados.

La opción timeout, que tiene una implementación subyacente de long, solo puedes almacenar un valor. Por lo tanto, solo se almacena el último valor especificado. --timeout 5 --timeout 10 genera timeout que contiene 10.

En el caso de un List o Collection como la implementación subyacente, todos los valores se almacenan en el orden especificado en la línea de comandos.

Opciones booleanas

Las opciones del tipo booleano subyacente se pueden establecer en true pasando directamente el el nombre de la opción, por ejemplo, --[option-name], y se puede establecer en false usando la sintaxis --no-[option-name].

Consulta también

Pasar opciones a paquetes y módulos