Skip to content

Latest commit

 

History

History
465 lines (354 loc) · 32.9 KB

readme.md

File metadata and controls

465 lines (354 loc) · 32.9 KB

Описание публичного интерфейса библиотеки

Стандартная библиотека шагов

для использования в собственных фичах

Стандартные библиотечные шаги, подключаемые автоматически для любой фичи, находятся в каталоге features/lib

  • ВыполнениеКоманд.feature - выполнение команд системы и запуск процессов
  • ФайловыеОперации.feature - создание файлов/каталогов, их копирование, анализ содержимого файлов

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

Очень полезный функционал, упрощающий написание фич.

Происходит подмена строк или путей, если установлена соответствующая переменная/ключ в контексте.

Пример:

    Дано Я сохраняю значение 356 в переменную "ПеременнаяДляУстановки"
    Тогда Значение "ПеременнаяДляУстановки" равно 356

или

    Дано Я создаю временный каталог и сохраняю его в переменной "СпециальныйКаталог"
    Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом "текст178"
    Тогда Файл "СпециальныйКаталог/ФайлСТекстом.txt" содержит "178"

Есть небольшие ограничения:

  • Если переданная строка используется как путь к каталогу или файлу, то замениться может только первая часть пути.

    • Например, СпециальныйКаталог/ФайлСТекстом.txt будет подменено
    • а Каталог1\СпециальныйКаталог/ФайлСТекстом.txt уже не будет заменено
  • Если переданная строка используется не как путь, тогда ищется полное соответствие строки и ключа контекста

    • Например, если есть переменная контекста СпециальнаяПеременная
    • тогда строка СпециальнаяПеременная будет подменена на значение из контекста,
    • а строка Текст СпециальнаяПеременная уже не будет заменена.

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

Выполнение команд

  • Я выполняю команду "oscript"
  • я вижу в консоли вывод "Version"
  • я вижу в консоли вывод
        я вижу в консоли вывод
            | Usage |
            | Special mode: oscript.exe <mode> |
  • я не вижу в консоли вывод "Несуществующая строка"
  • я не вижу в консоли вывод
        я не вижу в консоли вывод
            | Несуществующая строка |
            | Несуществующая строка |
  • Вывод команды "oscript" содержит
        Вывод команды "oscript" содержит
            | Usage |
            | Special mode: oscript.exe <mode> |
  • Тогда Вывод команды "oscript" не содержит
        Тогда Вывод команды "oscript" не содержит
            | Несуществующая строка 1 |
            | Несуществующая строка 2 |
  • я вижу в консоли строку подобно "(\d+\.){3}\d+"
  • я не вижу в консоли строку подобно "(\d+\.){5}"
  • Я показываю вывод команды
  • Вывод команды "oscript" не содержит "КаталогПроекта"
  • Я сообщаю вывод команды "oscript"
  • Код возврата равен 0
  • Код возврата команды "oscript" равен 2
  • Я выполняю команду "oscript" с параметрами "-version"
  • Я выполняю команду "oscript" с параметрами "<КаталогПроекта>"
  • Я добавляю параметр "-version" для команды "oscript"
  • Когда Я добавляю параметры для команды "oscript"
        Когда Я добавляю параметры для команды "oscript"
            | -version |
  • Когда Я устанавливаю путь выполнения команды "МоеПриложение" как "КаталогПроекта/src/bdd.os"

  • Когда я завершаю работу приложения "НесуществующееПриложение13874.exe"

  • Дано Я очищаю параметры команды "oscript" в контексте

  • И я включаю отладку лога с именем "bdd.tests"

  • И я выключаю отладку лога с именем "bdd.tests"

  • И я включаю полную отладку логов пакетов OneScript

  • И я выключаю полную отладку логов пакетов OneScript

Управление файлами и каталогами

Постоянные и временные каталоги

  • И Я сохраняю каталог проекта в контекст

  • Дано Я создаю временный каталог и сохраняю его в переменной "СпециальныйКаталог"

  • Допустим Я создаю временный каталог и сохраняю его в контекст

  • И Я устанавливаю временный каталог как рабочий каталог

  • И Я установил рабочий каталог как текущий каталог

  • И Я установил подкаталог "folder0" рабочего каталога как текущий каталог

  • И Я показываю текущий каталог

  • Тогда Я показываю каталог проекта

  • И Я показываю рабочий каталог

Создание каталогов

  • И Я создаю каталог "folder0/folder01" в рабочем каталоге

  • И Я создаю каталог "folder011" в подкаталоге "folder0/folder01" рабочего каталога

  • Когда Я создаю каталог "СпециальныйКаталог/folder0/folder01"

  • Когда Я создаю каталог "folder1/folder11" внутри каталога "СпециальныйКаталог"

  • Допустим Я создаю временный каталог и сохраняю его в контекст

Создание файлов

  • Когда Я создаю файл "folder0/file01.txt" в рабочем каталоге

  • И Я создаю файл "file01" в подкаталоге "folder0/folder01" рабочего каталога

  • Когда Я создаю файл "СпециальныйКаталог/file01.txt"

  • Когда Я создаю файл "folder1/file11.txt" внутри каталога "СпециальныйКаталог"

  • Тогда Файл "СпециальныйКаталог/folder1/file11.txt" существует

Создание и анализ файлов с нужным текстом

  • Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом "текст178"

  • Тогда Файл "СпециальныйКаталог/ФайлСТекстом.txt" содержит "178"

  • Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом

  • Тогда я показываю текст файла "СпециальныйКаталог/ФайлСТекстом.txt"

  • И я показываю 2 строки файла "СпециальныйКаталог/ФайлСТекстом.txt"

  • Тогда Файл "folder0/file01.txt" содержит "Текст файла"

  • И Файл "folder0/file01.txt" не содержит "Не существующий текст"

  • Тогда Файл "folder0/file01.txt" в рабочем каталоге содержит "Текст файла"

  • И Файл "folder0/file01.txt" в рабочем каталоге не содержит "Не существующий текст"

Пример шагов:

        Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом
        """
            строка 1
            строка 2
        """
        Тогда я показываю текст файла "СпециальныйКаталог/ФайлСТекстом.txt"
        И я показываю 2 строки файла "СпециальныйКаталог/ФайлСТекстом.txt"
        Тогда Файл "СпециальныйКаталог/ФайлСТекстом.txt" содержит
        """
            строка 1
            строка 2
        """

Копирование файлов и каталогов

  • Я копирую файл "xxx/file01.txt" в каталог "yyy/zzz"

  • Я копирую файл проекта "xxx/file01.txt" в каталог "yyy/zzz"

  • Я копирую каталог "xxx/nnn" в каталог "yyy/zzz"

  • Я копирую каталог проекта "xxx/nnn" в каталог "yyy/zzz"

    • учитываются различные шаблонные переменные
      • РабочийКаталог, КаталогПроекта или "." или любые специальные каталоги, ранее заданные
    • текущий каталог можно не указывать
      # пример копирования в текущий каталог -
      И Я копирую файл "РабочийКаталог/fixtures/ИмяФайла" в каталог "."
      # пример копирования в текущий каталог -
      И Я копирую файл проекта "fixtures/ИмяФайла" в каталог "ТекущийКаталог/ВложенныеКаталоги"
      # пример копирования в рабочий каталог -
      И Я копирую файл "СпециальныйКаталог/ИмяФайла" в каталог "РабочийКаталог"
      # пример копирования в специальный каталог -
      И Я копирую файл проекта "fixtures/ИмяФайла" в каталог "СпециальныйКаталог"
      # пример копирования в подкаталоги текущего каталога -
      И Я копирую файл "КаталогПроекта/fixtures/ИмяФайла" в каталог "./ВложенныеКаталоги"
  • Когда Я копирую файл "step_definitions/БезПараметров.os" из каталога "tests/fixtures" проекта в рабочий каталог

  • И Я копирую файл "fixtures/test-report.xml" из каталога "tests" проекта в подкаталог "folder0/folder01" рабочего каталога

  • Когда Я копирую каталог "fixtures/step_definitions" из каталога "tests/fixtures" проекта в рабочий каталог

  • И Я копирую каталог "fixtures/step_definitions" из каталога "tests" проекта в подкаталог "folder0/folder01" рабочего каталога

Удаление каталогов и файлов

  • Когда Я удаляю каталог "СпециальныйКаталог/КаталогДляУдаления"
  • Когда Я удаляю файл "СпециальныйКаталог/ФайлДляУдаления.txt"

Проверка существования каталогов и файлов

  • Тогда Каталог "СпециальныйКаталог/folder0" существует

    • или Тогда Каталог "СпециальныйКаталог/folder0/folder01" существует
  • И Каталог "СпециальныйКаталог/folder0/folder01-unknown" не существует

  • Тогда Файл "СпециальныйКаталог/file01.txt" существует

  • И Файл "folder01/file01-unknown.txt" не существует

  • Тогда В рабочем каталоге существует каталог "folder0/folder01"

  • И В подкаталоге "folder0/folder01" рабочего каталога существует каталог "folder011"

  • И В подкаталоге "folder0/folder01" рабочего каталога существует каталог "*011"

  • Тогда Каталог "folder0" внутри каталога "СпециальныйКаталог" существует

    • или И Каталог "folder0/folder01" внутри каталога "СпециальныйКаталог" существует
  • И Каталог "folder0/folder01-unknown" внутри каталога "СпециальныйКаталог" не существует

  • Тогда В рабочем каталоге существует файл "folder0/file01.txt"

    • или Тогда В рабочем каталоге существует файл "folder0/*01.txt"
  • И В подкаталоге "folder0/folder01" рабочего каталога существует файл "file01"

    • или И В подкаталоге "folder0/folder01" рабочего каталога существует файл "*01"

Управление стеком текущих каталогов

  • И Я установил рабочий каталог как текущий каталог
  • И Я установил подкаталог "folder0" рабочего каталога как текущий каталог
  • И Я восстановил предыдущий каталог

Управление переменными контекста

  • Дано Я сохраняю значение 356 в переменную "ПеременнаяДляУстановки"

  • Тогда Значение "ПеременнаяДляУстановки" равно 356

  • Когда Я сохраняю значение "ПеременнаяДляУстановки" в переменную "ВтораяПеременнаяДляЧтения"

  • Тогда Значение "ВтораяПеременнаяДляЧтения" равно 356

Проверка значений

  • Тогда Значение "ПеременнаяДляЧтения" равно "123"
  • Тогда Значение "ТретьяПеременнаяДляЧтения" равно "123"

Управление переменными окружения

Важно: значения в переменных окружения всегда хранятся как строки, т.е. для любого значения выполняется приведение к строке.

  • Дано Я сохраняю значение 123 в переменную "ПеременнаяДляУстановки"

  • Когда Я устанавливаю переменную окружения "BDDVAR1" из переменной "ПеременнаяДляУстановки"

  • Тогда я получаю переменную окружения "BDDVAR1" в переменную "ПеременнаяДляЧтения"

  • И Я очищаю значение переменных окружения

        И Я очищаю значение переменных окружения
                |BDDVAR1|

Пропуск сценария

  • Я пропускаю этот сценарий в Linux
  • Я пропускаю этот сценарий в Windows

Подготовка рабочего каталога и тестовой ИБ

  • я подготовил репозиторий и рабочий каталог проекта

    фактически выполняются следующие шаги

    • Дано я выключаю отладку лога с именем "oscript.app.vanessa-runner"
    • И Я очищаю параметры команды "oscript" в контексте
    • И Я создаю временный каталог и сохраняю его в контекст
    • И Я устанавливаю временный каталог как рабочий каталог
    • И Я создаю каталог "build/out" в рабочем каталоге
    • И Я установил рабочий каталог как текущий каталог
    • И Я сохраняю каталог проекта в контекст
  • я подготовил рабочую базу проекта "./build/ib" по умолчанию

    фактически выполняются следующие шаги

    • я подготовил репозиторий и рабочий каталог проекта - шаг расшифрован выше
    • И Я копирую каталог "cf" из каталога "tests/fixtures" проекта в рабочий каталог
    • Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os init-dev --src ./cf --nocacheuse --ibconnection /F%1"
      • где %1 заменяется на путь к ИБ, указанный в параметре шага "./build/ib"
    • Я очищаю параметры команды "oscript" в контексте
  • я инициализирую репозиторий git в рабочем каталоге

Сборка пакета

  • я собираю пакет во временном каталоге
  • я устанавливаю пакет из файла собранного пакета
  • я выполняю команду получения версии установленного пакета "oscript src\main.os version"
  • версия установленного пакета равна версии пакета из контекста

API фреймворка

для использования в собственных шагах, реализованных в коде скрипта на языке OneScript

Программный контекст

Для обмена информацией внутри кода реализации шагов можно использовать API контекста, предоставляемый продуктом.

Описание:

  • Процедура СохранитьВКонтекст(Ключ, Значение) - сохранить значение по специальному ключу
  • Функция ПолучитьИзКонтекста(Знач Ключ) - возвращает значение по ключу

Пример кода:

//Я сохранил ключ "Ключ1" и значение 10 в программном контексте
Процедура ЯСохранилКлючИЗначениеВПрограммномКонтексте(Знач Ключ, Знач Значение) Экспорт
	БДД.СохранитьВКонтекст(Ключ, Значение);
КонецПроцедуры

//я получаю ключ "Ключ1" и значение 10 из программного контекста
Процедура ЯПолучаюКлючИЗначениеИзПрограммногоКонтекста(Знач Ключ, Знач ОжидаемоеЗначение) Экспорт
	НовоеЗначение = БДД.ПолучитьИзКонтекста(Ключ);
	Ожидаем.Что(НовоеЗначение).Равно(ОжидаемоеЗначение);
КонецПроцедуры

Программный вызов любого шага сценария - БДД.ВыполнитьШаг(Наименование)

Из кода скрипта-реализации шагов фичи можно вызывать любой известный и доступный шаг. При этом учитываются параметры, переданные в тексте шага

Сигнатура вызова: БДД.ВыполнитьШаг(Знач НаименованиеШагаСценария)

Пример кода:

    НаименованиеШагаСценария = "я записываю """ШагСценария""" в файл журнала";
    БДД.ВыполнитьШаг(НаименованиеШагаСценария);

Получение каталога текущего проекта внутри шагов сценария - БДД.КаталогПроверяемогоПроекта()

Из кода скрипта-реализации шагов фичи можно узнать каталог текущего/проверяемого проекта в зависимости от условий запуска.

Возвращаемое значение:

  • либо каталог, в который входит каталог features, если в полном пути текущего каталога есть features,
  • либо текущий каталог, если нету

Например, если файл фичи находится по пути c:\projects\myproject\features\core\my.feature, вернется значение c:\projects\myproject\

Сигнатура вызова: БДД.КаталогПроверяемогоПроекта()

Используется в библиотечном шаге Я сохраняю каталог проекта в контекст.

API подстановки переменных из контекста в строках и путях к файлам

Примеры использования в фичах

ЗначениеСУчетомПеременныхКонтекста

// Подменяет переданное значение с учетом переменных контекста
//
// Например:
//	если переменная контекста "МойКлюч" установлена в значение "МояСтрока"
//	тогда при передаче значения "МойКлюч" в метод будет получено "МояСтрока"
// т.е. ЗначениеСУчетомПеременныхКонтекста("МойКлюч") = "МояСтрока"
//
// Если переменной контекста нет, возвращается переданное значение без изменения
//
// Важно: проверяется только полное совпадение строки и имени переменной контекста, частичное вхождение не проверяется!
//
// Параметры:
//   Значение - Любой тип -
//
//  Возвращаемое значение:
//   Любой тип - результат выполнения
//
Функция ЗначениеСУчетомПеременныхКонтекста(Знач Значение) Экспорт

ПолучитьПутьФайлаСУчетомПеременныхКонтекста

// Получить путь к файлу/каталогу с учетом подмены начального пути на переменные контекста
// Например:
//	если переменная контекста "МойКлюч" установлена в значение "d:\myproject"
//	тогда при передаче значения "МойКлюч/file.txt"
//	будет получено "d:\myproject\МойКлюч/file.txt"
//
// Если переменной контекста нет или задан обычный путь файла, возвращается переданное значение без изменения
//
// Важно: подменяется только первый элемент пути, в середине и конце пути подмены не делается
//
// Финальные разделители строк устанавливаются в зависимости от ОС
//
// Параметры:
//   Путь - Строка - путь к файлу или каталогу
//
//  Возвращаемое значение:
//   Строка - Итоговый путь
//
Функция ПолучитьПутьФайлаСУчетомПеременныхКонтекста(Знач Путь) Экспорт