Обработка параметров лежит в основе модульного подхода 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 }
Это все, что нужно сделать разработчику, чтобы настроить две точки конфигурации для этого теста. Пользователи могут не обращать внимания на то, что эти кнопки можно настраивать, и использовать их как обычно.mWaitTimemCalls Поскольку поля @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, все значения сохраняются в том порядке, в котором они указаны в командной строке.
Логические варианты
Варианты базового типа boolean можно задать как true, напрямую передав название варианта, например --[option-name], и как false, используя синтаксис --no-[option-name].