Обработка параметров лежит в основе модульного подхода 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>
Тест-раннер
Участник тестирования также имеет доступ к этим точкам конфигурации через консоль Торговой федерации. В первую очередь, он запускает команду (то есть, конфигурацию и все ее аргументы) с помощью инструкции run command <name> (или run <name> сокращенно). Кроме того, он может указать любой список аргументов, входящих в состав команды, которые могут заменять или добавлять поля, указанные объектами жизненного цикла в каждой конфигурации.
Для запуска теста с низкой задержкой, использующего many-numbers телефонных номеров, средство запуска тестов может выполнить следующее:
tf> run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
Или, чтобы добиться аналогичного эффекта в обратном направлении, разработчик теста мог бы сократить время ожидания при прохождении теста many-numbers :
tf> run many-numbers.xml --timeout 5000
порядок выбора опций
Вы можете заметить, что в основе реализации лежит Map , поэтому при повторном call --call в командной строке все значения сохраняются.
Параметр timeout , имеющий в основе реализацию типа long , может хранить только одно значение. Поэтому сохраняется только последнее указанное значение. --timeout 5 --timeout 10 приводит к timeout равному 10.
В случае использования List или Collection в качестве базовой реализации, все значения сохраняются в порядке, указанном в командной строке.
Логические параметры
Параметры логического типа можно установить в true передав имя параметра напрямую, например, --[option-name] , и в значение false используя синтаксис --no-[option-name] .