Обработка опций лежит в основе модульного подхода Trade Federation. В частности, опции — это механизм, с помощью которого разработчик, интегратор и тестовый исполнитель могут работать вместе, не дублируя работу друг друга. Проще говоря, наша реализация обработки опций позволяет разработчику помечать член класса Java как настраиваемый, в этот момент значение этого члена может быть дополнено или переопределено интегратором, а затем может быть дополнено или переопределено тестовым исполнителем. Этот механизм работает для всех внутренних типов Java, а также для любых экземпляров Map
или Collection
внутренних типов.
Примечание: Механизм обработки параметров работает только для классов, реализующих один из интерфейсов, включенных в жизненный цикл теста , и только тогда, когда этот класс создается механизмом жизненного цикла.
Разработчик
Для начала разработчик отмечает член аннотацией @Option
. Они указывают (как минимум) значения name
и description
, которые определяют имя аргумента, связанного с этой опцией, и описание, которое отображается на консоли TF при запуске команды с --help
или --help-all
.
В качестве примера предположим, что мы хотим создать функциональный тест телефона, который набирает различные телефонные номера и ожидает получить последовательность тонов 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 }
Это все, что требуется разработчику для настройки двух точек конфигурации для этого теста. Затем они могли бы использовать mWaitTime
и mCalls
как обычно, не обращая особого внимания на тот факт, что они настраиваемы. Поскольку поля @Option
устанавливаются после создания экземпляра класса, но до вызова метода run
, это дает разработчикам простой способ задать значения по умолчанию или выполнить некоторую фильтрацию для полей Map
и Collection
, которые в противном случае предназначены только для добавления.
Интегратор
Интегратор работает в мире конфигураций, которые написаны на XML. Формат конфигурации позволяет интегратору устанавливать (или добавлять) значение для любого поля @Option
. Например, предположим, что интегратор хочет определить тест с меньшей задержкой, который вызывает номер по умолчанию, а также долго выполняющийся тест, который вызывает множество номеров. Они могут создать пару конфигураций, которые могут выглядеть следующим образом:
<?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>
Тестовый Бегун
Test Runner также имеет доступ к этим точкам конфигурации через консоль Trade Federation. Прежде всего, они запускают команду (то есть конфигурацию и все ее аргументы) с помощью инструкции run command <name>
(или run <name>
для краткости). Кроме того, они могут указать любой список аргументов, являющихся частью команды, которые могут заменять или добавляться к полям, указанным объектами жизненного цикла в каждой конфигурации.
Чтобы запустить тест с малой задержкой с many-numbers
телефонными номерами, Test Runner может выполнить:
tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
Или, чтобы получить аналогичный эффект с противоположной стороны, Test Runner может сократить время ожидания для many-numbers
теста:
tf> run many-numbers.xml --timeout 5000
Заказ опций
Вы могли заметить, что параметр call
лежащий в основе реализации, представляет собой Map
, поэтому при повторном --call
в командной строке они все сохраняются.
Опция timeout
, которая имеет базовую реализацию long
, может хранить только одно значение. Поэтому сохраняется только последнее указанное значение. --timeout 5 --timeout 10
приводит к timeout
содержащему 10.
В случае использования List
или Collection
в качестве базовой реализации все значения сохраняются в порядке, указанном в командной строке.
Булевы параметры
Опции базового логического типа можно установить в true
, напрямую передав имя опции, например, --[option-name]
, а можно установить в false
используя синтаксис --no-[option-name]
.