Gestione delle opzioni in Tradefed

La gestione delle opzioni è al centro dell'approccio modulare di Trade Federation. In particolare, le opzioni sono il meccanismo mediante il quale lo sviluppatore, l'integratore e il test runner possono collaborare senza dover duplicare il lavoro dell'altro. 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 sovrascritto dall'integratore e può essere successivamente aumentato o sovrascritto dal Test Runner. Questo meccanismo funziona per tutti i tipi intrinseci Java, nonché per qualsiasi 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 Test Lifecycle e solo quando quella classe viene istanziata dal macchinario del ciclo di vita.

Sviluppatore

Per iniziare, lo sviluppatore contrassegna un membro con l'annotazione @Option . Specificano (come minimo) il name e i valori description , che specificano il nome dell'argomento associato a tale opzione e la descrizione che verrà visualizzata sulla console TF quando il comando viene eseguito con --help o --help-all .

Ad esempio, supponiamo di voler creare un test telefonico funzionale che comporrà una varietà di numeri di telefono e si aspetterà di ricevere una sequenza di toni DTMF da ciascun 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 serve allo sviluppatore per impostare due punti di configurazione per quel test. Potrebbero quindi utilizzare mWaitTime e mCalls normalmente, senza prestare molta attenzione al fatto che sono configurabili. Poiché i campi @Option vengono impostati dopo l'istanziazione della classe, ma prima che venga chiamato il metodo run , ciò fornisce agli implementatori un modo semplice per impostare valori predefiniti o eseguire qualche tipo di filtro sui campi Map e Collection , che altrimenti sarebbero aggiunti soltanto.

Integratore

L'Integrator funziona nel mondo delle Configurazioni, che sono scritte in XML. Il formato di configurazione consente all'integratore di impostare (o aggiungere) un valore per qualsiasi campo @Option . Supponiamo, ad esempio, che l'integratore voglia definire un test a latenza inferiore che chiami il numero predefinito, nonché un test a lunga esecuzione che chiami una varietà di numeri. Potrebbero creare una coppia di configurazioni che potrebbero assomigliare 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>

Corridore di prova

Il Test Runner ha accesso a questi punti di configurazione anche tramite la console della Federazione dei Mercanti. Innanzitutto, eseguiranno un comando (ovvero una configurazione e tutti i suoi argomenti) con l'istruzione run command <name> (o run <name> in breve). Oltre a ciò, possono specificare qualsiasi elenco di argomenti che fanno parte del comando, che può sostituire o aggiungere ai campi specificati da Lifecycle Objects all'interno di ciascuna configurazione.

Per eseguire il test a bassa latenza con i numeri di telefono many-numbers , il Test Runner può eseguire:

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

Oppure, per ottenere un effetto simile dalla direzione opposta, il Test Runner potrebbe ridurre il tempo di attesa per il test many-numbers :

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

Ordinazione delle opzioni

Potresti notare che l'opzione call sottostante l'implementazione è una Map , quindi dopo aver ripetuto --call sulla riga di comando verranno tutte archiviate.

L'opzione timeout , che ha un'implementazione sottostante di long , può memorizzare solo un valore. Pertanto verrà memorizzato solo l'ultimo valore specificato. --timeout 5 --timeout 10 risulterà in timeout contenente 10.

In caso di List o Collection come implementazione sottostante, tutti i valori verranno archiviati, nell'ordine specificato sulla riga di comando.

Opzioni booleane

Le opzioni di tipo booleano sottostante 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] .

Guarda anche

Passa le opzioni alla suite e ai moduli