Обработка опционов в Tradefed

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

Смотрите также

Передать параметры в набор и модули