Общие сведения

ВступлениеПодготовка к запускуАрхитектура платформы TestoПорядок запускаПолитика запуска тестов

Обучающие материалы по Testo для Hyper-V

Часть 1. Самый первый тестЧасть 2. Устанавливаем Ubuntu ServerЧасть 3. Доступ в Интернет из виртуальной машиныЧасть 4. Гостевые дополненияЧасть 5. ПараметрыЧасть 6. КешированиеЧасть 7. Связываем две машины по сетиЧасть 8. ФлешкиЧасть 9. МакросыЧасть 10. Конструкция ifЧасть 11. No snapshotsЧасть 12. Управление мышкойЧасть 13. Импортирование жёстких дисковЧасть 14. JS-селекторыЧасть 15. Циклы

Обучающие материалы по Testo для QEMU

Часть 1. Самый первый тестЧасть 2. Устанавливаем Ubuntu ServerЧасть 3. Гостевые дополненияЧасть 4. ПараметрыЧасть 5. КешированиеЧасть 6. Доступ в Интернет из виртуальной машиныЧасть 7. Связываем две машины по сетиЧасть 8. ФлешкиЧасть 9. МакросыЧасть 10. Конструкция ifЧасть 11. No snapshotsЧасть 12. Управление мышкойЧасть 13. Импортирование жёстких дисковЧасть 14. JS-селекторыЧасть 15. ЦиклыЧасть 16. Макросы с объявлениями

Спецификация языка

Общая структура скриптовых файловБазовые конструкции языкаOбъявление виртуальной машиныОбъявление виртуального флеш-накопителяОбъявление виртуальной сетиПараметрыОбъявление тестовМакросыДействия с виртуальными машинамиДействия с мышкойПоиск изображений на экранеДействия с виртуальными флеш-накопителямиУсловияЦиклыСписок идентификаторов клавиш

Запросы на языке Javascript

Общая концепция построения JS-селекторовВстроенные глобальные функции JavascriptИсключенияКласс TextTensorКласс ImgTensorКласс Point

Циклы

Язык Testo поддерживает использование циклов. Циклы применяются на том же уровне, что и действия (то есть внутри тела команд) Формат циклов выглядит следующим образом:

for (<counter> IN <range>) {
    action1
    action2
    action3
    ...
} [else {
    action1
    action2
    ...
}]

Заголовок цикла

В заголовке цикла необходимо объявить переменную <counter>, которая будет использоваться как счетчик. Количество итераций цикла можно указать с помощью диапазона <range>. Диапазон можно задать следующими способами:

  1. RANGE <start> <finish>, где в качестве start и finish используются неотрицательные целые числа или строки. В случае использования строк значение выражения внутри строки должно быть приводимым к неотрицательному целому числу. Внутри строки можно использовать обращение к параметрам. Значение finish должно быть больше значения start. При использовании такой конструкции счетчик counter в ходе выполнения цикла будет принимать последовательные целочисленные значения, начиная от start (включительно) и заканчивая finish - 1
  2. RANGE <finish>. Можно рассматривать как частный случай предыдущего варианта использования, в котором в качестве start используется значение по умолчанию 0

Примеры диапазонов:

RANGE 5 10 # Счетчик примет значения 5, 6, 7, 8, 9
RANGE "5" "10" # Равносительно предыдущему примеру
RANGE 5 # Счетчик примет значения 0, 1, 2, 3, 4
RANGE "${max_iterations}" # Счетчик примет значения в зависимости от параметра max_iterations

Тело цикла

Внутри цикла можно использовать все те конструкции, которые можно указывать в теле команд, из которых состоит тест: действия, условия, циклы, вызов макросов. Внутри цикла дополнительно можно использовать действия управления циклом: continue (переход к следующей итерации) и break (выход из цикла).

Для цикла можно указать необязательную секцию else. Управление переходит в эту секцию в том случае, если тело цикла for успешно отработало (т.е. за время работы цикла не был вызыван break).

Внутри цикла можно обратиться к переменной-счетчику, как к обычному параметру.

Пример:

test some_test {
    some_vm {
        for (i IN RANGE "5" "100") {
            if ("${i}" EQUAL "10") {
                continue
            }
            print "${i}"
            if ("${i}" EQUAL "20") {
                break
            }
        } else {
            print "All the loops worked without a break"
        }
    }
}

Заметим, что в этом случае к блоку else управление никогда не перейдет, т.к. на пятнадцатой итерации обязательно сработает break.