El manejo de opciones es el núcleo del enfoque modular de Trade Federation. 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 los demás. En pocas palabras, nuestra implementación del manejo de opciones permite al desarrollador marcar un miembro de la clase Java como configurable, momento en el cual el valor de ese miembro puede ser aumentado o anulado por el Integrador, y posteriormente puede ser aumentado o anulado por el Ejecutor de pruebas. Este mecanismo funciona para todos los tipos intrínsecos de Java, así como para cualquier Map
o Collection
de tipos intrínsecos.
Nota: El mecanismo de manejo de opciones solo funciona para clases que implementan una de las interfaces incluidas en Test Lifecycle , y solo cuando la maquinaria del ciclo de vida crea una instancia de esa clase.
Desarrollador
Para empezar, el desarrollador marca un miembro con la anotación @Option
. Especifican (como mínimo) los valores de name
y description
, que especifican el nombre del argumento asociado con esa opción y la descripción que se mostrará en la consola TF cuando el comando se ejecute con --help
o --help-all
.
Como ejemplo, digamos que queremos crear una prueba de teléfono funcional que marcará una variedad de números de teléfono y esperará recibir una secuencia de tonos DTMF de cada número después de que se conecte.
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 establezca dos puntos de configuración para esa prueba. Luego podrían salir y usar mWaitTime
y mCalls
normalmente, sin prestar mucha atención al hecho de que son configurables. Debido a que los campos @Option
se configuran después de crear una instancia de la clase, pero antes de que se llame al método run
, esto proporciona una manera fácil para que los implementadores establezcan valores predeterminados o realicen algún tipo de filtrado en los campos Map
y Collection
, que de otro modo se adjuntan. solo.
Integrador
El Integrador trabaja en el mundo de las Configuraciones, que están escritas en XML. El formato de configuración permite al integrador establecer (o agregar) un valor para cualquier campo @Option
. Por ejemplo, supongamos que el integrador quisiera definir una prueba de menor latencia que llame al número predeterminado, así como una prueba de larga duración que llame a una variedad de números. Podrían crear un par de configuraciones similares a las siguientes:
<?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>
Corredor de pruebas
El Test Runner también tiene acceso a estos puntos de configuración a través de la consola de Trade Federation. En primer lugar, ejecutarán un comando (es decir, una configuración y todos sus argumentos) con la 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 agregar a los campos especificados por los objetos del ciclo de vida dentro de cada configuración.
Para ejecutar la prueba de baja latencia con números de teléfono many-numbers
, Test Runner podría ejecutar:
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 Test Runner podría reducir el tiempo de espera para la prueba many-numbers
:
tf> run many-numbers.xml --timeout 5000
Orden de opciones
Es posible que observe que la opción call
subyacente a la implementación es un Map
, por lo que al repetir --call
en la línea de comando, todos se almacenarán.
La opción timeout
, que tiene una implementación subyacente de long
, solo puede almacenar un valor. Por lo tanto, solo se almacenará el último valor especificado. --timeout 5 --timeout 10
dará como resultado timeout
que contenga 10.
En el caso de una List
o Collection
como implementación subyacente, todos los valores se almacenarán en el orden especificado en la línea de comando.
Opciones booleanas
Las opciones de tipo subyacente booleano se pueden establecer en true
pasando directamente el nombre de la opción, por ejemplo, --[option-name]
y se pueden establecer en false
usando la sintaxis --no-[option-name]
.