Обработка опционов в 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>

Тест-раннер

Исполнители тестов также имеют доступ к этим точкам конфигурации через консоль 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] .

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

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