Перейти к основному содержимому

Контекст

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

  1. Передача данных между тестами. Если вам нужно использовать определенные данные в нескольких тестах, вы можете передать их с помощью контекстов.
  2. Работа с текучими выражениями. Контексты обеспечивают поддержку текучих выражений, что упрощает написание и чтение кода тестов.
  3. Удаление тестовых данных. После выполнения тестов вы можете использовать контексты для очистки тестовых данных, которые больше не нужны.
  4. Передача настроек Мокито. Это позволяет настроить поведение мокируемого метода прямо из теста, что упрощает процесс тестирования.

Однако стоит отметить, что механизм контекстов имеет некоторые ограничения.

  • Он не синхронизируется между клиентом и сервером.
  • Контексты тестов имеют ограниченное время жизни. Например, контекст теста "живет" только в рамках теста и событиях ПередКаждымТестом, ПослеКаждогоТеста.

Использование контекстов в тестах

При разработке тестов, вам могут пригодиться следующие контексты:

  1. Контекст теста (ЮТест.КонтекстТеста). Это структура, которая существует в рамках одного теста. Она доступна в каждом тесте и в обработчиках событий ПередКаждымТестом и ПослеКаждогоТеста, а также в аналогичных переопределенных обработчиках. Это означает, что вы можете использовать этот контекст для хранения и доступа к данным, которые нужны только в рамках одного теста.

  2. Контекст тестового набора (ЮТест.КонтекстТестовогоНабора). Это структура, которая существует в рамках набора тестов. Она доступна в каждом тесте набора и в обработчиках событий ПередТестовымНабором, ПослеТестовогоНабора, ПередКаждымТестом и ПослеКаждогоТеста, а также в аналогичных переопределенных обработчиках. Это означает, что вы можете использовать этот контекст для хранения и доступа к данным, которые нужны в рамках всего набора тестов.

  3. Контекст тестового модуля (ЮТест.КонтекстМодуля). Это структура, которая существует в рамках тестового модуля. Она доступна в каждом тесте модуля и в обработчиках событий ПередВсемиТестами, ПослеВсехТестов, ПередТестовымНабором, ПослеТестовогоНабора, ПередКаждымТестом и ПослеКаждогоТеста, а также в аналогичных переопределенных обработчиках. Это означает, что вы можете использовать этот контекст для хранения и доступа к данным, которые нужны в рамках всего тестового модуля.

  4. Контекст (ЮТест.Контекст): Это умный контекст, который облегчает работу с различными тестовыми контекстами. Он имеет два метода: Значение и УстановитьЗначение.
    Метод Значение последовательно ищет необходимое значение во всех контекстах (теста, набора, модуля) и возвращает первое найденное.
    Метод УстановитьЗначение автоматически определяет контекст, в котором вызывается установка значения, и сохраняет значение в соответствующем контексте. Это позволяет вам не задумываться о том, в каком контексте нужно сохранить данные, и при необходимости переопределять значения.

// Создаем организацию, которую будем использовать во всех тестах
// Но для конкретного набора переопределим ее
// При этом используется общий метод создания данных, который получает организацию из контекста
Процедура ПередВсемиТестами()
ЮТест.Контекст().УстановитьЗначение("Организация", НоваяОрганизация());
КонецПроцедуры

Процедура ПередТестовымНаборомДругойОрганизации()
ЮТест.Контекст().УстановитьЗначение("Организация", НоваяДругаяОрганизация()); // Переопределим настройку из модуля
КонецПроцедуры

Процедура Тест()
Документ = СоздатьДокумент();
...
КонецПроцедуры

Процедура Тест2()
ЮТест.Контекст().УстановитьЗначение("Организация", НоваяТретьяОрганизация()); // Переопределим настройку
Документ = СоздатьДокумент();
...
КонецПроцедуры

Функция СоздатьДокумент()
Документ = НовыйДокумент();
Документ.Организация = ЮТест.Контекст().Значение("Организация");
КонецФункции

Реализация

Реализация механизма контекстов включает следующие аспекты:

  • Все контексты сохраняются в глобальной структуре. Это означает, что они доступны во всем приложении и могут быть использованы в различных частях кода.
    • На клиентской стороне эта глобальная структура представлена в виде переменной модуля приложения.
    • На серверной стороне эта структура сохраняется во временном хранилище. Адрес этого хранилища сохраняется в настройках пользователя, а также кэшируется модулем повторного использования.
  • Для каждой задачи (например, контекст текучих выражений или настройки мокито) в этой структуре создается свой предопределенный элемент.
  • Методы работы с контекстами унифицированы и собраны в модуле ЮТКонтекстСлужебный. Однако не рекомендуется использовать их непосредственно в тестах.
  • У каждого контекста может быть свой собственный жизненный цикл, который контролируется конкретным механизмом движка. Это позволяет гибко управлять временем жизни контекстов в зависимости от требований решаемой задачи.