Обработка опционов лежит в основе модульного подхода 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]
.