Управление соединениями во время выполнения тестов - leoniv/ass_tests GitHub Wiki
Это реально работает но немного не так как это было описано в набросках.
Ниже текст это набросок не имеет статус документа.
Одной из главных задач `ass_tests` является обеспечение легкого или даже автоматического доступа к среде исполнения 1С. В связи с этим встает вопрос когда запускать 1С клиента и когда отключиться от информационной базы? Для того, чтобы ответить на этот вопрос надо учитывать, что **запуск клиента 1С может занимать очень продолжительное время!!!** и обозначить следующие требования без выполнения которых невозможно реальное (отличное от proof-of-concept) использование:
- обязательно будет потребность запускать 1С клиент от разных пользователей информационной базы. На пример для прогона одного и того-же набора тестов для разных ролей или разделять наборы тестов в зависимости от роли пользователя и т.п.
- возможность параллельного выполнение тестов
- регулировать степень изоляции тестов друг от друга. На пример в одном наборе(ах) тестов использовать один и тот-же объект 1С. Либо наоборот выполнять каждый тест в новой сессии 1С.
- возможность прогонять один и тот-же набор тестов в разных контекстах исполнения. На пример для кода 1С определенного как для сервера так и для клиента.
- возможность использования нескольких соединений(возможно с различными базами) в одном наборе тестов
- после выполнения всех тестов не должно остаться ни одного клиента 1С запущенного в сессии тестирования!!!
Насколько такие требования выполнимы покажет время и опыт эксплуатации.
## Уровни установки соединений
> TODO: как это будет для `Minitest::Spec` в данный момент не ясно но скорее всего наборы спек надо будет заворачивать в отдельные классы
Применительно к `Minitest::Test` определим 3 круга выполнения тестов:
- `глобальный` охватывает все тесты в сессии тестирования
- `круг набора` тестов охватывает все тестовые методы описанные в классе-потомке `Minitest::Test`
- `круг теста` охватывает единственный тестовый метод
### Глобальные соединения
Соединения этого уровня описываются на пример в `test_helper.rb` и устанавливаются единственный раз при первом требовании, закрываются после всех тестов.
Позволяет свести затраты на установку и управление соединениями к минимуму. Однако, установка соединение на все время сессии тестирования, может привести к нежелательным последствиям. На пример к невозможности выполнить какой-то отдельный тест в монопольном режиме. Также глобальное соединение невозможно использовать при тестировании одного и того же кода для различных пользователей.
### Соединения набора тестов
Соединения этого уровня описываются при объявлении класса набора тестов потомка `AssTests::MiniTest::Test`. Соединение открываются всегда перед началом выполнения первого теста из набора, а закрываются после выполнения всех тестов из набора.
Используя соединения этого уровня возможно запускать один набор тестов для разных пользователей, и разных контекстов исполнения 1С. Так-же можно создать объекты 1С доступные другим тестам из набора.
### Соединения отдельного теста
По сути эти соединения являются `соединениями набора тестов` с той лишь разницей, что
соединения всегда устанавливаются перед каждым тестом и закрываются после каждого теста.
## Замечания
### Замечание #1
При использовании в качестве клиента 1С `inproc OLE` сервера, в терминах 1С, называемого `внешнее соединение` `:external` не гарантируется реальное закрытие соединения с информационной базой в пределах сессии тестирования. Подробнее об этом в документации класса `AssLauncher::Enterprise::Ole::IbConnection#__close__`. Это значит, что в списке активных соединений с информационной базой, могут присутствовать соединения закрытые на стороне Ruby. Такие соединения не позволят запустить новое соединение в монопольном режиме!
Все `внешние соединения` однозначно будут закрыты после выполнения сессии тестирования автоматически.
При использовании клиента 1С `внешнее соединение` старайтесь не плодить неконтролируемые `OLE` ссылки на объекты пораженные соединением. (TODO: надо описать подробнее что это значит с примерами)
### Замечание #2
При использовании тонкого `:thin` или толстого`:thick` 1C клиента закрытие соединения выполняется по средствам вызова метода 1С `Terminate`, что должно гарантировать реальную остановку клиента 1С (см `AssLauncher::Enterprise::Ole::ThinApplication #__close__`). Однако, если при закрытии соединения что-то пойдет не так(от 1C всего можно ожидать), то после выполнения сессии тестирования могут остаться активные соединения с информационной базой!!!
### Замечание #3
Присоседится к отладчику 1С возможно только для клиента `:external` для `:thick` и `:thin` клиентов отладка 1С кода не возможна.