Obsługa opcji leży u podstaw modułowego podejścia Federacji Handlowej. W szczególności opcje są mechanizmem, dzięki któremu Developer, Integrator i Test Runner mogą ze sobą współpracować bez konieczności wzajemnego duplikowania swojej pracy. Mówiąc prościej, nasza implementacja obsługi opcji pozwala programiście oznaczyć element klasy Java jako konfigurowalny, w którym to momencie wartość tego elementu może zostać zwiększona lub nadpisana przez integratora, a następnie może zostać zwiększona lub nadpisana przez program uruchamiający testy. Ten mechanizm działa dla wszystkich wewnętrznych typów Javy, a także dla dowolnych Map
lub Collection
typów wewnętrznych.
Uwaga: mechanizm obsługi opcji działa tylko dla klas implementujących jeden z interfejsów zawartych w cyklu życia testu i tylko wtedy, gdy instancja tej klasy jest tworzona przez maszynę cyklu życia.
Deweloper
Na początek programista oznacza członka adnotacją @Option
. Określają one (co najmniej) name
i wartości description
, które określają nazwę argumentu skojarzoną z tą opcją oraz opis, który będzie wyświetlany w konsoli TF po uruchomieniu polecenia z opcją --help
lub --help-all
.
Jako przykład, powiedzmy, że chcemy zbudować funkcjonalny test telefonu, który będzie wybierał różne numery telefonów i będzie oczekiwał otrzymania sekwencji tonów DTMF z każdego numeru po połączeniu.
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 }
To wszystko, co jest potrzebne programiście do ustawienia dwóch punktów konfiguracji dla tego testu. Następnie mogliby normalnie korzystać mWaitTime
i mCalls
, nie zwracając uwagi na fakt, że są konfigurowalne. Ponieważ pola @Option
są ustawiane po utworzeniu instancji klasy, ale przed wywołaniem metody run
, zapewnia to implementatorom łatwy sposób na ustawienie wartości domyślnych lub wykonanie pewnego rodzaju filtrowania na polach Map
i Collection
, które w przeciwnym razie są dołączane. tylko.
Integrator
Integrator działa w świecie Konfiguracji, które są napisane w XML. Format konfiguracji umożliwia integratorowi ustawienie (lub dodanie) wartości dla dowolnego pola @Option
. Załóżmy na przykład, że integrator chce zdefiniować test o mniejszym opóźnieniu, który wywołuje numer domyślny, a także test długotrwały, który wywołuje różne numery. Mogą stworzyć parę konfiguracji, które mogą wyglądać tak:
<?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>
Biegacz testowy
Test Runner ma również dostęp do tych punktów konfiguracyjnych za pośrednictwem konsoli Federacji Handlowej. Przede wszystkim uruchomią polecenie (to znaczy konfigurację i wszystkie jej argumenty) z instrukcją run command <name>
(lub w skrócie run <name>
). Poza tym mogą określić dowolną listę argumentów będących częścią polecenia, które mogą zastępować lub dołączać pola określone przez obiekty cyklu życia w każdej konfiguracji.
Aby uruchomić test o małym opóźnieniu z many-numbers
telefonów, Test Runner może wykonać:
tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
Lub, aby uzyskać podobny efekt z przeciwnego kierunku, Test Runner może skrócić czas oczekiwania na test many-numbers
:
tf> run many-numbers.xml --timeout 5000
Zamawianie opcji
Możesz zauważyć, że opcją call
leżącą u podstaw implementacji jest Map
, więc po powtórzeniu --call
w wierszu poleceń wszystkie zostaną zapisane.
Opcja timeout
, która ma podstawową implementację long
, może przechowywać tylko jedną wartość. Tak więc tylko ostatnia określona wartość zostanie zapisana. --timeout 5 --timeout 10
spowoduje, że timeout
będzie zawierał 10.
W przypadku List
lub Collection
jako podstawowej implementacji, wszystkie wartości będą przechowywane w kolejności określonej w wierszu poleceń.
Opcje logiczne
Opcje typu podstawowego typu logicznego można ustawić na true
, przekazując bezpośrednio nazwę opcji, na przykład --[option-name]
i można ją ustawić na false
przy użyciu składni --no-[option-name]
.