La gestione delle opzioni è al centro dell'approccio modulare di Trade Federation. In particolare, le opzioni sono il meccanismo con cui lo sviluppatore, l'azienda integrativa e l'esecutore test possono collaborare senza dover duplicare il lavoro degli altri. In parole povere, la nostra implementazione della gestione delle opzioni consente allo sviluppatore di contrassegnare un membro della classe Java come configurabile, a quel punto il valore di quel membro può essere aumentato o sostituito dall'azienda integrativa e successivamente aumentato o sostituito dall'esecutore test. Questo meccanismo funziona per tutti i tipi intrinseci di Java, nonché per qualsiasi istanza Map o Collection di tipi intrinseci.
Nota: il meccanismo di gestione delle opzioni funziona solo per le classi che implementano una delle interfacce incluse nel ciclo di vita dei test e solo quando la classe viene istanziata dal meccanismo del ciclo di vita.
Sviluppatore
Per iniziare, lo sviluppatore contrassegna un membro con l'annotazione @Option.
Specifica (almeno) i valori name e description, che
specificano il nome dell'argomento associato a questa opzione e la descrizione visualizzata nella
console TF quando il comando viene eseguito con --help o --help-all.
Ad esempio, supponiamo di voler creare un test funzionale del telefono che chiami una serie di numeri di telefono e si aspetti di ricevere una sequenza di toni DTMF da ogni numero dopo la connessione.
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 }
Questo è tutto ciò che è necessario per lo sviluppatore per configurare due punti di configurazione per questo test. Potrebbe quindi utilizzare mWaitTime e mCalls come di consueto, senza prestare molta attenzione al fatto che siano configurabili. Poiché i campi @Option vengono impostati dopo l'istanza della classe, ma prima della chiamata del metodo run, ciò offre agli implementatori un modo semplice per impostare i valori predefiniti o eseguire un tipo di filtro sui campi Map e Collection, che altrimenti sono solo di accodamento.
Azienda integrativa
L'azienda integrativa lavora nel mondo delle configurazioni, scritte in XML. Il formato di configurazione consente all'azienda integrativa di impostare (o aggiungere) un valore per qualsiasi campo @Option. Ad esempio, supponiamo che l'azienda integrativa voglia definire un test a bassa latenza che chiami il numero predefinito, nonché un test a lunga esecuzione che chiami una serie di numeri. Potrebbe creare una coppia di configurazioni simili alle seguenti:
<?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>
Esecutore test
L'esecutore test ha accesso a questi punti di configurazione anche tramite la console di Trade Federation.
Innanzitutto, esegue un comando (ovvero una configurazione e tutti i relativi argomenti) con l'
run command <name> istruzione (o run <name> in breve).
Inoltre, può specificare che qualsiasi elenco di argomenti fa parte del comando, che può sostituire o aggiungere campi specificati dagli oggetti del ciclo di vita all'interno di ogni configurazione.
Per eseguire il test a bassa latenza con i numeri di telefono many-numbers, l'esecutore test potrebbe eseguire:
tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
In alternativa, per ottenere un effetto simile dalla direzione opposta, l'esecutore test potrebbe ridurre il tempo di attesa per il test many-numbers:
tf> run many-numbers.xml --timeout 5000
Ordinamento delle opzioni
Potresti notare che l'implementazione sottostante dell'opzione call è una Map
, quindi, se ripeti --call nella riga di comando, vengono memorizzate tutte.
L'opzione timeout, che ha un'implementazione sottostante di long, può memorizzare un solo valore. Pertanto, viene memorizzato solo l'ultimo valore specificato.
--timeout 5 --timeout 10 fa sì che timeout contenga 10.
Nel caso di un List o Collection come implementazione sottostante, tutti i valori vengono memorizzati nell'ordine specificato nella riga di comando.
Opzioni booleane
Le opzioni di tipo sottostante booleano possono essere impostate su true passando direttamente il nome dell'opzione, ad esempio --[option-name], e possono essere impostate su false utilizzando la sintassi --no-[option-name].