Obsługa opcji jest podstawą modułowego podejścia Trade Federation. W szczególności opcje są mechanizmem, dzięki któremu programista, integrator i wykonawca testów mogą współpracować bez konieczności powielania swojej pracy. Upraszczając, nasza implementacja obsługi opcji umożliwia deweloperowi oznaczenie elementu klasy Java jako konfigurowalnego. W tym momencie wartość tego elementu może zostać rozszerzona lub zastąpiona przez integratora, a następnie rozszerzona lub zastąpiona przez narzędzie do testowania. Ten mechanizm działa w przypadku wszystkich typów wewnętrznych Javy, a także wszystkich instancji typów wewnętrznych Map
lub Collection
.
Uwaga: mechanizm obsługi opcji działa tylko w przypadku klas implementujących jeden z interfejsów zawartych w cyklu życia testu i tylko wtedy, gdy klasa jest instancjonowana przez mechanizm cyklu życia.
Programista
Na początek deweloper oznacza element adnotacją @Option
.
Określają one (co najmniej) wartości name
i description
, które określają nazwę argumentu powiązanego z daną opcją oraz opis wyświetlany w konsoli TF, gdy polecenie jest uruchamiane z opcjami --help
lub --help-all
.
Załóżmy, że chcemy utworzyć funkcjonalny test telefonu, który wywołuje różne numery telefonów i oczekuje, że po połączeniu z każdym z nich otrzyma sekwencję tonów DTMF.
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, czego deweloper potrzebuje, aby skonfigurować 2 punkty konfiguracji tego testu. Mogą wtedy korzystać z mWaitTime
i mCalls
w normalny sposób, nie zwracając uwagi na to, że można je konfigurować. Pola @Option
są ustawiane po utworzeniu instancji klasy, ale przed wywołaniem metody run
, co ułatwia implementatorom ustawianie wartości domyślnych lub filtrowanie pól Map
i Collection
, które w innych przypadkach są tylko dołączane.
Integrator
Integrator pracuje w świecie konfiguracji, które są zapisywane w formacie XML. Format konfiguracji umożliwia integratorowi ustawienie (lub dołączenie) wartości dowolnego pola @Option
. Załóżmy na przykład, że integrator chce zdefiniować test o mniejszym opóźnieniu, który wywołuje domyślny numer, a także długotrwały test, który wywołuje różne numery. Może utworzyć 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>
Uruchamiający testy
Test Runner ma też dostęp do tych punktów konfiguracji w konsoli Trade Federation.
Przede wszystkim wykonują polecenie (czyli 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, które są częścią polecenia i mogą zastępować lub dodawać pola określone przez obiekty cyklu życia w każdej konfiguracji.
Aby uruchomić test o niskim opóźnieniu z numerami telefonów many-numbers
, Test Runner może wykonać to polecenie:
tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
Aby uzyskać podobny efekt w przeciwnym kierunku, Test Runner może skrócić czas oczekiwania w przypadku testu many-numbers
:
tf> run many-numbers.xml --timeout 5000
Kolejność opcji
Możesz zauważyć, że podstawową implementacją opcji call
jest Map
dlatego po wielokrotnym użyciu --call
w wierszu poleceń wszystkie są przechowywane.
Opcja timeout
, która ma implementację bazową long
, może przechowywać tylko jedną wartość. Zapisywana jest tylko ostatnia podana wartość.
--timeout 5 --timeout 10
wyników w timeout
zawierających 10.
W przypadku List
lub Collection
jako implementacji bazowej wszystkie wartości są przechowywane w kolejności określonej w wierszu poleceń.
Opcje logiczne
Opcje typu logicznego można ustawić na true
, przekazując bezpośrednio nazwę opcji, np. --[option-name]
, a na false
– za pomocą składni --no-[option-name]
.