1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-11-19 20:31:55 +02:00
This commit is contained in:
Корякин Алексей 2020-10-12 10:00:55 +03:00
commit 703f5dc7f1
91 changed files with 8478 additions and 0 deletions

39
.gitattributes vendored Normal file
View File

@ -0,0 +1,39 @@
# модули
* text=auto
*.bsl text eol=crlf
*.cai text eol=crlf
*.cmi text eol=crlf
*.dcs text eol=crlf
*.dcss text eol=crlf
*.dcssca text eol=crlf
*.form text eol=crlf
*.hpwa text eol=crlf
*.mdo text eol=crlf
*.mxlx text eol=crlf
*.pnrs text eol=crlf
*.rights text eol=crlf
*.schedule text eol=crlf
# картинки
*.bmp binary diff=exif
*.gif binary diff=exif
*.ico binary
*.jpeg binary diff=exif
*.jpg binary diff=exif
*.png binary diff=exif
*.svg text
# картинки
*.bin binary
*.1CD binary
# Binary file extensions that should not be modified.
*.bin binary
*.axdt binary
*.addin binary
# Исключения
src/Configuration/ParentConfigurations.bin text

35
.gitignore vendored Normal file
View File

@ -0,0 +1,35 @@
*.cfu
src/.project
*.cfl
*.lgd
*.orig
/src/Configuration/ConfigDumpInfo.xml
/allure-reports
/autotest-bia
/ci4onec
/spec/build/ib
/tys
autotest.json
VBParams.json
/allure-report/*
/buildstatus.log
/*_pid*.log
*.*.bak
# IDE
*/.settings/com._1c.g5.v8.dt.platform.services.core.prefs
*/.settings/EnvLaunchModeIndex.prefs
# Binary
*/bin/*
#wsdl
/fixtures/wsdl

17
COPYRIGHT Normal file
View File

@ -0,0 +1,17 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//

3
Jenkinsfile vendored Normal file
View File

@ -0,0 +1,3 @@
@Library('onec-ci-cd@feature/refactoring')_
pipelineStart();

201
LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

237
README.md Normal file
View File

@ -0,0 +1,237 @@
# YAXUnit. Расширение для запуска тестов
* [Назначение](#назначение)
* [Возможности](#возможности)
* [Пример тестового модуля](#пример-тестового-модуля)
* [Запуск](#запуск)
* [Конфигурация запуска](#конфигурация-запуска)
* [Строка запуска предприятия](#строка-запуска-предприятия)
* [Запуск из EDT](#запуск-из-edt)
* [Благодарности](#благодарности)
* [Лицензия](#лицензия)
## Назначение
Самостоятельное расширение для написания и выполнения модульного тестирования.
### Возможности
* YAXUnit - это расширение с открытым исходным кодом, которое используется для написания и выполнения тестов
* Разрабатывался с оглядкой на JUnit5, пожалуй лучший фреймворк тестирования
* Предоставляет движок выполнения тестов
* Предоставляет утверждения для проверки ожидаемых результатов
* Тесты могут быть организованы в наборы и выполнятся в разных контекстах
* Позволяет быстрее и проще не только писать, но и читать тесты
* Результаты тестирования могут быть сохранены в отчет, на текущий момент jUnit и json.
* Большая часть пользовательского API реализована как [текучие выражения](https://ru.wikipedia.org/wiki/Fluent_interface)
* Предусмотрена возможность расширения функциональности, можно регистрировать свои форматы отчетов, добавлять модули с утверждениями
* Реализован [плаги для EDT](https://gitlab.dellin.ru/orais/tools/ru.biatech.edt.xtest), который упрощает процесс запуска тестов
Подробнее, с функциональностью, вы можете ознакомится прочитав [документацию](docs/api-topic.md) и попробовав написать тесты
## Пример тестового модуля
Для создания теста нужно в расширении (в отдельном или в том же) добавить модуль, содержащий экспортный метод регистрации - `ИсполняемыеСценарии` и реализовать тесты.
Пример модуля тестов:
```bsl
#Область ТестыAPI
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
// Регистрация тестов
ЮТТесты // Регистрация тестов выполняет через модуль регистратор
.ТестовыйНабор ("Математические методы") // Набор - объединение тестов
.Тест("Сложение") // Обязательно при регистрации указываем имя экспортного метода
.Тест("Вычитание", "Вычитание") // Также можно указать представление теста
.Тест("Вычитание", "ВычитаниеСервер", , "Сервер") // Контекст исполнения, по умолчанию тест выполняется во всех контекстах модуля
.ТестКлиент("УмножениеНаКлиенте") // Есть отдельный метод для регистрации клиентских тестов
.ТестСервер("ДелениеНаСервере", "Деление на сервер") // Есть отдельный метод для регистрации серверных тестов
.Тест("ВызовДеления", "Вызов деления", , "ВызовСервера"); // А для вызова сервер нет метода, поэтому только так
.ТестовыйНабор("Строковые методы")
.Тест("СтрНайти")
.Тест("СтрРазделить);
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура Сложение() Экспорт
// Реализация теста на сложение
ЮТУтверждения.Что(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение
.ИмеетТип("Число") // Проверим тип
.Заполнено() // Заполненность проверяемого значения
.Больше(0) // Сравним с нулем
.Равно(5); // Проверим ожидаемый результат
ЮТУтверждения.Что(-8 + 8, "-8 + 8") // Проверим второй вариант
.Равно(0);
КонецПроцедуры
Процедура Вычитание() Экспорт
// Реализация теста на вычитание
ЮТУтверждения.Что(2 - 3, "2 - 3")
.ИмеетТип("Число")
.Заполнено()
.Меньше(0);
КонецПроцедуры
#КонецОбласти
#Область События
// Также в тесте можно обрабатывать события выполнения
// Например можно реализовать подготовку и удаление тестовых данных
// Зачистку временных файлов, настройку системы
Процедура ПередВсемиТестами() Экспорт
// Выполняется перед запуском всех тестов контекста, те если есть тесты и на клиенте и на сервер, то метод будет выполнен 2 раза
Сообщить("Запуск тестирования");
КонецПроцедуры
Процедура ПередТестовымНабором() Экспорт
// Выполняется перед каждым тестовым набором для каждого контекста выполнения
Контекст = ЮТКонтекст.КонтекстНабора(); // Контекст набора служит для хранения любых данных, нужных при тестировании
// Контекст живет в рамках контекста выполнения,
// таки образом, через контекст нельзя передавать данные между серверными и клиентскими тестами
Контекст.Вставить("ВремяНачала", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПередТестом() Экспорт
// Выполняется перед каждым тестом
Контекст = ЮТКонтекст.КонтекстТеста(); // Контекст теста служит для хранения любых данных, нужных при тестировании
// Контекст создает перед тестом и уничтожается после его выполнения
// В контекст например, можно помещать созданные в процессе данные, что бы потом их удалить
Контекст.Вставить("ВремяНачала", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПослеТеста() Экспорт
// Выполняется после каждого теста
Контекст = ЮТКонтекст.КонтекстТеста();
Сообщить("Время выполнения теста: " + ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала);
КонецПроцедуры
Процедура ПослеТестовогоНабора() Экспорт
// Выполняется после каждого тестового набора для каждого контекста выполнения
// Применяется для очистки данных и т.д.
Контекст = ЮТКонтекст.КонтекстНабора();
Сообщить("Время выполнения набора: " + ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала);
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
// Выполняется после выполнения всех тестов контекста, те если есть тесты и на клиенте и на сервер, то метод будет выполнен 2 раза
// В этом событии все контексты уже уничтожены
Сообщить("Тестирование завершено");
КонецПроцедуры
#КонецОбласти
```
После запуска тестов модуля в EDT получаем такой отчет:
![Отчет](docs/images/report.PNG)
## Запуск
Для запуска тестов необходимо создать конфигурацию запуска и указать ее при запуске предприятия в параметре `RunUnitTests`
### Конфигурация запуска
Конфигурация настраивается в файле json и может иметь следующие параметры:
| Имя параметра | Тип | Значение по умолчанию | Описание |
|-------------------|-----------|-----------------------|--------------------------------------------------------------------------------------------------------------|
| `filter` | `Object` | Object, смотрите ниже | Параметры фильтрации, поиска тестов |
| `reportFormat` | `String` | `"jUnit"` | Формат отчета о тестировании, возможные значения: `"jUnit"`, `"JSON"` |
| `reportPath` | `String` | `""` | Путь к формируемому отчету, можно указать или каталог (в которому будет создан файл отчета) или путь к файлу |
| `closeAfterTests` | `Boolean` | `True` | Признак закрытия 1С:Предприятие по завершению тестирования |
Параметры фильтрации:
| Имя параметра | Тип | Значение по умолчанию | Описание |
|---------------|---------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------|
| `extensions` | `Array` | `["tests"]` | Список имен расширений, из которых грузятся тесты |
| `modules` | `Array` | `Null` | Список имен модулей, из которых грузятся тесты |
| `suites` | `Array` | `Null` | **Не реализованно.** Список имен тестовых наборов, которые будут запускаться |
| `tags` | `Array` | `Null` | **Не реализованно.** Список тегов, которые будут запускаться |
| `contexts` | `Array` | `Null` | **Не реализованно.** Список имен контекстов исполнения, в которых будут запускаться тесты |
| `paths` | `Array` | `Null` | **Не реализованно.** Список полных путей к исполняемым тестам (`[имя модуля.имя теста|имя модуля.имя теста.имя контекста]`) |
Примеры:
1. Запустить тесты из расширения `tests`, расположенные в модулях `МодульТестов1`, `МодульТестов2`, закрыть предприятие по завершении и сохранить отчет в формате `junit`
```JSON
{
"filter": {
"modules": ["МодульТестов1", "МодульТестов2"]
},
"reportPath": "C:\\temp\\jUnit\\report.xml",
"reportFormat": "jUnit",
"closeAfterTests": true
}
```
2. Запустить все тесты из расширения `YAXUNIT` и сохранить отчет файл `C:\temp\jUnit\report.xml`, остальные параметры будут установлены по умолчанию
```JSON
{
"filter": {
"extensions": ["YAXUNIT"]
},
"reportPath": "C:\\temp\\jUnit\\report.xml"
}
```
### Строка запуска предприятия
`[путь к клиенту 1С] ENTERPRISE [Параметры подключения к ИБ] [Параметры авторизации] /C RunUnitTests=/путь/к/конфигурационному/файлу`
*После загрузки расширения в информационную базу необходимо отключить у него `безопасный режим` и `защиту от опасных действий`*
Пример:
`"C:\Program Files\1cv8\8.3.18.1698\bin\1cv8c.exe" ENTERPRISE /IBName MyInfoBase /N Admin /C RunUnitTests=C:\tmp\test-config.json`
Запуск тестов в режиме тонкого клиента на информационной базе `MyInfoBase` под пользователем `Admin` по конфигурации указанной в файле `C:\tmp\test-config.json`
### Запуск из EDT
При разработке в EDT процесс запуска тестов можно упростить, установив [плагин](https://gitlab.dellin.ru/orais/tools/ru.biatech.edt.xtest)
и настроив конфигурацию запуска, как указано в описании плагина.
## Благодарности
Приносим благодарность всему [open-source сообществу 1с](https://github.com/topics/1c-enterprise) за идеи и мотивацию.
Особая благодарность авторам и контрибьютерам проектов
* [xUnitFor1C](https://github.com/xDrivenDevelopment/xUnitFor1C/graphs/contributors)
* [vanessa-automation](https://github.com/Pr-Mex/vanessa-automation/graphs/contributors)
* [add](https://github.com/vanessa-opensource/add/graphs/contributors)
---
## Лицензия
Copyright © 2022 [BIA-Technologies Limited Liability Company](http://bia-tech.ru/)
Distributed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html)

7
docs/api-topic.md Normal file
View File

@ -0,0 +1,7 @@
# Пользовательский API
Текущая версия расширения предоставляет разработчикам тестов методы для удобной [регистрации тестов](test-registration.md).
Имеются [базовые методы проверки](assertions.md) результатов работы различных механизмов системы.
Планируется расширять существующий API и реализовать нужный недостающий функционал.

25
docs/assertions.md Normal file
View File

@ -0,0 +1,25 @@
# Утверждения
Утверждения реализует модуль `ЮТУтверждения`
Особенности
* API реализован по модели [текучих выражения](https://ru.wikipedia.org/wiki/Fluent_interface), с целью повышения удобства и читаемости тестов
```bsl
ЮТУтверждения.Что(Контекст)
.Свойство("ПрефиксОшибки").Равно("Контекст метода с параметрами")
.Свойство("ИмяМетода").Равно("МетодБезИсключение")
.Свойство("ПараметрыМетода").ИмеетТип("Массив")
.Свойство("ПараметрыМетода").ИмеетДлину(1);
```
* Большая часть методов это сравнения фактического и ожидаемого результат, но есть несколько методов настройки
* `Что` - устанавливает проверяемый объект. Все дальнейшие проверки будут выполняется с этим объектом
* `Метод` - устанавливает имя и параметры проверяемого метода. Для методов имеет два утверждения `ВыбрасываетИсключение` и `НеВыбрасываетИсключение`
* `Параметр` - добавляет параметр метода. Создан для удобства установки параметров проверяемого метода
* `Свойство` - устанавливает проверяемое свойство и проверяет его наличие.
* Можно указывать вложенные свойства через точку, например, `Свойство("Контекст.ИмяМетода")`.
* Также, первая проверка вызванная после этого метода будет относится к свойству объекта.
Например, `ЮТУтверждения.Что(Контекст).Свойство("ИмяМетода").Равно("МетодБезИсключение")` эквивалентно `Контекст.ИмяМетода = "МетодБезИсключение"`

BIN
docs/images/report.PNG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

10
docs/test-registration.md Normal file
View File

@ -0,0 +1,10 @@
# Регистрация тестовых методов
Работа с регистрацией тестовых методов реализована в модуле `ЮТТесты`.
Возможности:
* Объединять тесты в наборы, указывать теги, по которым возможно формировать отборы запускаемых тестов
* Указать контекст вызова, например, для клиент-серверного модуля (или метода) можно реализовать два теста в одном тестовом модуле, проверяющих логику и на клиенте, и на сервере.
* Организовывать черновика, регистрируя нереализованные тесты
* Планируется, предоставить функционал параметризированных тестов.

18
exts/yaxunit/.project Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>yaxunit</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
<nature>com._1c.g5.v8.dt.core.V8ExtensionNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,8 @@
{
"version": 1,
"settings": {
"common-module-type": {
"enabled": false
}
}
}

View File

@ -0,0 +1,11 @@
CLIENT=false
EXTERNAL_CONN=false
MNG_CLIENT=true
MOBILE_AUTONOMOUS_SERVER=false
MOBILE_CLIENT=false
MOBILE_SERVER=false
MOBILE_THIN_CLIENT=false
SERVER=true
THIN_CLIENT=true
WEB_CLIENT=true
eclipse.preferences.version=1

View File

@ -0,0 +1,17 @@
alwaysEndWithSemicolon=true
autowrapBinary=indent_on_wrap
autowrapInvocation=alignment_on_wrap
autowrapMethodParameters=alignment_on_wrap
creatorEmptyBrackets=never brackets
defaultValuesInitialized=true
eclipse.preferences.version=1
formattingOn=true
indentMethodInternal=true
invocationEmptyParamsDelimited=true
keywordStandard=CamelCase
noindent_preprocessor=true
projectSpecificSettingsInited=true
showWhitespaceCharacters=true
softFormatassignmentStatement=true
spacesForTabs=false
whitespaceMethodParamsDelimited=true

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
yaxunit={"templates"\:[]}

View File

@ -0,0 +1,9 @@
eclipse.preferences.version=1
subordinate/commands=true
subordinate/forms=true
subordinate/methods=true
subordinate/operations=true
subordinate/tabularSections=true
subordinate/templates=true
subordinate/urlTemplates=true
topObjects=true

View File

@ -0,0 +1,3 @@
addModuleStrictTypesAnnotation=true
createModuleStructure=true
eclipse.preferences.version=1

View File

@ -0,0 +1,3 @@
commonChecks=true
eclipse.preferences.version=1
standardChecks=true

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -0,0 +1,59 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ТестыAPI
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
ЮТТесты
.Тест("ТестовыйМетод")
;
КонецПроцедуры
#КонецОбласти
#Область События
Процедура ПередТестом() Экспорт
НачатьТранзакцию();
КонецПроцедуры
Процедура ПослеТеста() Экспорт
Пока ТранзакцияАктивна() Цикл
ОтменитьТранзакцию();
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область Тесты
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,3 @@
Manifest-Version: 1.0
Runtime-Version: 8.3.10
Base-Project: configuration

View File

@ -0,0 +1,56 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ТестыAPI
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
ЮТТесты
.ТестКлиент("ВыполнитьМодульноеТестирование");
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура ВыполнитьМодульноеТестирование() Экспорт
ПараметрыЗапуска = ЮТФабрика.ПараметрыЗапуска();
ПараметрыЗапуска.filter.extensions = ЮТОбщий.ЗначениеВМассиве("tests");
ЮТУтверждения.Что(ЮТИсполнитель, "Не указан каталог отчетов")
.Метод("ВыполнитьМодульноеТестирование").Параметр(ПараметрыЗапуска)
.ВыбрасываетИсключение("Не указан путь сохранения отчета");
ПараметрыЗапуска.reportPath = ПолучитьИмяВременногоФайла(".xml");
ЮТУтверждения.Что(ЮТИсполнитель, "Не указан каталог отчетов")
.Метод("ВыполнитьМодульноеТестирование").Параметр(ПараметрыЗапуска)
.НеВыбрасываетИсключение();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="08088de7-5b64-4a8b-8f7d-f4eea96170a4">
<name>ОМ_ЮТИсполнитель</name>
<synonym>
<key>ru</key>
<value>Исполнитель</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="efa2f292-fc8c-4a2e-821e-acf31177de27">
<name>ОМ_ЮТУтверждения</name>
<synonym>
<key>ru</key>
<value>Тесты утверждений</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
</mdclass:CommonModule>

View File

@ -0,0 +1,199 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ТестыAPI
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
ЮТТесты
.Тест("ПрочитатьНаборыТестов")
.Тест("ИсполняемыеСценарииМодуля")
.Тест("ЭтоТестовыйМодуль");
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура ПрочитатьНаборыТестов() Экспорт
ПараметрыЗапуска = ЮТФабрика.ПараметрыЗапуска();
ПараметрыЗапуска.filter.extensions = Неопределено;
ПараметрыЗапуска.filter.modules = ЮТОбщий.ЗначениеВМассиве("ОМ_ЮТЧитатель");
Наборы = ЮТЧитатель.ПрочитатьНаборыТестов(ПараметрыЗапуска);
ЮТУтверждения.Что(Наборы, "Прочитанные наборы")
.ИмеетТип("Массив")
.ИмеетДлину(1);
НаборМодуля = Наборы[0];
ЮТУтверждения.Что(НаборМодуля, "Набор тестов ОМ_ЮТЧитатель")
.ИмеетТип("Структура")
.Свойство("МетаданныеМодуля").ИмеетТип("Структура")
.Свойство("НаборыТестов").ИмеетТип("Массив");
МетаданныеМодуля = НаборМодуля.МетаданныеМодуля;
ЮТУтверждения.Что(МетаданныеМодуля, "Метаданные модуля")
.Заполнено()
.ИмеетТип("Структура")
.Свойство("Имя").Равно("ОМ_ЮТЧитатель")
.Свойство("КлиентОбычноеПриложение").Равно(Истина)
.Свойство("КлиентУправляемоеПриложение").Равно(Истина)
.Свойство("ВызовСервера").Равно(Ложь)
.Свойство("ПолноеИмя").Равно("YAXUNIT.ОМ_ЮТЧитатель")
.Свойство("Сервер").Равно(Ложь);
НаборыТестов = НаборМодуля.НаборыТестов;
ЮТУтверждения.Что(НаборыТестов, "Наборы тестов модуля")
.ИмеетТип("Массив")
.ИмеетДлину(1);
ЮТУтверждения.Что(НаборыТестов[0], "Набор тестов модуля")
.ИмеетТип("Структура")
.Свойство("Имя").Равно("Тесты")
.Свойство("ОписаниеОшибки")
.Свойство("Представление").Равно("ОМ_ЮТЧитатель")
.Свойство("Теги").ИмеетТип("Массив")
.Свойство("Теги").ИмеетДлину(0)
.Свойство("Тесты").ИмеетТип("Массив");
Тесты = НаборыТестов[0].Тесты;
ЮТУтверждения.Что(Тесты.Количество(), "Количество тестов модуля")
.БольшеИлиРавно(1);
ЮТУтверждения.Что(Тесты[0], "Первый тест")
.Свойство("Имя").Равно("ПрочитатьНаборыТестов")
.Свойство("Представление").Равно("ПрочитатьНаборыТестов")
.Свойство("Теги").ИмеетТип("Массив")
.Свойство("Теги").ИмеетДлину(0)
.Свойство("КонтекстВызова").ИмеетТип("Массив")
.Свойство("КонтекстВызова").Содержит("КлиентУправляемоеПриложение")
.Свойство("КонтекстВызова").Содержит("КлиентОбычноеПриложение")
.Свойство("КонтекстВызова").ИмеетДлину(2);
ПараметрыЗапуска = ЮТФабрика.ПараметрыЗапуска();
ПараметрыЗапуска.filter.extensions = ЮТОбщий.ЗначениеВМассиве("tests");
Наборы = ЮТЧитатель.ПрочитатьНаборыТестов(ПараметрыЗапуска);
ЮТУтверждения.Что(Наборы, "Прочитанные наборы расширения tests")
.ИмеетДлину(2);
КонецПроцедуры
Процедура ИсполняемыеСценарииМодуля() Экспорт
МетаданныеМодуля = Новый Структура;
МетаданныеМодуля.Вставить("Имя", "ОМ_СтроковыеФункцииКлиентСервер");
МетаданныеМодуля.Вставить("КлиентУправляемоеПриложение", Истина);
МетаданныеМодуля.Вставить("КлиентОбычноеПриложение", Истина);
МетаданныеМодуля.Вставить("Клиент", Ложь);
МетаданныеМодуля.Вставить("Сервер", Истина);
МетаданныеМодуля.Вставить("ВызовСервера", Ложь);
Сценарии = ЮТЧитатель.ИсполняемыеСценарииМодуля(МетаданныеМодуля);
ЮТУтверждения.Что(Сценарии, "Сценарии")
.ИмеетТип("Массив")
.ИмеетДлину(3);
Наборы = ЮТОбщий.КоллекцияВСоответствие(Сценарии, "Имя");
ЮТУтверждения.Что(Наборы, "Наборы тестов")
.Свойство("Тесты").ИмеетТип("Структура")
.Свойство("ТестовыйНабор").ИмеетТип("Структура")
.Свойство("Тестовый набор 2").ИмеетТип("Структура")
.ИмеетДлину(3);
Набор1 = Наборы["Тесты"];
Набор2 = Наборы["ТестовыйНабор"];
Набор3 = Наборы["Тестовый набор 2"];
ЮТУтверждения.Что(Набор1, "Набор по умолчанию")
.Свойство("Имя").Равно("Тесты")
.Свойство("Представление").Равно("ОМ_СтроковыеФункцииКлиентСервер")
.Свойство("Теги").ИмеетДлину(0)
.Свойство("Тесты").ИмеетДлину(3);
ЮТУтверждения.Что(Набор2, "Набор ""ТестовыйНабор""")
.Свойство("Имя").Равно("ТестовыйНабор")
.Свойство("Представление").Равно("ТестовыйНабор")
.Свойство("Теги").ИмеетДлину(0)
.Свойство("Тесты").ИмеетДлину(3);
ЮТУтверждения.Что(Набор3, "Набор ""Тестовый набор 2""")
.Свойство("Имя").Равно("Тестовый набор 2")
.Свойство("Теги").ИмеетДлину(2)
.Свойство("Тесты").ИмеетДлину(1);
ТестыПоУмолчанию = Набор1.Тесты;
ЮТУтверждения.Что(ТестыПоУмолчанию[0], "Первый тест набора по умолчанию")
.ИмеетТип("Структура")
.Свойство("Имя").Равно("ТестовыйМетод3")
.Свойство("Представление").Равно("Тестовый метод 3")
.Свойство("Теги").ИмеетДлину(0)
.Свойство("КонтекстВызова").Содержит("КлиентОбычноеПриложение")
.Свойство("КонтекстВызова").Содержит("КлиентУправляемоеПриложение")
.Свойство("КонтекстВызова").Содержит("Сервер")
.Свойство("КонтекстВызова").ИмеетДлину(3);
ЮТУтверждения.Что(ТестыПоУмолчанию[1], "Второй тест набора по умолчанию")
.Свойство("Имя").Равно("ТестовыйМетод4")
.Свойство("Представление").Равно("ТестовыйМетод4")
.Свойство("Теги").ИмеетДлину(0)
.Свойство("КонтекстВызова").Содержит("КлиентОбычноеПриложение")
.Свойство("КонтекстВызова").Содержит("КлиентУправляемоеПриложение")
.Свойство("КонтекстВызова").ИмеетДлину(2);
ЮТУтверждения.Что(ТестыПоУмолчанию[2], "Третий тест набора по умолчанию")
.Свойство("Имя").Равно("ТестовыйМетод4")
.Свойство("КонтекстВызова").Содержит("Сервер")
.Свойство("КонтекстВызова").ИмеетДлину(1);
КонецПроцедуры
Процедура ЭтоТестовыйМодуль() Экспорт
Варианты = Новый Структура();
Варианты.Вставить("ОМ_ЮТЧитатель", Истина);
Варианты.Вставить("ОМ_СтроковыеФункцииКлиентСервер", Истина);
Варианты.Вставить("ОМ_ОшибкаЗагрузкиСценариев", Истина);
Варианты.Вставить("ЮТЧитатель", Ложь);
Для Каждого Вариант Из Варианты Цикл
ОписаниеМодуля = ЮТМетаданныеСервер.МетаданныеМодуля(Вариант.Ключ);
ЮТУтверждения.Что(ЮТЧитатель.ЭтоТестовыйМодуль(ОписаниеМодуля), "Проверка модуля " + Вариант.Ключ)
.Равно(Вариант.Значение);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ce99a867-ae9c-4820-8498-9935fe18879e">
<name>ОМ_ЮТЧитатель</name>
<synonym>
<key>ru</key>
<value>Читатель</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,79 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Основной модуль для запуска тестирования
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// Инициализировать
// Выполняет чтение и инициализацию параметров подсистемы тестирования
// Параметры:
// ПараметрыЗапускаСтрокой - Строка - Строка запуска приложения
//
// Возвращаемое значение:
// Структура - Набор прочитанных параметров. См. ЮТПараметры.Параметры
Функция Инициализировать(Знач ПараметрыЗапускаСтрокой) Экспорт
Возврат ЮТПараметры.ПараметрыЗапуска(ПараметрыЗапускаСтрокой);
КонецФункции
// ВыполнятьМодульноеТестирование
// Возвращает признак необходимости выполнять модульное тестирование
// Параметры:
// Параметры - См. ЮТПараметры.Параметры
//
// Возвращаемое значение:
// Булево - Необходимость выполнения модульного тестирования
Функция ВыполнятьМодульноеТестирование(Параметры) Экспорт
Возврат Параметры.ВыполнятьМодульноеТестирование;
КонецФункции
// ВыполнитьМодульноеТестирование
// Запускает выполнение модульного тестирования
//
// Параметры:
// Параметры - См. ЮТПараметры.Параметры
Процедура ВыполнитьМодульноеТестирование(Параметры = Неопределено) Экспорт
Если Параметры = Неопределено Тогда
Параметры = ЮТ.Инициализировать(ПараметрЗапуска);
КонецЕсли;
Если НЕ ВыполнятьМодульноеТестирование(Параметры) Тогда
Возврат;
КонецЕсли;
ЮТКонтекст.ИнициализироватьКонтекст();
ЮТИсполнитель.ВыполнитьМодульноеТестирование(Параметры);
Если Параметры.CloseAfterTests Тогда
ПрекратитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="34241a49-2c1e-41ac-b97b-f22be47c83e8">
<name>ЮТ</name>
<synonym>
<key>ru</key>
<value>ЮТ</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,402 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// ВыполнитьМодульноеТестирование
// Метод, по параметрам запуска, запускает выполнение всего процесса тестирования.
//
// Параметры:
// ПараметрыЗапускаТестов - Структура - Параметры запуска тестирования, см. ЮТФабрика.ПараметрыЗапуска() и см. ЮТПараметры.ПрочитатьПараметрыЗапуска
Процедура ВыполнитьМодульноеТестирование(ПараметрыЗапускаТестов) Экспорт
ТестовыеМодули = ЮТЧитатель.ПрочитатьНаборыТестов(ПараметрыЗапускаТестов);
РезультатыТестирования = Новый Массив();
Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл
РезультатыПрогона = ПрогонТестовМодуля(ТестовыйМодуль);
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, РезультатыПрогона);
КонецЦикла;
#Если Клиент Тогда
ЮТОтчет.СформироватьОтчет(РезультатыТестирования, ПараметрыЗапускаТестов);
#КонецЕсли
КонецПроцедуры
// ПрогонНаборов
// Выполняет тесты наборов модуля. Возвращает результат прогона
// Параметры:
// Наборы - Массив - Наборы исполняемых тестов, структуру набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// ИмяМодуля - Строка - Имя модуля, которому принадлежат тесты
//
// Возвращаемое значение:
// Массив - Результат прогона наборов тестов, структура набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ПрогонНаборов(Наборы, ИмяМодуля) Экспорт
Ошибка = ПередВсемиТестамиМодуля(ИмяМодуля);
Если Ошибка <> Неопределено Тогда
ЗаписатьОшибкуВ(Наборы, ОшибкаВызоваОбработчика("ПередВсемиТестамиМодуля", Ошибка));
Возврат Наборы;
КонецЕсли;
Для Каждого Набор Из Наборы Цикл
Результат = ПрогонНабора(Набор, ИмяМодуля);
Если Результат <> Неопределено Тогда
Набор.Тесты = Результат;
КонецЕсли;
КонецЦикла;
Ошибка = ПослеВсехТестовМодуля(ИмяМодуля);
Если Ошибка <> Неопределено Тогда
ЗаписатьОшибкуВ(Наборы, ОшибкаВызоваОбработчика("ПослеВсехТестовМодуля", Ошибка));
Возврат Наборы;
КонецЕсли;
Возврат Наборы;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#Область ОбработчикиСобытийЗапуска
Функция ПередВсемиТестамиМодуля(ИмяМодуля)
Возврат ВызватьОбработчикМодуля(ИмяМодуля, "ПередВсемиТестами");
КонецФункции
Функция ПередТестовымНабором(Набор, ИмяМодуля)
ЮТКонтекст.УстановитьКонтекстНабораТестов(Новый Структура());
Возврат ВызватьОбработчикМодуля(ИмяМодуля, "ПередТестовымНабором");
КонецФункции
Функция ПередТестом(Тест, ИмяМодуля)
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
ПолучитьСообщенияПользователю(Истина);
#КонецЕсли
ЮТУтверждения.СброситьКонтекст();
ЮТКонтекст.УстановитьКонтекстТеста(Новый Структура());
Возврат ВызватьОбработчикМодуля(ИмяМодуля, "ПередТестом");
КонецФункции
Функция ПослеТеста(Тест, ИмяМодуля)
Возврат ВызватьОбработчикМодуля(ИмяМодуля, "ПослеТеста");
КонецФункции
Функция ПослеТестовогоНабора(Набор, ИмяМодуля)
Возврат ВызватьОбработчикМодуля(ИмяМодуля, "ПослеТестовогоНабора");
КонецФункции
Функция ПослеВсехТестовМодуля(ИмяМодуля)
Возврат ВызватьОбработчикМодуля(ИмяМодуля, "ПослеВсехТестов");
КонецФункции
Процедура ОбработатьЗавершениеТеста(Тест, Ошибка = Неопределено)
Тест.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Тест.ДатаСтарта;
СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста();
Если Ошибка = Неопределено Тогда
Тест.Статус = СтатусыИсполненияТеста.Успешно;
Иначе
ЮТРегистрацияОшибок.ОбработатьОшибкуТеста(Тест, Ошибка);
КонецЕсли;
КонецПроцедуры
Функция ВызватьОбработчикМодуля(ИмяМодуля, ИмяМетода)
Попытка
Если ЮТОбщий.МетодМодуляСуществует(ИмяМодуля, ИмяМетода) Тогда
Команда = СтрШаблон("%1.%2()", ИмяМодуля, ИмяМетода);
Выполнить(Команда);
КонецЕсли;
Исключение
Возврат ИнформацияОбОшибке();
КонецПопытки;
КонецФункции
Функция ОшибкаВызоваОбработчика(ИмяОбработчика, Ошибка)
Возврат ЮТРегистрацияОшибок.ДанныеОшибки(Ошибка, СтрШаблон("Ошибка обработчика '%1': %2", ИмяОбработчика, Ошибка.Описание));
КонецФункции
#КонецОбласти
#Область Исполнение
Функция ПрогонТестовМодуля(ТестовыйМодуль)
ИсполняемыеНаборыМодуля = ИсполняемыеНаборыТестовМодуля(ТестовыйМодуль.МетаданныеМодуля, ТестовыйМодуль.НаборыТестов);
КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения();
СтатусыИсполнения = ЮТФабрика.СтатусыИсполненияТеста();
КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения();
Клиентские = Новый Массив();
Серверные = Новый Массив();
Пропущенные = Новый Массив();
Для Каждого ИсполняемыйНаборТестов Из ИсполняемыеНаборыМодуля Цикл
Если НЕ ИсполняемыйНаборТестов.Выполнять Тогда
Пропущенные.Добавить(ИсполняемыйНаборТестов);
Продолжить;
ИначеЕсли КонтекстыПриложения.Найти(ИсполняемыйНаборТестов.Режим) = Неопределено Тогда
Пропущенные.Добавить(ИсполняемыйНаборТестов);
Для Каждого Тест Из ИсполняемыйНаборТестов.Тесты Цикл
Тест.Статус = СтатусыИсполнения.Пропущен;
Тест.ОписаниеОшибки = "Неподдерживаемый режим запуска";
КонецЦикла;
Продолжить;
КонецЕсли;
Контекст = ЮТФабрика.КонтекстИсполнения(ИсполняемыйНаборТестов.Режим);
Если Контекст = КонтекстыИсполнения.Сервер Тогда
Серверные.Добавить(ИсполняемыйНаборТестов);
ИначеЕсли Контекст = КонтекстыИсполнения.Клиент Тогда
Клиентские.Добавить(ИсполняемыйНаборТестов);
Иначе
Пропущенные.Добавить(ИсполняемыйНаборТестов);
ИсполняемыйНаборТестов.ОписаниеОшибки = "Неизвестный контекст/режим исполнения";
КонецЕсли;
КонецЦикла;
Результаты = Новый Массив();
Если Клиентские.Количество() Тогда
Результат = ПрогонНаборов(Клиентские, ТестовыйМодуль.МетаданныеМодуля.Имя);
ЮТОбщий.ДополнитьМассив(Результаты, Результат);
КонецЕсли;
Если Серверные.Количество() Тогда
Результат = ЮТИсполнительСервер.ПрогонНаборов(Серверные, ТестовыйМодуль.МетаданныеМодуля.Имя);
ЮТОбщий.ДополнитьМассив(Результаты, Результат);
КонецЕсли;
ЮТОбщий.ДополнитьМассив(Результаты, Пропущенные);
Возврат Результаты;
КонецФункции
Функция ПрогонНабора(Набор, ИмяМодуля)
Ошибка = ПередТестовымНабором(Набор, ИмяМодуля);
Если Ошибка <> Неопределено Тогда
Набор.ОписаниеОшибки = ОшибкаВызоваОбработчика("ПередТестовымНабором", Ошибка);
Возврат Неопределено;
КонецЕсли;
Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
Результаты = Новый Массив();
Для Каждого Тест Из Набор.Тесты Цикл
ЗапуститьТест(Тест, ИмяМодуля);
Результаты.Добавить(Тест);
КонецЦикла;
Ошибка = ПослеТестовогоНабора(Набор, ИмяМодуля);
Если Ошибка <> Неопределено Тогда
Набор.ОписаниеОшибки = ОшибкаВызоваОбработчика("ПослеТестовогоНабора", Ошибка);
КонецЕсли;
Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта;
Возврат Результаты;
КонецФункции
Процедура ЗапуститьТест(Тест, ИмяМодуля)
СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста();
Тест.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
СтрокаЗапуска = СтрШаблон("%1()", Тест.ПолноеИмяМетода);
Попытка
Ошибка = ПередТестом(Тест, ИмяМодуля);
Если Ошибка <> Неопределено Тогда
ОбработатьЗавершениеТеста(Тест, ОшибкаВызоваОбработчика("ПередТестом", Ошибка));
Возврат;
КонецЕсли;
Тест.Статус = СтатусыИсполненияТеста.Исполнение;
Выполнить(СтрокаЗапуска);
ПослеТеста(Тест, ИмяМодуля);
Если Ошибка <> Неопределено Тогда
ОбработатьЗавершениеТеста(Тест, ОшибкаВызоваОбработчика("ПослеТеста", Ошибка));
Иначе
ОбработатьЗавершениеТеста(Тест);
КонецЕсли;
Исключение
ОбработатьЗавершениеТеста(Тест, ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
Процедура ЗаписатьОшибкуВ(Объекты, Ошибка)
Для Каждого Объект Из Объекты Цикл
Объект.ОписаниеОшибки = Ошибка;
Если Объект.Свойство("Статус") Тогда
Объект.Статус = ЮТФабрика.СтатусыИсполненияТеста().Сломан;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
Функция ИсполняемыеНаборыТестовМодуля(МетаданныеМодуля, ТестовыеНаборы)
ИсполняемыеТестовыеНаборы = Новый Массив;
Для Каждого ТестовыйНабор Из ТестовыеНаборы Цикл
НаборыКонтекстов = Новый Структура;
ТестыНабора = ЮТОбщий.ЗначениеСтруктуры(ТестовыйНабор, "Тесты", Новый Массив());
Для Каждого Тест Из ТестыНабора Цикл
Для Каждого Контекст Из Тест.КонтекстВызова Цикл
Если НЕ НаборыКонтекстов.Свойство(Контекст) Тогда
ИсполняемыйНабор = ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, МетаданныеМодуля);
ИсполняемыйНабор.Режим = Контекст;
НаборыКонтекстов.Вставить(Контекст, ИсполняемыйНабор);
Иначе
ИсполняемыйНабор = НаборыКонтекстов[Контекст];
КонецЕсли;
ИсполняемыйТест = ЮТФабрика.ОписаниеИсполняемогоТеста(Тест, МетаданныеМодуля, Контекст);
ИсполняемыйНабор.Тесты.Добавить(ИсполняемыйТест);
КонецЦикла;
КонецЦикла;
Если НаборыКонтекстов.Количество() Тогда
Для Каждого Элемент Из НаборыКонтекстов Цикл
ИсполняемыеТестовыеНаборы.Добавить(Элемент.Значение);
КонецЦикла;
Иначе
// TODO. Корякин А. 2021.11.24 А надо ли добавлять при отсутствии тестов
ИсполняемыеТестовыеНаборы.Добавить(ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, МетаданныеМодуля));
КонецЕсли;
КонецЦикла;
Возврат ИсполняемыеТестовыеНаборы;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="24d9c1de-23c0-4d03-b2bf-9437c0985453">
<name>ЮТИсполнитель</name>
<synonym>
<key>ru</key>
<value>Исполнитель</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,54 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// ПрогонНаборов
// Выполняет тесты наборов модуля. Возвращает результат прогона
// Это обертка для прогона на сервере
// Параметры:
// Наборы - Массив - Наборы исполняемых тестов, структуру набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// ИмяМодуля - Строка - Имя модуля, которому принадлежат тесты
//
// Возвращаемое значение:
// Массив - Результат прогона наборов тестов, структура набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ПрогонНаборов(Знач Наборы, Знач ИмяМодуля) Экспорт
Возврат ЮТИсполнитель.ПрогонНаборов(Наборы, ИмяМодуля);
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="bc8637e0-b62c-49eb-9bea-bd06b7e690ae">
<name>ЮТИсполнительСервер</name>
<synonym>
<key>ru</key>
<value>Исполнитель сервер</value>
</synonym>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,200 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// ИнициализироватьКонтекст
// Выполняет начальную настройку для работы с хранимым контекстом
Процедура ИнициализироватьКонтекст() Экспорт
#Если Клиент Тогда
ЮТКонтекстКлиент.ИнициализироватьКонтекст();
#КонецЕсли
ЮТКонтекстСервер.ИнициализироватьКонтекст();
КонецПроцедуры
// ДанныеКонтекста
// Возвращает хранимые данные контекста.
// Существует отдельно контекст сервера, отдельно клиента, эти контексты никак не связаны и никак не синхронизируются
// Возвращаемое значение:
// Структура - Данные контекста
Функция ДанныеКонтекста() Экспорт
#Если Клиент Тогда
Возврат ЮТКонтекстКлиент.ДанныеКонтекста();
#Иначе
Возврат ЮТКонтекстСервер.ДанныеКонтекста();
#КонецЕсли
КонецФункции
// ЗначениеКонтекста
// Возвращает значение "подконтекста", вложенного реквизита контекста
// Параметры:
// ИмяРеквизита - Строка - Имя реквизита/подконтекста
//
// Возвращаемое значение:
// Произвольный - Значение реквизитиа/подконтекста
Функция ЗначениеКонтекста(ИмяРеквизита) Экспорт
ДанныеКонтекста = ДанныеКонтекста();
Возврат ЮТОбщий.ЗначениеСтруктуры(ДанныеКонтекста, ИмяРеквизита);
КонецФункции
// УстановитьЗначениеКонтекста
// Устанавливает значение "подконтекста", вложенного реквизита контекста
//
// Параметры:
// ИмяРеквизита - Строка - Имя реквизита/подконтекста
// Значение - Произвольный - Новое значение реквизитиа/подконтекста
Процедура УстановитьЗначениеКонтекста(ИмяРеквизита, Значение) Экспорт
ДанныеКонтекста = ДанныеКонтекста();
ДанныеКонтекста.Вставить(ИмяРеквизита, Значение);
КонецПроцедуры
// КонтекстТеста
// Возвращает структуру, в которой можно хранить данные используемые в тесте
// Данные живут в рамках одного теста, но доступны в обработчиках событий `ПередТестом` и `ПослеТеста`
// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеТеста`
// Возвращаемое значение:
// Неопределено, Структура - Контекст теста, возвращает неопределено если контекст не инициализирован
Функция КонтекстТеста() Экспорт
Возврат ЮТКонтекст.ЗначениеКонтекста(ИмяКонтекстаТеста());
КонецФункции
// КонтекстНабора
// Возвращает структуру, в которой можно хранить данные используемые в тестах набора
// Данные живут в рамках одного набора тестов (данные между клиентом и сервером не синхронизируются)
// Доступны в каждом тесте набора и в обработчиках событий `ПередТестовымНабором`, `ПослеТестовогоНабора`, `ПередТестом` и `ПослеТеста`
// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеТеста`
// Возвращаемое значение:
// Неопределено, Структура - Контекст набора тестов, возвращает неопределено если контекст не инициализирован
Функция КонтекстНабора() Экспорт
Возврат ЮТКонтекст.ЗначениеКонтекста(ИмяКонтекстаНабораТестов());
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// КонтекстОшибки
// Возвращает служебный контекст, содержит дополнительные детали ошибки теста
//
// Возвращаемое значение:
// Неопределено, Структура - Контекст ошибки, см. ЮТРегистрацияОшибок.НовыйКонтекстОшибки
Функция КонтекстОшибки() Экспорт
Возврат ЮТКонтекст.ЗначениеКонтекста(ИмяКонтекстаОшибки());
КонецФункции
// КонтекстПроверки
// Возвращает служебный контекста, данные выполняемой проверки
// Возвращаемое значение:
// Неопределено, Структура - Контекст проверки
Функция КонтекстПроверки() Экспорт
Возврат ЮТКонтекст.ЗначениеКонтекста(ИмяКонтекстаУтверждений());
КонецФункции
Функция ОписаниеКонтекста() Экспорт
Описание = Новый Структура;
Возврат Описание;
КонецФункции
Процедура УстановитьКонтекстОшибки(Знач ДанныеОшибки = Неопределено) Экспорт
Если ДанныеОшибки = Неопределено Тогда
ДанныеОшибки = ЮТФабрика.ОписаниеКонтекстаОшибки();
КонецЕсли;
ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаОшибки(), ДанныеОшибки);
КонецПроцедуры
Процедура УстановитьКонтекстУтверждений(Знач ДанныеКонтекста) Экспорт
ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаУтверждений(), ДанныеКонтекста);
КонецПроцедуры
Процедура УстановитьКонтекстНабораТестов(Знач ДанныеКонтекста) Экспорт
ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), ДанныеКонтекста);
КонецПроцедуры
Процедура УстановитьКонтекстТеста(Знач ДанныеКонтекста) Экспорт
ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), ДанныеКонтекста);
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ИмяКонтекстаОшибки()
Возврат "ДанныеОшибки";
КонецФункции
Функция ИмяКонтекстаУтверждений()
Возврат "КонтекстУтверждения";
КонецФункции
Функция ИмяКонтекстаНабораТестов()
Возврат "КонтекстНабора";
КонецФункции
Функция ИмяКонтекстаТеста()
Возврат "КонтекстТеста";
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="63f51e4d-3cf0-4109-b044-988cc723e206">
<name>ЮТКонтекст</name>
<synonym>
<key>ru</key>
<value>Контекст</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,51 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИнициализироватьКонтекст() Экспорт
ЮТДанныеКонтекста = ЮТКонтекст.ОписаниеКонтекста();
КонецПроцедуры
Функция ДанныеКонтекста() Экспорт
Возврат ЮТДанныеКонтекста;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b6fb384e-e98a-47d4-a070-7e4d57a301d2">
<name>ЮТКонтекстКлиент</name>
<synonym>
<key>ru</key>
<value>Контекст клиент</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,81 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИнициализироватьКонтекст() Экспорт
Контекст = ЮТКонтекст.ОписаниеКонтекста();
АдресХранилища = ПоместитьВоВременноеХранилище(Контекст, Новый УникальныйИдентификатор());
ХранилищеОбщихНастроек.Сохранить(КлючНастроекКонтекста(), "АдресХранилища", АдресХранилища);
КонецПроцедуры
Функция ДанныеКонтекста() Экспорт
Адрес = АдресСерверногоКонтекста();
Если ЭтоАдресВременногоХранилища(Адрес) Тогда
Возврат ПолучитьИзВременногоХранилища(АдресСерверногоКонтекста());
КонецЕсли;
КонецФункции
Функция КлючНастроекКонтекста() Экспорт
Возврат СтрШаблон("ЮТ%1.Контекста", НомерСеансаИнформационнойБазы());
КонецФункции
Функция АдресСерверногоКонтекста(Кэшировать = Истина) Экспорт
Если Кэшировать Тогда
Возврат ЮТПовторногоИспользования.АдресСерверногоКонтекста();
Иначе
Возврат ХранилищеОбщихНастроек.Загрузить(КлючНастроекКонтекста(), "АдресХранилища");
КонецЕсли;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="d635e5c4-fe62-4953-8dcc-00d329307dcf">
<name>ЮТКонтекстСервер</name>
<synonym>
<key>ru</key>
<value>Контекст сервер</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,170 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// РасширенияКонфигурации
// Возвращает список имен установленных расширений
// Возвращаемое значение:
// Массив - Расширения конфигурации
Функция РасширенияКонфигурации() Экспорт
Расширения = РасширенияКонфигурации.Получить();
Возврат ЮТОбщий.ВыгрузитьЗначения(Расширения, "Имя");
КонецФункции
// МетаданныеМодулей
// Выполняет чтение метаданных общих модулей, которые предположительно могут являться тестами
//
// Параметры:
// ИмяРасширения - Строка - Имя расширения с тестами
//
// Возвращаемое значение:
// Массив - Коллекция описаний моделей, структуру элемента см. ЮТФабрика.ОписаниеМодуля
Функция МетаданныеМодулей(ИменаРасширения, ИменаМодулей = Неопределено) Экспорт
МетаданныеМодулей = Новый Массив;
НормализованныеИменаМодулей = Новый Структура;
Если ИменаМодулей <> Неопределено Тогда
Для Каждого ИмяМодуля Из ИменаМодулей Цикл
НормализованныеИменаМодулей.Вставить(ИмяМодуля, Истина);
КонецЦикла;
КонецЕсли;
Идентификаторы = Новый Соответствие();
Для Каждого ИмяРасширения Из ИменаРасширения Цикл
Расширение = РасширенияКонфигурации.Получить(Новый Структура("Имя", ИмяРасширения)).Получить(0);
Идентификаторы.Вставить(Расширение.УникальныйИдентификатор, ИмяРасширения);
КонецЦикла;
Для Каждого Модуль Из Метаданные.ОбщиеМодули Цикл
Если ИменаМодулей <> Неопределено И НЕ НормализованныеИменаМодулей.Свойство(Модуль.Имя) Тогда
Продолжить;
КонецЕсли;
Расширение = Модуль.РасширениеКонфигурации();
Если Расширение <> Неопределено И Идентификаторы[Расширение.УникальныйИдентификатор] <> Неопределено Тогда
МетаданныеМодуля = МетаданныеМодуля(Модуль);
МетаданныеМодуля.ПолноеИмя = СтрШаблон("%1.%2", Расширение.Имя, Модуль.Имя);
МетаданныеМодулей.Добавить(МетаданныеМодуля);
КонецЕсли;
КонецЦикла;
Возврат МетаданныеМодулей;
КонецФункции
// Модули подсистемы.
// Возвращает список модулей подсистемы
// Подсистема должна находится в подсистеме "ЮТФункциональность"
// Параметры:
// ИмяПодсистемы Строка - Имя подсистемы
//
// Возвращаемое значение:
// Массив - Имена модулей входящих в подсистему
Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт
Подсистема = Метаданные.Подсистемы.ЮТФункциональность.Подсистемы.Найти(ИмяПодсистемы);
Если Подсистема = Неопределено Тогда
ВызватьИсключение СтрШаблон("Подсистема ""%1"" не найдена", ИмяПодсистемы);
КонецЕсли;
Модули = Новый Массив();
Для Каждого Объект Из Подсистема.Состав Цикл
Если Метаданные.ОбщиеМодули.Содержит(Объект) Тогда
Модули.Добавить(Объект.Имя);
КонецЕсли;
КонецЦикла;
Возврат Модули;
КонецФункции
// МетаданныеМодуля
// Создает описание метаданных модуля
//
// Параметры:
// Модуль - ОбъектМетаданныхОбщийМодуль, Структура, Строка - Общий модуль либо структура с аналогичными атрибутами или имя модуля
//
// Возвращаемое значение:
// Структура - Метаданные модуля, см. ЮТФабрика.ОписаниеМодуля
Функция МетаданныеМодуля(Знач Модуль) Экспорт
Если ТипЗнч(Модуль) = Тип("Строка") Тогда
ИмяМодуля = Модуль;
Модуль = Метаданные.ОбщиеМодули.Найти(ИмяМодуля);
Если Модуль = Неопределено Тогда
ВызватьИсключение "Не найден модуль с именем " + ИмяМодуля;
КонецЕсли;
КонецЕсли;
Описание = ЮТФабрика.ОписаниеМодуля();
Описание.Имя = Модуль.Имя;
Описание.КлиентУправляемоеПриложение = Модуль.КлиентУправляемоеПриложение;
Описание.КлиентОбычноеПриложение = Модуль.КлиентОбычноеПриложение;
Описание.Сервер = Модуль.Сервер;
Описание.ВызовСервера = Модуль.ВызовСервера;
Возврат Описание;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="42510142-f01c-4ab2-b615-8970bdcc7a1b">
<name>ЮТМетаданныеСервер</name>
<synonym>
<key>ru</key>
<value>Метаданные сервер</value>
</synonym>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,698 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#Область Строки
// ДобавитьСтроку
// Конкатенирует строки, разделяя их разделителем
//
// Параметры:
// ИсходнаяСтрока - Строка - Исходная строка
// ДополнительнаяСтрока - Строка - Добавляемая строка
// Разделитель - Строка - Строка разделитель, любой набор символов - разделитель между подстроками
//
// Возвращаемое значение:
// Строка - Результат конкатенации строк
//
Функция ДобавитьСтроку(Знач ИсходнаяСтрока, Знач ДополнительнаяСтрока, Знач Разделитель = ";") Экспорт
Если Не ПустаяСтрока(ДополнительнаяСтрока) Тогда
Если Не ПустаяСтрока(ИсходнаяСтрока) Тогда
Возврат Строка(ИсходнаяСтрока) + Разделитель + Строка(ДополнительнаяСтрока);
Иначе
Возврат Строка(ДополнительнаяСтрока);
КонецЕсли;
КонецЕсли;
Возврат Строка(ИсходнаяСтрока);
КонецФункции
// РазложитьСтрокуВМассивПодстрок
// Возвращает массив на основании строки
//
// Параметры:
// Значение - Строка - преобразуемая строка
// Разделитель - Строка - строка-разделитель
// УдалятьКонцевыеПробелы - Булево - удалять или нет концевые пробелы между элементами в строке
// Фиксированный - Булево - возвращать фиксированный или обычный массив
//
// Возвращаемое значение:
// Массив, ФиксированныйМассив - массив строк
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Разделитель = ";", УдалятьКонцевыеПробелы = Ложь,
Фиксированный = Ложь) Экспорт
Результат = Новый Массив;
КодУниверсальногоРазделителя = 5855;
УниверсальныйРазделитель = Символ(КодУниверсальногоРазделителя);
МодифицированнаяСтрока = СтрЗаменить(Значение, Разделитель, УниверсальныйРазделитель);
МассивСтрок = ?(МодифицированнаяСтрока = "", Новый Массив, СтрРазделить(МодифицированнаяСтрока,
УниверсальныйРазделитель));
Если УдалятьКонцевыеПробелы Тогда
Для Индекс = 0 По МассивСтрок.ВГраница() Цикл
МассивСтрок[Индекс] = СокрЛП(МассивСтрок[Индекс]);
КонецЦикла;
КонецЕсли;
Если Фиксированный Тогда
Результат = Новый ФиксированныйМассив(МассивСтрок);
Иначе
Результат = МассивСтрок;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область Коллекции
// ЗначениеСтруктуры
// Возвращает требуемое поле структуры. В случае отсутствия поля возвращает значение по умолчанию
//
// Параметры:
// ИсходнаяСтруктура - Структура - Исходная структура
// ИмяПоля - Строка - Имя поля структуры
// ЗначениеПоУмолчанию - Произвольный - Значение, которое будет возвращено, если поля в структуре нет
// ПроверятьЗаполненность - Булево - Необходимость проверять значение на заполненность. Если не заполнено,
// то возвращается значение по умолчанию
//
// Возвращаемое значение:
// Произвольный -- Значение искомого поля структуры
Функция ЗначениеСтруктуры(Знач ИсходнаяСтруктура, ИмяПоля, Знач ЗначениеПоУмолчанию = Неопределено, ПроверятьЗаполненность = Ложь) Экспорт
Если ПустаяСтрока(ИмяПоля) Тогда
Возврат ЗначениеПоУмолчанию;
КонецЕсли;
ЗначениеПоля = Неопределено;
Если ИсходнаяСтруктура.Свойство(ИмяПоля, ЗначениеПоля) Тогда
Если ПроверятьЗаполненность И ЗначениеЗаполнено(ЗначениеПоля) Или Не ПроверятьЗаполненность Тогда
Возврат ЗначениеПоля;
КонецЕсли;
КонецЕсли;
Возврат ЗначениеПоУмолчанию;
КонецФункции
// ЗначениеСоответствия
// Возвращает требуемое поле соответствия. В случае отсутствия поля возвращает значение по умолчанию
//
// Параметры:
// ИсходноеСоответствие - Соответствие - Исходное соответствия
// ИмяПоля - Строка - Имя поля соответствия
// ЗначениеПоУмолчанию - Произвольный - Значение, которое будет возвращено, если поля в соответствии нет
//
// Возвращаемое значение:
// Произвольный - Значение искомого поля структуры
//
Функция ЗначениеСоответствия(Знач ИсходноеСоответствие, ИмяПоля, Знач ЗначениеПоУмолчанию = Неопределено) Экспорт
Если ПустаяСтрока(ИмяПоля) Тогда
Возврат ЗначениеПоУмолчанию;
КонецЕсли;
ЗначениеПоля = ИсходноеСоответствие.Получить(ИмяПоля);
Если ЗначениеПоля <> Неопределено Тогда
Возврат ЗначениеПоля;
КонецЕсли;
Возврат ЗначениеПоУмолчанию;
КонецФункции
// ОбъединитьВСтруктуру
// Функция, объединяющая две коллекции( с типами Структура или Соответствие) в одну структуру, если это возможно
//
// Параметры:
// Коллекция1 - Соответствие, Структура - Коллекция с типом структура или соответствие
// Коллекция2 - Соответствие, Структура - Коллекция с типом структура или соответствие
// РезультатВФиксированнуюКоллекцию - Булево - Признак фиксированной коллекции, необязательный, по умолчанию Ложь,
// если Истина, возвращает фиксированная коллекция
//
// Возвращаемое значение:
// Структура - Результат объединения двух коллекций
//
Функция ОбъединитьВСтруктуру(Знач Коллекция1, Коллекция2, РезультатВФиксированнуюКоллекцию = Ложь) Экспорт
Если ТипЗнч(Коллекция1) <> Тип("Структура") Тогда
Коллекция1 = СкопироватьСтруктуру(Коллекция1);
КонецЕсли;
СтруктураРезультат = ДобавитьКлючИЗначениеВКоллекцию(Коллекция1, Коллекция2);
Возврат ?(РезультатВФиксированнуюКоллекцию, Новый ФиксированнаяСтруктура(СтруктураРезультат), СтруктураРезультат);
КонецФункции
// СкопироватьРекурсивно
// Создает копию экземпляра указанного объекта.
// Примечание:
// Функцию нельзя использовать для объектных типов (СправочникОбъект, ДокументОбъект и т.п.).
//
// Параметры:
// Источник - Произвольный - объект, который необходимо скопировать.
// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная
//
// Возвращаемое значение:
// Произвольный - копия объекта, переданного в параметре Источник.
//
Функция СкопироватьРекурсивно(Знач Источник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт
Перем Приемник;
СкопироватьПрисвоением = Ложь;
ТипИсточника = ТипЗнч(Источник);
Если ТипИсточника = Тип("Структура") Или ТипИсточника = Тип("ФиксированнаяСтруктура") Тогда
Приемник = СкопироватьСтруктуру(Источник, ФиксированнаяКоллекцияВОбычную);
ИначеЕсли ТипИсточника = Тип("Соответствие") Или ТипИсточника = Тип("ФиксированноеСоответствие") Тогда
Приемник = СкопироватьСоответствие(Источник, ФиксированнаяКоллекцияВОбычную);
ИначеЕсли ТипИсточника = Тип("Массив") Или ТипИсточника = Тип("ФиксированныйМассив") Тогда
Приемник = СкопироватьМассив(Источник, ФиксированнаяКоллекцияВОбычную);
ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда
Приемник = СкопироватьСписокЗначений(Источник, ФиксированнаяКоллекцияВОбычную);
Иначе
СкопироватьПрисвоением = Истина;
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Если ТипИсточника = Тип("ТаблицаЗначений") Или ТипИсточника = Тип("ДеревоЗначений") Тогда
СкопироватьПрисвоением = Ложь;
Приемник = Источник.Скопировать();
КонецЕсли;
#КонецЕсли
КонецЕсли;
Если СкопироватьПрисвоением Тогда
Приемник = Источник;
КонецЕсли;
Возврат Приемник;
КонецФункции
// СкопироватьСтруктуру
// Создает копию значения типа Структура
//
// Параметры:
// СтруктураИсточник - Структура - копируемая структура
// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная
//
// Возвращаемое значение:
// Структура - копия исходной структуры.
//
Функция СкопироватьСтруктуру(СтруктураИсточник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт
СтруктураРезультат = Новый Структура;
Для Каждого КлючИЗначение Из СтруктураИсточник Цикл
СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение,
ФиксированнаяКоллекцияВОбычную));
КонецЦикла;
Если ТипЗнч(СтруктураИсточник) = Тип("ФиксированнаяСтруктура") И Не ФиксированнаяКоллекцияВОбычную Тогда
СтруктураРезультат = Новый ФиксированнаяСтруктура(СтруктураРезультат);
КонецЕсли;
Возврат СтруктураРезультат;
КонецФункции
// СкопироватьСоответствие
// Создает копию значения типа Соответствие.
//
// Параметры:
// СоответствиеИсточник - Соответствие - соответствие, копию которого необходимо получить.
// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная
//
// Возвращаемое значение:
// Соответствие - копия исходного соответствия.
//
Функция СкопироватьСоответствие(СоответствиеИсточник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт
СоответствиеРезультат = Новый Соответствие;
Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл
СоответствиеРезультат.Вставить(СкопироватьРекурсивно(КлючИЗначение.Ключ, ФиксированнаяКоллекцияВОбычную),
СкопироватьРекурсивно(КлючИЗначение.Значение, ФиксированнаяКоллекцияВОбычную));
КонецЦикла;
Если ТипЗнч(СоответствиеИсточник) = Тип("ФиксированноеСоответствие") И Не ФиксированнаяКоллекцияВОбычную Тогда
СоответствиеРезультат = Новый ФиксированноеСоответствие(СоответствиеРезультат);
КонецЕсли;
Возврат СоответствиеРезультат;
КонецФункции
// СкопироватьМассив
// Создает копию значения типа Массив.
//
// Параметры:
// МассивИсточник - Массив - массив, копию которого необходимо получить
// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная
//
// Возвращаемое значение:
// Массив - копия исходного массива.
//
Функция СкопироватьМассив(МассивИсточник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт
МассивРезультат = Новый Массив;
Для Каждого Элемент Из МассивИсточник Цикл
МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент, ФиксированнаяКоллекцияВОбычную));
КонецЦикла;
Если ТипЗнч(МассивИсточник) = Тип("ФиксированныйМассив") И Не ФиксированнаяКоллекцияВОбычную Тогда
МассивРезультат = Новый ФиксированныйМассив(МассивРезультат);
КонецЕсли;
Возврат МассивРезультат;
КонецФункции
// СкопироватьСписокЗначений
// Создает копию значения типа СписокЗначений.
//
// Параметры:
// СписокИсточник - СписокЗначений - список значений, копию которого необходимо получить
// ФиксированнаяКоллекцияВОбычную - Булево - Если значение равно Истина, то из Фиксированной коллекции формируется обычная
//
// Возвращаемое значение:
// СписокЗначений - копия исходного списка значений
//
Функция СкопироватьСписокЗначений(СписокИсточник, ФиксированнаяКоллекцияВОбычную = Ложь) Экспорт
СписокРезультат = Новый СписокЗначений;
Для Каждого ЭлементСписка Из СписокИсточник Цикл
СписокРезультат.Добавить(
СкопироватьРекурсивно(ЭлементСписка.Значение, ФиксированнаяКоллекцияВОбычную), ЭлементСписка.Представление,
ЭлементСписка.Пометка, ЭлементСписка.Картинка);
КонецЦикла;
Возврат СписокРезультат;
КонецФункции
// СтруктурыРавны
// Выполняет сравнение структур между собой
// Параметры:
// Структура1 - Структура - Первая структура
// Структура2 - Структура - Вторая структура
// СравниватьТолькоКлючи - Булево - Сравнивать только ключи либо и значения
//
// Возвращаемое значение:
// Булево - Равнозначность структур
Функция СтруктурыРавны(Структура1, Структура2, СравниватьТолькоКлючи = Истина) Экспорт
Если Структура1.Количество() <> Структура2.Количество() Тогда
Возврат Ложь;
Иначе
Для Каждого Свойство Из Структура1 Цикл
Если Не Структура2.Свойство(Свойство.Ключ) Или Не СравниватьТолькоКлючи И ЗначениеСтруктуры(Структура2,
Свойство.Ключ) <> Свойство.Значение Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Истина;
КонецФункции
Функция ВыгрузитьЗначения(Знач Коллекция, Знач ИмяРеквизита) Экспорт
Результат = Новый Массив();
Для Каждого ЭлементКоллекции Из Коллекция Цикл
Результат.Добавить(ЭлементКоллекции[ИмяРеквизита]);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ПересечениеМассивов(Коллекция1, Коллекция2) Экспорт
Результат = Новый Массив;
Для Каждого Элемент Из Коллекция1 Цикл
Если Коллекция2.Найти(Элемент) <> Неопределено Тогда
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЗначениеВМассиве(Значение,
Значение2 = Неопределено,
Значение3 = Неопределено,
Значение4 = Неопределено,
Значение5 = Неопределено,
Значение6 = Неопределено,
Значение7 = Неопределено,
Значение8 = Неопределено,
Значение9 = Неопределено) Экспорт
Массив = Новый Массив;
Массив.Добавить(Значение);
Если Не Значение2 = Неопределено Тогда
Массив.Добавить(Значение2);
КонецЕсли;
Если Не Значение3 = Неопределено Тогда
Массив.Добавить(Значение3);
КонецЕсли;
Если Не Значение4 = Неопределено Тогда
Массив.Добавить(Значение4);
КонецЕсли;
Если Не Значение5 = Неопределено Тогда
Массив.Добавить(Значение5);
КонецЕсли;
Если Не Значение6 = Неопределено Тогда
Массив.Добавить(Значение6);
КонецЕсли;
Если Не Значение7 = Неопределено Тогда
Массив.Добавить(Значение7);
КонецЕсли;
Если Не Значение8 = Неопределено Тогда
Массив.Добавить(Значение8);
КонецЕсли;
Если Не Значение9 = Неопределено Тогда
Массив.Добавить(Значение9);
КонецЕсли;
Возврат Массив;
КонецФункции
Процедура ДополнитьМассив(Приемник, Источник) Экспорт
Для Каждого Элемент Из Источник Цикл
Приемник.Добавить(Элемент);
КонецЦикла;
КонецПроцедуры
// КоллекцияВСоответствие
// Возвращает соответствие элементов переданной коллекции, в качестве ключей выступают значения указанного поля элементов коллекции.
//
// Параметры:
// Коллекция - Произвольный - значение, для которого определен итератор, и возможно обращение к полям элементов через квадратные скобки.
// ИмяПоляКлюча - Строка - имя поля элемента коллекции, которое будет ключом соответствия.
// ИмяПоляЗначения - Строка - если указан, значениями результата будут не элементы, а значения соответствующих полей элементов коллекции.
// Возвращаемое значение:
// Соответствие - полученное соответствие.
Функция КоллекцияВСоответствие(Коллекция, ИмяПоляКлюча, ИмяПоляЗначения = Неопределено) Экспорт
Результат = Новый Соответствие();
Для Каждого ЭлементКоллекции Из Коллекция Цикл
Значение = ?(ИмяПоляЗначения = Неопределено, ЭлементКоллекции, ЭлементКоллекции[ИмяПоляЗначения]);
Результат.Вставить(ЭлементКоллекции[ИмяПоляКлюча], Значение);
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область ЧтениеДанных
Функция ДанныеТекстовогоФайла(ИмяФайла) Экспорт
#Если НЕ ВебКлиент Тогда
Чтение = Новый ЧтениеТекста;
Чтение.Открыть(ИмяФайла, "UTF-8");
Текст = Чтение.Прочитать();
Чтение.Закрыть();
Возврат Текст;
#Иначе
ВызватьИсключение "Чтение данных текстовых файлов в веб-клиенте не поддерживается";
#КонецЕсли
КонецФункции
Функция ЗначениеИзJSON(СтрокаJSON) Экспорт
#Если НЕ ВебКлиент Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Значение = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Возврат Значение;
#Иначе
ВызватьИсключение "Разбор JSON строки в веб-клиенте не поддерживается";
#КонецЕсли
КонецФункции
#КонецОбласти
// МетодМодуляСуществует
// Проверяет существование публичного (экспортного) метода у объекта
// Параметры:
// ИмяМодуля - Строка - Имя модуля, метод которого нужно поискать
// ИмяМетода - Строка - Имя метода, который ищем
// КоличествоПараметров - Число - Количество параметров метода, увы это никак не влияет на проверку
//
// Возвращаемое значение:
// Булево - Метод найден
Функция МетодМодуляСуществует(ИмяМодуля, ИмяМетода, КоличествоПараметров = 0) Экспорт
Алгоритм = СтрШаблон("%1.%2(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)", ИмяМодуля, ИмяМетода);
МетодСуществует = Ложь;
Попытка
Выполнить(Алгоритм);
Исключение
МетодСуществует = СтрНайти(НРег(ИнформацияОбОшибке().Описание), "(" + НРег(ИмяМетода) + ")") = 0;
КонецПопытки;
Возврат МетодСуществует;
КонецФункции
// ПеременнаяСодержитСвойство
// функция проверяет наличие свойства у значения любого типа данных. Если передано НЕОПРЕДЕЛЕНО, то ф-ия всегда вернет Ложь
//
// Параметры:
// Переменная - Произвольный - переменная любого типа, для которой необходимо проверить наличие свойства
// ИмяСвойства - Строка - переменная типа "Строка", содержащая искомое свойства
//
// Возвращаемое значение:
// Булево - признак наличия свойства у значения
//
Функция ПеременнаяСодержитСвойство(Переменная, ИмяСвойства) Экспорт
Если Переменная = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
// Инициализируем структуру для теста с ключом (значение переменной "ИмяСвойства") и значением произвольного GUID'а
GUIDПроверка = Новый УникальныйИдентификатор;
СтруктураПроверка = Новый Структура;
СтруктураПроверка.Вставить(ИмяСвойства, GUIDПроверка);
// Заполняем созданную структуру из переданного значения переменной
ЗаполнитьЗначенияСвойств(СтруктураПроверка, Переменная);
// Если значение для свойства структуры осталось GUIDПроверка, то искомое свойство не найдено, и наоборот.
Возврат СтруктураПроверка[ИмяСвойства] <> GUIDПроверка;
КонецФункции
// СообщитьПользователю
// Формирует и выводит сообщение, которое может быть связано с элементом
// управления формы.
//
// Параметры:
// ТекстСообщенияПользователю - Строка - текст сообщения.
// Поле - Строка - наименование реквизита формы
// ПутьКДанным - Строка - путь к данным (путь к реквизиту формы)
// ОбъектИлиСсылка - Объект, Ссылка - Ссылка на объект ИБ или объект
// ИдентификаторНазначения - Строка, УникальныйИдентификатор - Уникальный идентификатор экземпляра формы
// к которой должно быть "привязано" сообщение
//
Процедура СообщитьПользователю(ТекстСообщенияПользователю = "", Поле = "",
ПутьКДанным = "", ОбъектИлиСсылка = Неопределено,
Знач ИдентификаторНазначения = "") Экспорт
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СокрЛП(ТекстСообщенияПользователю);
Сообщение.Поле = Поле;
Если ЗначениеЗаполнено(ИдентификаторНазначения) Тогда
Если ТипЗнч(ИдентификаторНазначения) = Тип("Строка") Тогда
ИдентификаторНазначения = Новый УникальныйИдентификатор(ИдентификаторНазначения);
КонецЕсли;
Сообщение.ИдентификаторНазначения = ИдентификаторНазначения;
КонецЕсли;
Если Не ПустаяСтрока(ПутьКДанным) Тогда
Сообщение.ПутьКДанным = ПутьКДанным;
КонецЕсли;
Если ОбъектИлиСсылка <> Неопределено Тогда
Сообщение.УстановитьДанные(ОбъектИлиСсылка);
КонецЕсли;
Сообщение.Сообщить();
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ДобавитьКлючИЗначениеВКоллекцию(КоллекцияРезультат, Коллекция)
Для Каждого Элемент Из Коллекция Цикл
КоллекцияРезультат.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
Возврат КоллекцияРезультат;
КонецФункции
Функция Модуль(ИмяМодуля) Экспорт
Возврат Вычислить(ИмяМодуля);
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e2572c15-7380-4e36-b49b-8fddc7d3c0c3">
<name>ЮТОбщий</name>
<synonym>
<key>ru</key>
<value>Общий</value>
</synonym>
<comment>Набор общих (во всех контекстах) методов</comment>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,124 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// СформироватьОтчет
// Формирует отчет о результатах тестирования по заданным параметрам
// Параметры:
// РезультатВыполнения - Массив - Коллекция результатов выполнения, каждый элемент - структура, см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// ПараметрыЗапуска - Струкрура - Параметры запуска, см. ЮТФабрика.ПараметрыЗапуска
Процедура СформироватьОтчет(РезультатВыполнения, ПараметрыЗапуска) Экспорт
Модули = ГенераторыОтчетов();
МодульОтчета = Неопределено;
Для Каждого Модуль Из Модули Цикл
Если Модуль.РеализуетФормат(ПараметрыЗапуска.reportFormat) Тогда
МодульОтчета = Модуль;
Прервать;
КонецЕсли;
КонецЦикла;
Если МодульОтчета = Неопределено Тогда
ВызватьИсключение СтрШаблон("Отчет в формате %1 не поддерживается", ПараметрыЗапуска.reportFormat);
КонецЕсли;
ИмяФайлаОтчета = ИмяФайлаОтчета(Модуль, ПараметрыЗапуска);
ДанныеОтчета = Модуль.ДанныеОтчета(РезультатВыполнения);
Если ДанныеОтчета = Неопределено Тогда
ВызватьИсключение "Не удалось получить данные отчета";
ИначеЕсли НЕ ЗначениеЗаполнено(ИмяФайлаОтчета) Тогда
ВызватьИсключение "Не удалось сформировать имя файла отчета";
Иначе
ДанныеОтчета.Записать(ИмяФайлаОтчета);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ГенераторыОтчетов()
ИменаМодулей = ЮТМетаданныеСервер.МодулиПодсистемы("ЮТФормированиеОтчета");
Модули = Новый Массив();
Для Каждого ИмяМодуля Из ИменаМодулей Цикл
Модуль = ЮТОбщий.Модуль(ИмяМодуля);
Модули.Добавить(Модуль);
КонецЦикла;
Возврат Модули;
КонецФункции
Функция ИмяФайлаОтчета(Модуль, ПараметрыЗапуска)
ИмяФайла = Неопределено;
ПутьКОтчету = ПараметрыЗапуска.reportPath;
Если НЕ ЗначениеЗаполнено(ПутьКОтчету) Тогда
ВызватьИсключение "Не указан путь сохранения отчета";
КонецЕсли;
Файл = Новый Файл(ПутьКОтчету);
Если Файл.Существует() И Файл.ЭтоКаталог() Тогда
ИмяФайла = Файл.ПолноеИмя + ПолучитьРазделительПути() + Модуль.ИмяФайлаПоУмолчанию();
Иначе
ИмяФайла = Файл.ПолноеИмя;
КонецЕсли;
Возврат ИмяФайла;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="335b2e32-96e1-49dd-ace4-5b2eb8478c12">
<name>ЮТОтчет</name>
<synonym>
<key>ru</key>
<value>Отчет</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,71 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Функция РеализуетФормат(ФорматОтчета) Экспорт
Возврат СтрСравнить(ФорматОтчета, "json") = 0;
КонецФункции
Функция ИмяФайлаПоУмолчанию() Экспорт
Возврат "report.json";
КонецФункции
Функция ДанныеОтчета(РезультатВыполнения) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение "Формирование отчета в формате JSON не поддерживается в web-клиенте";
#Иначе
Поток = Новый ПотокВПамяти();
Запись = Новый ЗаписьJSON();
Запись.ОткрытьПоток(Поток, "UTF-8", Ложь);
ЗаписатьJSON(Запись, РезультатВыполнения);
Запись.Закрыть();
Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();
#КонецЕсли
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="f477925a-39e1-4150-a0c4-897bbaee9433">
<name>ЮТОтчетJSON</name>
<synonym>
<key>ru</key>
<value>Отчет JSON</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,321 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Функция РеализуетФормат(ФорматОтчета) Экспорт
Возврат СтрСравнить(ФорматОтчета, "jUnit") = 0;
КонецФункции
Функция ИмяФайлаПоУмолчанию() Экспорт
Возврат "junit.xml";
КонецФункции
Функция ДанныеОтчета(Знач РезультатВыполнения) Экспорт
Возврат СформироватьОтчетОТестировании(РезультатВыполнения);
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
// СформироватьОтчетОТестировании
// Формирует отчет (xml-файл) и возвращает его в виде двоичных данных
//
// Параметры:
// РезультатТестирования - Массив - результаты всех сценариев теста
// Возвращаемое значение:
// ДвоичныеДанные - полученный отчет
Функция СформироватьОтчетОТестировании(РезультатТестирования) Экспорт
Поток = Новый ПотокВПамяти();
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьПоток(Поток, "UTF-8", Ложь);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("testsuites");
Номер = 0;
Для Каждого Набор Из РезультатТестирования Цикл
ЗаписатьНабор(ЗаписьXML, Набор, Номер);
Номер = Номер + 1;
КонецЦикла;
ЗаписатьСвойства(ЗаписьXML, Новый Структура("executor, reportDate", "BIA YAXUnit", ТекущаяДатаСеанса()));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();
КонецФункции
// ЗаписатьРезультатТеста
//
// Параметры:
// ЗаписьXML - ЗаписьXML - Запись XML
// РезультатТеста - Структура - Результат теста
Процедура ЗаписатьТест(ЗаписьXML, РезультатТеста)
Статусы = ЮТФабрика.СтатусыИсполненияТеста();
ЗаписьXML.ЗаписатьНачалоЭлемента("testcase");
ЗаписьXML.ЗаписатьАтрибут("name", РезультатТеста.Имя);
ЗаписьXML.ЗаписатьАтрибут("classname", РезультатТеста.ПолноеИмяМетода);
ЗаписьXML.ЗаписатьАтрибут("time", XMLСтрока(ПродолжительностьВСекундах(РезультатТеста.Длительность)));
Сообщение = СообщениеОбОшибке(РезультатТеста);
Если РезультатТеста.Статус = Статусы.Ошибка Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("failure");
ЗаписьXML.ЗаписатьАтрибут("message", Сообщение);
Если ЗначениеЗаполнено(РезультатТеста.ОписаниеОшибки.ТипОшибки) Тогда
ЗаписьXML.ЗаписатьАтрибут("type", XMLСтрока(РезультатТеста.ОписаниеОшибки.ТипОшибки));
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("expected");
ЗаписьXML.ЗаписатьТекст(ЗначениеВСтрокуjUnit(РезультатТеста.ОписаниеОшибки.ОжидаемоеЗначение));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("actual");
ЗаписьXML.ЗаписатьТекст(ЗначениеВСтрокуjUnit(РезультатТеста.ОписаниеОшибки.ПроверяемоеЗначение));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьТекст(РезультатТеста.ОписаниеОшибки.Стек);
ЗаписьXML.ЗаписатьКонецЭлемента();
ИначеЕсли РезультатТеста.Статус = Статусы.Пропущен Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("skipped");
ЗаписьXML.ЗаписатьАтрибут("message", Сообщение);
ЗаписьXML.ЗаписатьКонецЭлемента();
ИначеЕсли РезультатТеста.Статус = Статусы.Ожидание Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("skipped");
ЗаписьXML.ЗаписатьАтрибут("message", "Тест не был вызван");
ЗаписьXML.ЗаписатьКонецЭлемента();
ИначеЕсли РезультатТеста.Статус <> Статусы.Успешно Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("error");
ЗаписьXML.ЗаписатьАтрибут("message", Сообщение);
Если ЗначениеЗаполнено(РезультатТеста.ОписаниеОшибки.ТипОшибки) Тогда
ЗаписьXML.ЗаписатьАтрибут("type", XMLСтрока(РезультатТеста.ОписаниеОшибки.ТипОшибки));
КонецЕсли;
ЗаписьXML.ЗаписатьТекст(РезультатТеста.ОписаниеОшибки.Стек);
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
Процедура ЗаписатьНабор(ЗаписьXML, Набор, Номер)
КоличествоТестов = 0;
КоличествоПропущенных = 0;
КоличествоУпавших = 0;
КоличествоСломанных = 0;
Статусы = ЮТФабрика.СтатусыИсполненияТеста();
Для Каждого РезультатТеста Из Набор.Тесты Цикл
КоличествоТестов = КоличествоТестов + 1;
Если РезультатТеста.Статус = Статусы.Ошибка Тогда
КоличествоУпавших = КоличествоУпавших + 1;
ИначеЕсли РезультатТеста.Статус = Статусы.Пропущен ИЛИ РезультатТеста.Статус = Статусы.Ожидание Тогда
КоличествоПропущенных = КоличествоПропущенных + 1;
ИначеЕсли РезультатТеста.Статус <> Статусы.Успешно Тогда
КоличествоСломанных = КоличествоСломанных + 1;
КонецЕсли;
КонецЦикла;
ЗаписьXML.ЗаписатьНачалоЭлемента("testsuite");
ЗаписьXML.ЗаписатьАтрибут("id", XMLСтрока(Номер));
ЗаписьXML.ЗаписатьАтрибут("name", СтрШаблон("%1. %2", Набор.Представление, Набор.Режим));
ЗаписьXML.ЗаписатьАтрибут("tests", XMLСтрока(КоличествоТестов));
ЗаписьXML.ЗаписатьАтрибут("errors", XMLСтрока(КоличествоСломанных));
ЗаписьXML.ЗаписатьАтрибут("skipped", XMLСтрока(КоличествоПропущенных));
ЗаписьXML.ЗаписатьАтрибут("failures", XMLСтрока(КоличествоУпавших));
ЗаписьXML.ЗаписатьАтрибут("timestamp", XMLСтрока(МестноеВремяПоВременнойМетке(Набор.ДатаСтарта)));
ЗаписьXML.ЗаписатьАтрибут("time", XMLСтрока(ПродолжительностьВСекундах(Набор.Длительность)));
ЗаписьXML.ЗаписатьАтрибут("package", Набор.МетаданныеМодуля.Имя);
Если ЗначениеЗаполнено(Набор.ОписаниеОшибки) Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("error");
ЗаписьXML.ЗаписатьТекст(СообщениеОбОшибке(Набор));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
Для Каждого РезультатТеста Из Набор.Тесты Цикл
ЗаписатьТест(ЗаписьXML, РезультатТеста);
КонецЦикла;
ЗаписатьСвойства(ЗаписьXML, Новый Структура("context", Набор.Режим));
ЗаписьXML.ЗаписатьКонецЭлемента(); // testsuite
КонецПроцедуры
Функция ЗначениеВСтрокуjUnit(Знач Значение)
ТипЗначения = ТипЗнч(Значение);
Если ТипЗначения = Тип("Строка") Тогда
Возврат XMLСтрока(Значение);
ИначеЕсли ТипЗначения = Тип("Массив") Тогда
Возврат ЗначениеВСтрокуМассивjUnit(Значение);
ИначеЕсли ТипЗначения = Тип("Структура") Или ТипЗначения = Тип("Соответствие") Или ТипЗначения = Тип("СписокЗначений") Тогда
Возврат ЗначениеВСтрокуПростаяКоллекцияjUnit(Значение);
ИначеЕсли ТипЗначения = Тип("Тип") Или ТипЗначения = Тип("СтандартныйПериод") Тогда
Возврат Строка(Значение);
Иначе
Попытка
Возврат XMLСтрока(Значение);
Исключение
Возврат Строка(Значение);
КонецПопытки;
КонецЕсли;
КонецФункции
Функция ЗначениеВСтрокуМассивjUnit(Коллекция)
Стр = "";
Для Ккк = 0 По Коллекция.Количество() - 1 Цикл
Стр = Стр + ЗначениеВСтрокуjUnit(Коллекция[Ккк]);
Если Ккк < Коллекция.Количество() - 1 Тогда
Стр = Стр + Символы.ПС;
КонецЕсли;
КонецЦикла;
Возврат Стр;
КонецФункции
Функция ЗначениеВСтрокуПростаяКоллекцияjUnit(Коллекция)
Стр = "|";
Для Каждого Элем Из Коллекция Цикл
Стр = " " + Стр + Элем.Значение + " |";
КонецЦикла;
Возврат Стр;
КонецФункции
Функция СообщениеОбОшибке(Объект)
Если ТипЗнч(Объект.ОписаниеОшибки) = Тип("Структура") Тогда
Сообщение = Объект.ОписаниеОшибки.Сообщение;
ИначеЕсли ЗначениеЗаполнено(Объект.ОписаниеОшибки) Тогда
Сообщение = Строка(Объект.ОписаниеОшибки);
Иначе
Сообщение = Неопределено;
КонецЕсли;
Возврат Сообщение;
КонецФункции
Функция МестноеВремяПоВременнойМетке(Метка)
Возврат МестноеВремя('00010101' + Метка / 1000);
КонецФункции
Функция ПродолжительностьВСекундах(Продолжительность)
Возврат Продолжительность / 1000;
КонецФункции
Процедура ЗаписатьСвойства(ЗаписьXML, Свойства)
ЗаписьXML.ЗаписатьНачалоЭлемента("properties");
Для Каждого Свойство Из Свойства Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("property");
ЗаписьXML.ЗаписатьАтрибут("name", Свойство.Ключ);
ЗаписьXML.ЗаписатьАтрибут("value", ЗначениеВСтрокуjUnit(Свойство.Значение));
ЗаписьXML.ЗаписатьКонецЭлемента(); // property
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // properties
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="44860213-5b5a-4765-960c-07c8d1ca6f08">
<name>ЮТОтчетJUnit</name>
<synonym>
<key>ru</key>
<value>Отчет jUnit</value>
</synonym>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,178 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// ПараметрыЗапуска
// Возвращает загруженные параметры запуска тестирования
// Параметры:
// ПараметрыЗапускаСтрокой - Строка - Параметры запуска приложения
//
// Возвращаемое значение:
// Структура - Загруженные параметры запуска, см. ЮТФабрика.ПараметрыЗапуска
Функция ПараметрыЗапуска(Знач ПараметрыЗапускаСтрокой) Экспорт
Попытка
Параметры = ПрочитатьПараметрыЗапуска(ПараметрыЗапускаСтрокой);
Исключение
ЮТРегистрацияОшибок.ОшибкаИнициализации(ИнформацияОбОшибке(), "Ошибка чтения параметров запуска");
Параметры = ЮТФабрика.ПараметрыЗапуска();
КонецПопытки;
Возврат Параметры;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
// ПрочитатьПараметрыЗапуска
// Читает параметры из строки запуска
// Параметры:
// ПараметрыЗапускаСтрокой - Строка - Строка с параметрами запуска.
// Содержит ключ запуска и строку с конфигурационным файлом.
// Формат строки "RunUnitTests=/путь/к/конфигурационному/файлу", где ключ указывается обязательно, а путь - по желанию
//
// Возвращаемое значение:
// Структура - Прочитанные параметры. См. Параметры
Функция ПрочитатьПараметрыЗапуска(Знач ПараметрыЗапускаСтрокой)
Параметры = ЮТФабрика.ПараметрыЗапуска();
Если Не ЗначениеЗаполнено(ПараметрыЗапускаСтрокой) Тогда
Возврат Параметры;
КонецЕсли;
ПарыКлючЗначение = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ПараметрыЗапускаСтрокой, ";", Истина);
ПараметрыЗапуска = Новый Структура;
Для Каждого Пара Из ПарыКлючЗначение Цикл
КлючЗначение = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Пара, "=", Истина);
Если КлючЗначение.Количество() = 1 Тогда
ПараметрыЗапуска.Вставить(КлючЗначение[0], Истина);
Иначе
ПараметрыЗапуска.Вставить(КлючЗначение[0], КлючЗначение[1]);
КонецЕсли;
КонецЦикла;
ЗначениеКлючаЗапуска = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска, "RunUnitTests", Ложь);
Если ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Булево") Тогда
Параметры.ВыполнятьМодульноеТестирование = ЗначениеКлючаЗапуска;
Возврат Параметры;
ИначеЕсли ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Строка") Тогда
Параметры.ВыполнятьМодульноеТестирование = Истина;
КонфигурационныйФайл = ЗначениеКлючаЗапуска;
КонецЕсли;
Если ЗначениеЗаполнено(КонфигурационныйФайл) Тогда
ПараметрыИзФайла = ПрочитатьКонфигурационныйФайл(КонфигурационныйФайл);
ДополнитьПараметрыПрочитанными(Параметры, ПараметрыИзФайла);
КонецЕсли;
Возврат Параметры;
КонецФункции
Функция ПрочитатьКонфигурационныйФайл(ПутьКФайлу)
#Если НЕ ВебКлиент Тогда
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
ВызватьИсключение СтрШаблон("Ошибка загрузки настроек из файла: Файл '%1' не существует", ПутьКФайлу);
КонецЕсли;
ДанныеФайла = Неопределено;
Попытка
Текст = ЮТОбщий.ДанныеТекстовогоФайла(ПутьКФайлу);
Если ЗначениеЗаполнено(Текст) Тогда
ДанныеФайла = ЮТПараметрыСервер.ПрочитатьКонфигурационныйФайл(Текст);
КонецЕсли;
Исключение
Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ВызватьИсключение СтрШаблон("Ошибка загрузки настроек из файла: '%1'", Ошибка);
КонецПопытки;
Возврат ДанныеФайла;
#Иначе
// будут использованы параметры по умолчанию
Возврат Новый Структура;
#КонецЕсли
КонецФункции
Процедура ДополнитьПараметрыПрочитанными(Параметры, ДанныеДополнения)
Для Каждого Параметр Из ДанныеДополнения Цикл
Если НЕ Параметры.Свойство(Параметр.Ключ) Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(Параметры[Параметр.Ключ]) = ТипЗнч(Параметр.Значение) Тогда
Параметры[Параметр.Ключ] = Параметр.Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a0e947cd-ee15-4ae9-bf95-21ed64042227">
<name>ЮТПараметры</name>
<synonym>
<key>ru</key>
<value>Параметры</value>
</synonym>
<comment>Используется для обработки и дополнения параметров запуска тестов</comment>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,55 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Функция ПрочитатьКонфигурационныйФайл(Знач ТекстИзФайла = "") Экспорт
Попытка
Возврат ЮТОбщий.ЗначениеИзJSON(ТекстИзФайла);
Исключение
ВызватьИсключение СтрШаблон("Ошибка чтения конфигурационного файла: '%1'", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ae3fc89b-811b-4cd7-8403-bf334dfbed19">
<name>ЮТПараметрыСервер</name>
<synonym>
<key>ru</key>
<value>Параметры сервер</value>
</synonym>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,45 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Функция АдресСерверногоКонтекста() Экспорт
Возврат ЮТКонтекстСервер.АдресСерверногоКонтекста(Ложь);
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="30e72b21-62ac-4f48-999d-0ffc07e6e8a2">
<name>ЮТПовторногоИспользования</name>
<synonym>
<key>ru</key>
<value>Повторного использования</value>
</synonym>
<server>true</server>
<returnValuesReuse>DuringSession</returnValuesReuse>
</mdclass:CommonModule>

View File

@ -0,0 +1,309 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// ОбработатьОшибкуТеста
// Анализирует возникшую ошибку и прописывает ее в результатах теста
// Параметры:
// Тест - Структура - Тест, см. ЮТФабрика.ОписаниеИсполняемогоТеста
// ИнформацияОбОшибке - ИнформацияОбОшибке, Структура - Информация о возникшей ошибке
Процедура ОбработатьОшибкуТеста(Тест, ИнформацияОбОшибке) Экспорт
Статусы = ЮТФабрика.СтатусыИсполненияТеста();
Если ТипЗнч(ИнформацияОбОшибке) = Тип("Структура") Тогда
Тест.Статус = Статусы.Сломан;
Тест.ОписаниеОшибки = ИнформацияОбОшибке;
Возврат;
КонецЕсли;
Описание = ИнформацияОбОшибке.Описание;
Если Описание = СтрШаблон("Метод объекта не обнаружен (%1)", Тест.Метод)
И СтрНачинаетсяС(ИнформацияОбОшибке.ИсходнаяСтрока, Тест.ПолноеИмяМетода + "()") Тогда
Тест.Статус = Статусы.НеРеализован;
Тест.ОписаниеОшибки = ДанныеОшибки(ИнформацияОбОшибке, ИнформацияОбОшибке.Описание, ЮТФабрика.ТипыОшибок().ТестНеРеализован);
ИначеЕсли СтрНачинаетсяС(Описание, ПрефиксОшибкиУтверждений()) Тогда
Тест.Статус = Статусы.Ошибка;
Тест.ОписаниеОшибки = ДанныеОшибкиУтверждений(ИнформацияОбОшибке);
Иначе
Тест.Статус = Статусы.Сломан;
Тест.ОписаниеОшибки = ДанныеОшибки(ИнформацияОбОшибке, ИнформацияОбОшибке.Описание);
КонецЕсли;
КонецПроцедуры
Функция ДанныеОшибки(Ошибка, Сообщение, ТипОшибки = "") Экспорт
ДанныеОшибки = ЮТФабрика.ОписаниеВозникшейОшибки();
ДанныеОшибки.Сообщение = Сообщение;
ДанныеОшибки.Стек = ПодробноеПредставлениеОшибки(Ошибка);
ДанныеОшибки.ТипОшибки = ТипОшибки;
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Сообщения = ЮТОбщий.ВыгрузитьЗначения(ПолучитьСообщенияПользователю(Истина), "Текст");
ДанныеОшибки.Стек = СтрШаблон("%1
|Сообщения пользователю:
| %2", ДанныеОшибки.Стек, СтрСоединить(Сообщения, Символы.ПС));
#КонецЕсли
Возврат ДанныеОшибки;
КонецФункции
Процедура ОшибкаИнициализации(Ошибка, Описание) Экспорт
Ошибка(Ошибка, Описание);
КонецПроцедуры
Функция ПрефиксОшибкиУтверждений() Экспорт
Возврат "[Failed]";
КонецФункции
Функция ПрефиксОшибкиВыполнения() Экспорт
Возврат "[Broken]";
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке) Экспорт
СтруктураОшибки = ЮТКонтекст.КонтекстОшибки();
СтруктураОшибки.ОшибкаСравнения = Ложь;
ВызватьОшибкуИсполнения(ИнформацияОбОшибке);
КонецПроцедуры
Процедура СгенерироватьОшибкуУтверждения(Сообщение, ОжидаемоеЗначение, ПроверяемоеЗначение, ОбъектПроверки = "проверяемое значение") Экспорт
УстановитьДанныеОшибкиСравнения(ОжидаемоеЗначение, ПроверяемоеЗначение);
ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ПроверяемоеЗначение, Сообщение, ОбъектПроверки);
ВызватьОшибкуПроверки(ТекстСообщения);
КонецПроцедуры
Процедура ВызватьОшибкуПроверки(Знач ТекстСообщения) Экспорт
ПрефиксОшибки = ЮТКонтекст.КонтекстПроверки().ПрефиксОшибки;
ТекстСообщения = ЮТОбщий.ДобавитьСтроку(ПрефиксОшибки, ТекстСообщения, ": ");
// Начало строки в верхний регистр
ТекстСообщения = ВРег(Лев(ТекстСообщения, 1)) + Сред(ТекстСообщения, 2);
ВызватьИсключение СтрШаблон("%1 <%2>", ПрефиксОшибкиУтверждений(), ТекстСообщения);
КонецПроцедуры
Процедура ВызватьОшибкуИсполнения(Знач ИнформацияОбОшибке) Экспорт
ПрефиксОшибки = ЮТКонтекст.КонтекстПроверки().ПрефиксОшибки;
ТекстОшибки = ИнформациюОбОшибкеВСтроку(ИнформацияОбОшибке);
ТекстСообщения = ЮТОбщий.ДобавитьСтроку(ПрефиксОшибки, ТекстОшибки, ": ");
// Начало строки в верхний регистр
ТекстСообщения = ВРег(Лев(ТекстСообщения, 1)) + Сред(ТекстСообщения, 2);
ВызватьИсключение СтрШаблон("%1 <%2>", ПрефиксОшибкиВыполнения(), ТекстСообщения);
КонецПроцедуры
Процедура УстановитьДанныеОшибкиСравнения(ОжидаемоеЗначение, ПроверяемоеЗначение) Экспорт
СтруктураОшибки = ЮТКонтекст.КонтекстОшибки();
СтруктураОшибки.ОшибкаСравнения = Истина;
СтруктураОшибки.ПроверяемоеЗначение = Строка(ПроверяемоеЗначение);
СтруктураОшибки.ОжидаемоеЗначение = Строка(ОжидаемоеЗначение);
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ДанныеОшибкиУтверждений(Ошибка)
ДлинаПрефикса = СтрДлина(ПрефиксОшибкиУтверждений());
Описание = Сред(Ошибка.Описание, ДлинаПрефикса + 1);
Описание = СокрЛП(Описание);
Если СтрНачинаетсяС(Описание, "<") И СтрЗаканчиваетсяНа(Описание, ">") Тогда
Описание = Сред(Описание, 2, СтрДлина(Описание) - 2);
КонецЕсли;
ДанныеОшибки = ЮТФабрика.ОписаниеОшибкиСравнения();
ДанныеОшибки.Сообщение = Описание;
ДанныеОшибки.Стек = ПодробноеПредставлениеОшибки(Ошибка);
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Сообщения = ЮТОбщий.ВыгрузитьЗначения(ПолучитьСообщенияПользователю(Истина), "Текст");
ДанныеОшибки.Стек = СтрШаблон("%1
|Сообщения пользователю:
| %2", ДанныеОшибки.Стек, СтрСоединить(Сообщения, Символы.ПС));
#КонецЕсли
СтруктураОшибки = ЮТКонтекст.КонтекстОшибки();
Если СтруктураОшибки <> Неопределено И СтруктураОшибки.ОшибкаСравнения Тогда
ДанныеОшибки.ПроверяемоеЗначение = СтруктураОшибки.ПроверяемоеЗначение;
ДанныеОшибки.ОжидаемоеЗначение = СтруктураОшибки.ОжидаемоеЗначение;
КонецЕсли;
Возврат ДанныеОшибки;
КонецФункции
Функция МодулиУтверждений()
Возврат ЮТОбщий.ЗначениеВМассиве("ЮТУтверждения");
КонецФункции
Процедура Ошибка(Ошибка, Описание)
ТекстОшибки = СтрШаблон("%1: %2", Описание, ПодробноеПредставлениеОшибки(Ошибка));
ЮТОбщий.СообщитьПользователю(ТекстОшибки);
КонецПроцедуры
Функция ИнформациюОбОшибкеВСтроку(Ошибка, НомерПричины = 0)
ТекстОшибки = "";
Если Ошибка = Неопределено Тогда
ТекстОшибки = "Неизвестная ошибка.";
ИначеЕсли ТипЗнч(Ошибка) = Тип("Строка") Тогда
ТекстОшибки = Ошибка;
ИначеЕсли ЭтоОшибкаСлужебногоМодуля(Ошибка) Тогда
Если Ошибка.Причина = Неопределено Тогда
ТекстОшибки = Ошибка.Описание;
Иначе
ТекстОшибки = ИнформациюОбОшибкеВСтроку(Ошибка.Причина, НомерПричины);
КонецЕсли;
Иначе
Если Не ПустаяСтрока(Ошибка.ИмяМодуля) Тогда
ТекстОшибки = ТекстОшибки + "{"
+ Ошибка.ИмяМодуля + "("
+ Ошибка.НомерСтроки + ")}: ";
КонецЕсли;
ТекстОшибки = ТекстОшибки + Ошибка.Описание + ?(ПустаяСтрока(Ошибка.ИсходнаяСтрока), "", "
|" + Ошибка.ИсходнаяСтрока);
Если Ошибка.Причина <> Неопределено Тогда
ТекстОшибки = ТекстОшибки + "
|
|ПРИЧИНА №" + Формат(НомерПричины + 1, "ЧГ=0") + "
|" + ИнформациюОбОшибкеВСтроку(Ошибка.Причина, НомерПричины + 1);
КонецЕсли;
КонецЕсли;
Возврат ТекстОшибки;
КонецФункции
Функция ЭтоОшибкаСлужебногоМодуля(Ошибка)
Если НЕ ЗначениеЗаполнено(Ошибка.ИмяМодуля) Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого ИмяМодуля Из МодулиУтверждений() Цикл
Если СтрНайти(Ошибка.ИмяМодуля, ИмяМодуля) > 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Функция ФорматированныйТекстОшибкиУтверждения(Знач ПроверяемоеЗначение, ТекстОжидания, ОбъектПроверки)
Контекст = ЮТКонтекст.КонтекстПроверки();
ИмяСвойства = Контекст.ИмяСвойства;
Если ЗначениеЗаполнено(ИмяСвойства) Тогда
ВставкаСвойство = СтрШаблон(" содержит свойство `%1`, которое", ИмяСвойства);
ПроверяемоеЗначение = Контекст.ПроверяемоеЗначение;
Иначе
ВставкаСвойство = "";
КонецЕсли;
// Заголовок сообщения
ТекстСообщения = "";
// Тело сообщения
ТекстСообщения = СтрШаблон("ожидали, что %1 `%2`%3 %4, но это не так.",
ОбъектПроверки,
ПроверяемоеЗначение,
ВставкаСвойство,
ТекстОжидания);
Возврат ТекстСообщения;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b3a750a1-8a8c-4b01-8968-ad88af6839de">
<name>ЮТРегистрацияОшибок</name>
<synonym>
<key>ru</key>
<value>Регистрация ошибок</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,200 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
///////////////////////////////////////////////////////////////////
// ПрограммныйИнтерфейс
// Экспортные процедуры и функции для прикладного использования
///////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// СоздатьЭлемент
// Создает новый элемент и возвращает его ссылку
// Параметры:
// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
// Наименование - Строка, Неопределено - Наименование элемента
// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
//
// Возвращаемое значение:
// ЛюбаяСсылка - Ссылка на созданный объект
Функция СоздатьЭлемент(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт
Объект = Менеджер.СоздатьЭлемент();
Если ЗначениеЗаполнено(Наименование) Тогда
Объект.Наименование = Наименование;
Иначе
Объект.Наименование = Новый УникальныйИдентификатор();
КонецЕсли;
Если Реквизиты <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(Объект, Реквизиты);
КонецЕсли;
Объект.Записать();
Возврат Объект.Ссылка;
КонецФункции
// СлучайноеЧисло
// Генерирует и возвращает случайное число
// Параметры:
// Минимум - Неопределено, Число - Минимальное значение
// Максимум - Неопределено, Число - Максимальное значение
// ЗнаковПослеЗапятой - Число - Количество знаков после запятой
//
// Возвращаемое значение:
// Число - Случайное число
Функция СлучайноеЧисло(Минимум = 0, Максимум = Неопределено, ЗнаковПослеЗапятой = 0) Экспорт
Генератор = ЮТКонтекст.ЗначениеКонтекста("ГенераторСлучайныхЧисел");
Если Генератор = Неопределено Тогда
Генератор = Новый ГенераторСлучайныхЧисел();
ЮТКонтекст.УстановитьЗначениеКонтекста("ГенераторСлучайныхЧисел", Генератор);
КонецЕсли;
Если Максимум = Неопределено Тогда
Результат = Генератор.СлучайноеЧисло(Минимум);
Иначе
Результат = Генератор.СлучайноеЧисло(Минимум, Максимум);
КонецЕсли;
Если ЗнаковПослеЗапятой > 0 Тогда
Множитель = Pow(10, ЗнаковПослеЗапятой);
Результат = Результат + Окр(Генератор.СлучайноеЧисло(0, Множитель) / Множитель, ЗнаковПослеЗапятой);
КонецЕсли;
Возврат Результат;
КонецФункции
// СлучайноеПоложительноеЧисло
// Генерирует и возвращает случайное положительное число
// Параметры:
// Максимум - Неопределено, Число - Максимальное значение
// ЗнаковПослеЗапятой - Число - Знаков после запятой
//
// Возвращаемое значение:
// Число - Случайное положительное число
Функция СлучайноеПоложительноеЧисло(Максимум = Неопределено, ЗнаковПослеЗапятой = 0) Экспорт
Возврат СлучайноеЧисло(1, Максимум, ЗнаковПослеЗапятой);
КонецФункции
// СлучайноеОтрицательноеЧисло
//
// Параметры:
// Минимум - Неопределено, Число - Минимальное значение
// ЗнаковПослеЗапятой - Число - Знаков после запятой
//
// Возвращаемое значение:
// Число - Случайное отрицательное число
Функция СлучайноеОтрицательноеЧисло(Минимум = Неопределено, ЗнаковПослеЗапятой = 0) Экспорт
Возврат -СлучайноеЧисло(Минимум, 0, ЗнаковПослеЗапятой);
КонецФункции
// СлучайнаяСтрока
// Генерирует и возвращает случайную строку указанной длины, строка может содержить цифры, английские и русские буквы в разных регистрах
// Параметры:
// Префикс - Строка - Префикс строки
// Длина - Число - Длина генерируемой строки, без учета префикса
//
// Возвращаемое значение:
// Строка - Случайная строка
Функция СлучайнаяСтрока(Префикс = "", Длина = 10) Экспорт
Строка = "1234567890абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Результат = "";
КоличествоСимволов = СтрДлина(Строка);
Для Инд = 1 По Длина Цикл
Результат = Результат + Сред(Строка, СлучайноеЧисло(1, КоличествоСимволов), 1);
КонецЦикла;
Возврат Результат;
КонецФункции
// СлучайныйIPАдрес
// Генерирует и возвращает случайный IP адрес
// Возвращаемое значение:
// Строка - Случайный IP адрес
Функция СлучайныйIPАдрес() Экспорт
Части = Новый Массив();
Части.Добавить(СлучайноеЧисло(1, 253));
Части.Добавить(СлучайноеЧисло(1, 253));
Части.Добавить(СлучайноеЧисло(1, 253));
Части.Добавить(СлучайноеЧисло(1, 253));
Возврат СтрСоединить(Части, ".");
КонецФункции
// УникальнаяСтрока
// Генерирует и возвращает уникальную строку
// Параметры:
// Префикс - Строка - Префик строкис
//
// Возвращаемое значение:
// Строка - Уникальная строка
Функция УникальнаяСтрока(Префикс = "") Экспорт
Возврат Префикс + Новый УникальныйИдентификатор();
КонецФункции
// СлучайноеЗначениеИзСписка
// Возвращает случайный элемент списка
// Параметры:
// Список - Массив из Произвольный - Коллекция возможных значений
//
// Возвращаемое значение:
// Произвольный - случайное значение из списка
Функция СлучайноеЗначениеИзСписка(Список) Экспорт
Индекс = СлучайноеЧисло(0, Список.ВГраница());
Возврат Список[Индекс];
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2c9c92d6-ffbc-4e22-93dd-324d4533be61">
<name>ЮТТестовыеДанные</name>
<synonym>
<key>ru</key>
<value>ЮТТестовые данные</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
</mdclass:CommonModule>

View File

@ -0,0 +1,265 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Содержит методы создания тестов и тестовых наборов
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// ТестовыйНабор
// Создает и регистрирует набор, в который будут добавлятся последующие тесты
// Параметры:
// Имя - Строка - Имя набора тестов
// ТегиСтрокой - Строка - Теги относящиеся к набору и вложенным тестам. Это строка разделенная запятыми
//
// Возвращаемое значение:
// CommonModule.ЮТТесты - Этот же модуль, для замыкания
Функция ТестовыйНабор(Имя, ТегиСтрокой = "") Экспорт
ИсполняемыеСценарии = СценарииМодуля();
Если Не ЭтоИсполняемыеСценарии(ИсполняемыеСценарии) Тогда
ВызватьИсключение "Первый параметр должен быть результатом метода ЮТТесты.ИсполняемыеСценарии";
КонецЕсли;
Если ПустаяСтрока(Имя) Тогда
ВызватьИсключение "Имя тестового набора не может быть пустым";
КонецЕсли;
НовыйТестовыйНабор = ЮТФабрика.ОписаниеТестовогоНабора(Имя, ТегиСтрокой);
ИсполняемыеСценарии.ТестовыеНаборы.Вставить(Имя, НовыйТестовыйНабор);
УстановитьТекущийНабор(НовыйТестовыйНабор);
Возврат ЮТТесты;
КонецФункции
// Тест
// Регистрирует тест
// Параметры:
// ИмяТестовогоМетода - Строка - Имя тестового метода
// ПредставлениеТеста - Строка - Представление теста
// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми
// Контексты - Строка - Контексты, строка перечисления контекстов вызова, разделенных запятой.
// Возможные значения см. ЮТФабрика.КонтекстыВызова
// Возвращаемое значение:
// CommonModule.ЮТТесты - Этот же модуль, для замыкания
Функция Тест(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "", Контексты = Неопределено) Экспорт
Набор = ТекущийНабор();
ЭтоИсполняемыеСценарии = ЭтоИсполняемыеСценарии(Набор);
ЭтоТестовыйНабор = ЭтоТестовыйНабор(Набор);
Если Не (ЭтоИсполняемыеСценарии Или ЭтоТестовыйНабор) Тогда
ВызватьИсключение "Первый параметр должен быть результатом метода ЮТТесты.ИсполняемыеСценарии или ЮТТесты.ТестовыйНабор";
КонецЕсли;
Если ПустаяСтрока(ИмяТестовогоМетода) Тогда
ВызватьИсключение "Имя тестового метода не может быть пустым";
КонецЕсли;
Набор.Тесты.Добавить(ОписаниеТеста(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой, Контексты));
Возврат ЮТТесты;
КонецФункции
// ТестКлиент
// Регистрирует текст вызывемый на клиенте
// Параметры:
// ИмяТестовогоМетода - Строка - Имя тестового метода
// ПредставлениеТеста - Строка - Представление теста
// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми
//
// Возвращаемое значение:
// CommonModule.ЮТТесты - Этот же модуль, для замыкания
Функция ТестКлиент(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "") Экспорт
Тест(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой, КонтекстыВызоваКлиента());
Возврат ЮТТесты;
КонецФункции
// Тест сервер.
// Регистрирует текст вызывемый на сервере
// Параметры:
// ИмяТестовогоМетода - Строка - Имя тестового метода
// ПредставлениеТеста - Строка - Представление теста
// ТегиСтрокой - Строка - Теги строкой. Это строка разделенная запятыми
//
// Возвращаемое значение:
// CommonModule.ЮТТесты - Этот же модуль, для замыкания
Функция ТестСервер(ИмяТестовогоМетода, ПредставлениеТеста = "", ТегиСтрокой = "") Экспорт
Режимы = ЮТФабрика.КонтекстыВызова();
Тест(ИмяТестовогоМетода, ПредставлениеТеста, ТегиСтрокой, Режимы.Сервер);
Возврат ЮТТесты;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура ПередЧтениемСценариевМодуля(МетаданныеМодуля) Экспорт
ИнициализироватьКонтекст(МетаданныеМодуля);
КонецПроцедуры
Функция СценарииМодуля() Экспорт
Возврат Контекст().ИсполняемыеСценарии;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ИсполняемыеСценарии()
Структура = Новый Структура;
Структура.Вставить("ТестовыеНаборы", Новый Соответствие);
НаборПоУмолчанию = ЮТФабрика.ОписаниеТестовогоНабора("Тесты");
Структура.ТестовыеНаборы.Вставить(НаборПоУмолчанию.Имя, НаборПоУмолчанию);
Возврат Структура;
КонецФункции
Функция КонтекстыВызоваКлиента()
Режимы = ЮТФабрика.КонтекстыВызова();
Возврат СтрШаблон("%1, %2", Режимы.КлиентУправляемоеПриложение, Режимы.КлиентОбычноеПриложение);
КонецФункции
Функция КонтекстыВызоваПоУмолчанию()
Возврат СтрСоединить(ЮТФабрика.КонтекстыМодуля(Контекст().МетаданныеМодуля), ", ");
КонецФункции
Функция ОписаниеТеста(Имя, Знач Представление, ТегиСтрокой, Знач Контексты)
Если НЕ ЗначениеЗаполнено(Контексты) Тогда
Контексты = КонтекстыВызоваПоУмолчанию();
КонецЕсли;
Возврат ЮТФабрика.ОписаниеТеста(Имя, Представление, Контексты, ТегиСтрокой);
КонецФункции
Функция ЭтоИсполняемыеСценарии(ИсполняемыеСценарии)
Возврат ТипЗнч(ИсполняемыеСценарии) = Тип("Структура")
И ТипЗнч(ЮТОбщий.ЗначениеСтруктуры(ИсполняемыеСценарии, "ТестовыеНаборы")) = Тип("Соответствие");
КонецФункции
Функция ЭтоТестовыйНабор(ТестовыйНабор)
Возврат ТипЗнч(ТестовыйНабор) = Тип("Структура")
И ТипЗнч(ЮТОбщий.ЗначениеСтруктуры(ТестовыйНабор, "Тесты")) = Тип("Массив");
КонецФункции
Функция ТестовыйНаборПоУмолчанию(ИсполняемыеСценарии)
Возврат ИсполняемыеСценарии.ТестовыеНаборы["Тесты"];
КонецФункции
#Область Контекст
Функция Контекст()
Возврат ЮТКонтекст.ЗначениеКонтекста("КонтекстРегистрацияТестов");
КонецФункции
Процедура ИнициализироватьКонтекст(МетаданныеМодуля)
КонтекстРегистрации = ОписаниеКонтекстаРегистрацииСценариев(МетаданныеМодуля);
ЮТКонтекст.УстановитьЗначениеКонтекста("КонтекстРегистрацияТестов", КонтекстРегистрации);
КонецПроцедуры
// Описание контекста регистрации сценариев.
//
// Параметры:
// МетаданныеМодуля - Структура - Метаданные модуля, см. ЮТФабрика.ОписаниеМодуля
//
// Возвращаемое значение:
// Структура - Описание контекста регистрации сценариев:
// * МетаданныеМодуля - Структура - см. ЮТФабрика.ОписаниеМодуля
// * ИсполняемыеСценарии - Структура -:
// ** ТестовыеНаборы - Соответствие -
Функция ОписаниеКонтекстаРегистрацииСценариев(МетаданныеМодуля)
ИсполняемыеСценарии = ИсполняемыеСценарии();
Набор = ТестовыйНаборПоУмолчанию(ИсполняемыеСценарии);
Набор.Представление = МетаданныеМодуля.Имя;
Контекст = Новый Структура();
Контекст.Вставить("МетаданныеМодуля", МетаданныеМодуля);
Контекст.Вставить("ИсполняемыеСценарии", ИсполняемыеСценарии);
Контекст.Вставить("ТекущийНабор", Набор);
Возврат Контекст;
КонецФункции
Функция ТекущийНабор()
Возврат Контекст().ТекущийНабор;
КонецФункции
Процедура УстановитьТекущийНабор(Набор)
Контекст().ТекущийНабор = Набор;
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="9b18d884-ddf4-4950-8691-64ded38bddbd">
<name>ЮТТесты</name>
<synonym>
<key>ru</key>
<value>Тесты</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="dad8318d-dbc4-488a-986b-566a08f5a47f">
<name>ЮТУтверждения</name>
<synonym>
<key>ru</key>
<value>ЮТУтверждения</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,461 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// КонтекстыВызова
// Возвращает перечисление возможных контекстов вызова
// Возвращаемое значение:
// ФиксированнаяСтруктура - Контексты вызова
Функция КонтекстыВызова() Экспорт
Контексты = Новый Структура();
Контексты.Вставить("КлиентОбычноеПриложение", "КлиентОбычноеПриложение");
Контексты.Вставить("КлиентУправляемоеПриложение", "КлиентУправляемоеПриложение");
Контексты.Вставить("Сервер", "Сервер");
Контексты.Вставить("ВызовСервера", "ВызовСервера");
// TODO Подозреваю нужно добавить web клиент
Возврат Новый ФиксированнаяСтруктура(Контексты);
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
#Область Перечисления
// КонтекстыИсполнения
// Возвращает перечисление возможных контекстов исполнения тестов
// Возвращаемое значение:
// ФиксированнаяСтруктура - Контексты исполнения
Функция КонтекстыИсполнения() Экспорт
Контексты = Новый Структура();
Контексты.Вставить("Клиент", "Клиент");
Контексты.Вставить("Сервер", "Сервер");
Возврат Новый ФиксированнаяСтруктура(Контексты);
КонецФункции
// СтатусыИсполненияТеста
// Возвращает перечисление возможных статусов выполнения теста, жизненный цикл теста
// Возвращаемое значение:
// ФиксированнаяСтруктура - Статусы исполнения теста
Функция СтатусыИсполненияТеста() Экспорт
Статусы = Новый Структура();
Статусы.Вставить("Ожидание", "Ожидание");
Статусы.Вставить("Исполнение", "Исполнение");
Статусы.Вставить("Успешно", "Успешно");
Статусы.Вставить("Ошибка", "Ошибка");
Статусы.Вставить("Сломан", "Сломан");
Статусы.Вставить("Пропущен", "Пропущен");
Статусы.Вставить("НеРеализован", "НеРеализован");
Возврат Новый ФиксированнаяСтруктура(Статусы);
КонецФункции
Функция ТипыОшибок() Экспорт
Типы = Новый Структура;
Типы.Вставить("ТестНеРеализован", "Не реализован");
Типы.Вставить("ОшибкаСравнения", "Ошибка сравнения");
Возврат Новый ФиксированнаяСтруктура(Типы);
КонецФункции
#КонецОбласти
#Область СтруктурыДанных
// ОписаниеТестовогоНабора
// Возвращает описание регистрируемого тестового набора.
// Эта структура используется на этапе формирования описаний имеющихся тестов
// Параметры:
// Имя - Строка - Имя набора
// ТегиСтрокой - Строка - Теги набора
//
// Возвращаемое значение:
// Структура - Описание тестового набора:
// * Имя - Строка - Имя набора
// * Представление - Строка - Представление, краткое описание
// * Теги - Массив - Коллекция тегов набора
// * Тесты - Массив - Коллекция тестов набора, см. ОписаниеТеста
// * ОписаниеОшибки - Строка, Неопределено - Описание ошибки регистрации набора
Функция ОписаниеТестовогоНабора(Имя, ТегиСтрокой = "") Экспорт
Описание = Новый Структура;
Описание.Вставить("Имя", Строка(Имя));
Описание.Вставить("Представление", Строка(Имя));
Описание.Вставить("Теги", СтрРазделить(ТегиСтрокой, ", ", Ложь));
Описание.Вставить("Тесты", Новый Массив);
Описание.Вставить("ОписаниеОшибки", Неопределено);
Возврат Описание;
КонецФункции
// ОписаниеТеста
// Возвращает описание регистрируемого теста.
// Эта структура используется на этапе формирования описаний имеющихся тестов
// Параметры:
// Имя - Строка - Имя тестового метода
// Представление - Строка - Представление, краткое описание теста
// КонтекстыВызова - Строка - Контексты исполнения теста, см. КонтекстВызова
// ТегиСтрокой - Строка - Теги теста
//
// Возвращаемое значение:
// Структура - Описание теста:
// * Имя - Строка - Имя теста (тестового метода)
// * Представление - Строка - Представление теста
// * Теги - Массив - Теги теста
// * КонтекстВызова - Массив - Контексты исполнения теста
Функция ОписаниеТеста(Имя, Знач Представление, КонтекстыВызова, Знач ТегиСтрокой = "") Экспорт
Если НЕ ЗначениеЗаполнено(Представление) Тогда
Представление = Имя;
КонецЕсли;
Если ТегиСтрокой = Неопределено Тогда
ТегиСтрокой = "";
КонецЕсли;
Описание = Новый Структура();
Описание.Вставить("Имя", Строка(Имя));
Описание.Вставить("Представление", Строка(Представление));
Описание.Вставить("Теги", СтрРазделить(ТегиСтрокой, ", ", Ложь));
Описание.Вставить("КонтекстВызова", СтрРазделить(КонтекстыВызова, ", ", Ложь));
Возврат Описание;
КонецФункции
// ОписаниеИсполняемогоНабораТестов
// Возвращает описание исполняемого тестового набора.
// Содержит данные необходимые для выполнения прогона тестов
// Параметры:
// НаборТестов - Массив - Коллекция зарегистрированных тестовых наборов, см. ОписаниеТестовогоНабора
// МетаданныеМодуля - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля
//
// Возвращаемое значение:
// Структура - Описание исполняемого набора тестов:
// * Имя - Строка - Имя набора
// * Представление - Строка - Представление набора
// * Теги - Массив - Тэги набора
// * ОписаниеОшибки - Строка - Описание ошибки загрузки или прогона набора
// * Режим - Строка - Режим исполнения набора, см. КонтекстыВызова
// * МетаданныеМодуля - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля
// * Тесты - Массив - Тесты набора, структуру тестов см. ОписаниеИсполняемогоТеста
// * Выполнять - Булево - Признак, что можно выполнить прогон набора (нет ошибок блокирующих запуск)
// * ДатаСтарта - Число - Дата запуска набора
// * Длительность - Число - Продолжительность выполнения набора
Функция ОписаниеИсполняемогоНабораТестов(НаборТестов, МетаданныеМодуля) Экспорт
Описание = Новый Структура();
Описание.Вставить("Имя", НаборТестов.Имя);
Описание.Вставить("Представление", НаборТестов.Представление);
Описание.Вставить("Теги", НаборТестов.Теги);
Описание.Вставить("ОписаниеОшибки", НаборТестов.ОписаниеОшибки);
Описание.Вставить("Режим");
Описание.Вставить("МетаданныеМодуля", МетаданныеМодуля);
Описание.Вставить("Тесты", Новый Массив);
Описание.Вставить("Выполнять", НЕ ЗначениеЗаполнено(Описание.ОписаниеОшибки));
Описание.Вставить("ДатаСтарта", 0);
Описание.Вставить("Длительность", 0);
Возврат Описание;
КонецФункции
// ОписаниеИсполняемогоТеста
// Возвращает описание исполняемого теста
// Содержит данные необходимые для выполнения прогона тестов
//
// Параметры:
// Тест - Структура - Описание зарегистрированного теста, см. ОписаниеТеста
// МетаданныеМодуля - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля
// Режим - Строка - Режим исполнения, см. КонтекстыВызова
//
// Возвращаемое значение:
// Структура - Описание исполняемого теста:
// * Имя - Строка - Имя/представление теста
// * Метод - Строка - Имя тестового метода
// * ПолноеИмяМетода - Строка - Полное имя тестового метода, ИмяМодуля.ИмяМетода
// * Теги - Массив - Теги теста
// * Режим - Строка - Режим исполнения теста, см. КонтекстыВызова
// * ДатаСтарта - Число - Дата запуска теста
// * Длительность - Число - Продолжительность выполнения теста
// * Статус - Строка - Статус выполнения теста, см. СтатусыИсполненияТеста
// * ОписаниеОшибки - Структура, Неопределено - Описание ошибки выполнения теста, см. ЮТФабрика.ОписаниеВозникшейОшибки
Функция ОписаниеИсполняемогоТеста(Тест, МетаданныеМодуля, Режим) Экспорт
ПолноеИмяМетода = СтрШаблон("%1.%2", МетаданныеМодуля.Имя, Тест.Имя);
ОписаниеТеста = Новый Структура;
ОписаниеТеста.Вставить("Имя", Тест.Представление);
ОписаниеТеста.Вставить("Метод", Тест.Имя);
ОписаниеТеста.Вставить("ПолноеИмяМетода", ПолноеИмяМетода);
ОписаниеТеста.Вставить("Теги", Тест.Теги);
ОписаниеТеста.Вставить("Режим", Режим);
ОписаниеТеста.Вставить("ДатаСтарта", 0);
ОписаниеТеста.Вставить("Длительность", 0);
ОписаниеТеста.Вставить("Статус", СтатусыИсполненияТеста().Ожидание);
ОписаниеТеста.Вставить("ОписаниеОшибки");
Возврат ОписаниеТеста;
КонецФункции
// ПараметрыЗапуска
// Набор параметров подсистемы тестирования.
// Параметры на английском, чтобы не держать несколько реализаций чтения и обработки параметров
//
// Возвращаемое значение:
// Структура - Параметры:
// * ВыполнятьМодульноеТестирование - Булево - Признак необходимости выполнения тестов
// * reportPath - Строка - Файл или каталог сохранения отчета о тестировании
// * filter - Структура - Параметры отбора запускаемых тестов, см. ПараметрыФильтрации
// * closeAfterTests - Булево - Признак необходимости закрытия приложения по окончании прогона
// * reportFormat - Строка - Формат отчета о тестировании.
// Модули реализующие различные форматы отчетов собраны в подсистеме ЮТФормированиеОтчета
Функция ПараметрыЗапуска() Экспорт
Параметры = Новый Структура;
Параметры.Вставить("ВыполнятьМодульноеТестирование", Ложь);
Параметры.Вставить("reportPath", "");
Параметры.Вставить("closeAfterTests", Истина);
Параметры.Вставить("filter", ПараметрыФильтрации());
Параметры.Вставить("reportFormat", "jUnit");
Возврат Параметры;
КонецФункции
// ОписаниеКонтекстаОшибки
// Возвращает описание детелей/расшифровки ошибки
// Возвращаемое значение:
// Структура - Детали ошибки:
// * ОшибкаСравнения - Булево - Признак, это ошибка сравнения факта и ожидания
// * ПроверяемоеЗначение - Произвольный - Фактическое значение
// * ОжидаемоеЗначение - Произвольный - Ожидаемое значение
Функция ОписаниеКонтекстаОшибки() Экспорт
Возврат Новый Структура("ОшибкаСравнения, ПроверяемоеЗначение, ОжидаемоеЗначение", Ложь);
КонецФункции
// ОписаниеМодуля
// Возвращает структуру описания модуля
// Возвращаемое значение:
// Структура - Описание модуля:
// * Имя - Строка - Имя модуля
// * ПолноеИмя - Строка - Полное имя модуля
// * КлиентУправляемоеПриложение - Булево - Доступность контекста
// * КлиентОбычноеПриложение - Булево - Доступность контекста
// * Сервер - Булево - Доступность контекста
// * ВызовСервера - Булево - Доступность контекста
Функция ОписаниеМодуля() Экспорт
Описание = Новый Структура;
Описание.Вставить("Имя", "");
Описание.Вставить("ПолноеИмя", "");
Описание.Вставить("КлиентУправляемоеПриложение", Ложь);
Описание.Вставить("КлиентОбычноеПриложение", Ложь);
Описание.Вставить("Сервер", Ложь);
Описание.Вставить("ВызовСервера", Ложь);
Возврат Описание;
КонецФункции
// ОписаниеВозникшейОшибки
// Возвращает базовую структуру ошибки
// Возвращаемое значение:
// Структура - Описание возникшей ошибки:
// * Сообщение - Строка - Описание возникшей ошибки
// * Стек - Строка - Стек возникшей ошибки
// * ТипОшибки - Строка - Тип возникшей ошибки. Доступные значения см. ЮТФабрика.ТипыОшибок
Функция ОписаниеВозникшейОшибки() Экспорт
Возврат Новый Структура("Сообщение, Стек, ТипОшибки", "");
КонецФункции
// ОписаниеОшибкиСравнения
// Возвращает базовую структуру ошибки проверки факта и ожидания
// Возвращаемое значение:
// Структура - Описание возникшей ошибки:
// * Сообщение - Строка - Описание возникшей ошибки
// * Стек - Строка - Стек возникшей ошибки
// * ТипОшибки - Строка - Тип возникшей ошибки. Доступные значения см. ЮТФабрика.ТипыОшибок
// * ПроверяемоеЗначение - Произвольный - Проверяемое, фактическое значение
// * ОжидаемоеЗначение - Произвольный - Ожидаемое значение
Функция ОписаниеОшибкиСравнения() Экспорт
Описание = ОписаниеВозникшейОшибки();
Описание.ТипОшибки = ТипыОшибок().ОшибкаСравнения;
Описание.Вставить("ПроверяемоеЗначение");
Описание.Вставить("ОжидаемоеЗначение");
Возврат Описание;
КонецФункции
#КонецОбласти
// КонтекстыМодуля
// Возвращает коллекцию доступных контекстов выполнения модуля
// Параметры:
// Модуль Модуль
//
// Возвращаемое значение:
// Массив - Контексты модуля
Функция КонтекстыМодуля(Модуль) Экспорт
Контексты = КонтекстыВызова();
КонтекстыМодуля = Новый Массив();
Если Модуль.Сервер Тогда
КонтекстыМодуля.Добавить(Контексты.Сервер);
КонецЕсли;
Если Модуль.КлиентУправляемоеПриложение Тогда
КонтекстыМодуля.Добавить(Контексты.КлиентУправляемоеПриложение);
КонецЕсли;
Если Модуль.КлиентОбычноеПриложение Тогда
КонтекстыМодуля.Добавить(Контексты.КлиентОбычноеПриложение);
КонецЕсли;
Если Модуль.ВызовСервера Тогда
КонтекстыМодуля.Добавить(Контексты.ВызовСервера);
КонецЕсли;
Возврат КонтекстыМодуля;
КонецФункции
// КонтекстыПриложения
// Возвращает коллекцию доступных контекстов приложения
// Возвращаемое значение:
// Массив - Контексты приложения
Функция КонтекстыПриложения() Экспорт
Контексты = КонтекстыВызова();
КонтекстыПриложения = Новый Массив();
КонтекстыПриложения.Добавить(Контексты.Сервер);
КонтекстыПриложения.Добавить(Контексты.ВызовСервера);
#Если ТолстыйКлиентОбычноеПриложение Тогда
КонтекстыПриложения.Добавить(Контексты.КлиентОбычноеПриложение);
#ИначеЕсли ТолстыйКлиентУправляемоеПриложение Или ТонкийКлиент Тогда
КонтекстыПриложения.Добавить(Контексты.КлиентУправляемоеПриложение);
#КонецЕсли
Возврат КонтекстыПриложения;
КонецФункции
// КонтекстИсполнения
// Возвращает контекст исполнения по контексту вызова
// Параметры:
// КонтекстВызова - Строка - Контекст вызова, см. ЮТФабрика.КонтекстыВызова
//
// Возвращаемое значение:
// Неопределено, Строка - Контекст исполнения
Функция КонтекстИсполнения(КонтекстВызова) Экспорт
КонтекстыВызова = КонтекстыВызова();
Если КонтекстВызова = КонтекстыВызова.Сервер Тогда
Возврат КонтекстыИсполнения().Сервер;
ИначеЕсли КонтекстВызова = КонтекстыВызова.КлиентУправляемоеПриложение
ИЛИ КонтекстВызова = КонтекстыВызова.КлиентОбычноеПриложение
ИЛИ КонтекстВызова = КонтекстыВызова.ВызовСервера Тогда
Возврат КонтекстыИсполнения().Клиент;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
// ПараметрыФильтрации
// Возвращает структуру отборов для поиска тестов
// Возвращаемое значение:
// Структура - Параметры фильтрации:
// * extensions - Неопределено, Массив - Список тестовых расширений
// * modules - Неопределено, Массив - Список тестовых модулей
// * suites - Неопределено, Массив - Список тестовых наборов
// * paths - Неопределено, Массив - Список путей до тестовых методов, путь может быть не полным.
// Например:
// - tests - Ищем тесты в расширении tests
// - tests.ОМ_ОбщегоНазначения - Ищем тесты в модуле ОМ_ОбщегоНазначения расширения tests
// - tests.ОМ_ОбщегоНазначения.ПолучитьЗначениеРеквизита - указание конкретного теста
// * tags - Неопределено, Массив - Список тэгов
// * contexts - Неопределено, Массив - Список тестируемых контекстов
Функция ПараметрыФильтрации()
Параметры = Новый Структура;
Параметры.Вставить("extensions", ЮТОбщий.ЗначениеВМассиве("tests"));
Параметры.Вставить("modules");
Параметры.Вставить("suites");
Параметры.Вставить("tags");
Параметры.Вставить("contexts");
Параметры.Вставить("paths");
Возврат Параметры;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="430f3969-ed28-4cc2-bfc6-17fc870dfea5">
<name>ЮТФабрика</name>
<synonym>
<key>ru</key>
<value>Клиент сервер</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,285 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// ПрочитатьНаборыТестов
// Читает наборы тестов (тестовые модули) из расширений
// Параметры:
// ПараметрыЗапускаТестов - Структура - Параметры запуска тестов. См. ЮТПараметры.ПараметрыЗапускаТестов
//
// Возвращаемое значение:
// Соответствие - Прочитанные наборы тестов
Функция ПрочитатьНаборыТестов(ПараметрыЗапускаТестов) Экспорт
ТестовыеМодули = Новый Массив;
Фильтр = Фильтр(ПараметрыЗапускаТестов);
Для Каждого ОписаниеМодуля Из ТестовыеМодули(Фильтр) Цикл
НаборыТестов = ТестовыеНаборыМодуля(ОписаниеМодуля, ПараметрыЗапускаТестов);
Если НаборыТестов = Неопределено Тогда
Продолжить;
КонецЕсли;
ТестовыйМодуль = Новый Структура;
ТестовыйМодуль.Вставить("МетаданныеМодуля", ОписаниеМодуля);
ТестовыйМодуль.Вставить("НаборыТестов", НаборыТестов);
ТестовыеМодули.Добавить(ТестовыйМодуль);
КонецЦикла;
Возврат ТестовыеМодули;
КонецФункции
// ПрочитатьНаборТестов
// Читает набор тестов из модуля
// Параметры:
// МетаданныеМодуля - См. ЮТФабрика.ОписаниеМодуля
// СтроковыйРежим - Строка - Строковый режим (контекст) исполнения теста
//
// Возвращаемое значение:
// Неопределено, Структура - Если прочитано, то будет возвращено описание набора. См. ОписаниеНабораТестов
Функция ИсполняемыеСценарииМодуля(ОписаниеМодуля) Экспорт
ЭтоТестовыйМодуль = Истина;
ЮТТесты.ПередЧтениемСценариевМодуля(ОписаниеМодуля);
ПараметрыПолученияСценариев = Неопределено; // TODO Заготовка для будущего
Команда = СтрШаблон("%1.ИсполняемыеСценарии(ПараметрыПолученияСценариев)", ОписаниеМодуля.Имя);
Попытка
Выполнить(Команда);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
Если СтрНачинаетсяС(ИнформацияОбОшибке.Описание, "Метод объекта не обнаружен (ИсполняемыеСценарии)") Тогда
ЭтоТестовыйМодуль = Ложь;
Ошибка = "";
ИначеЕсли СтрСравнить(ИнформацияОбОшибке.Описание, "Слишком мало фактических параметров") = 0 Тогда
// Возможно метод без параметров
Команда = СтрШаблон("%1.ИсполняемыеСценарии()", ОписаниеМодуля.Имя);
Попытка
Выполнить(Команда);
Исключение
Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецЕсли;
КонецПопытки;
Данные = ЮТТесты.СценарииМодуля();
Если ЗначениеЗаполнено(Ошибка) Тогда
Данные = Новый Массив(); // Фиксируем, чтобы отобразить в отчете
Описание = ЮТФабрика.ОписаниеТестовогоНабора(ОписаниеМодуля.Имя);
Описание.ОписаниеОшибки = Ошибка;
Данные.Добавить(Описание);
ИначеЕсли ЭтоТестовыйМодуль Тогда
Сценарии = ЮТТесты.СценарииМодуля();
Данные = ЮТОбщий.ВыгрузитьЗначения(Сценарии.ТестовыеНаборы, "Значение");
Иначе
Данные = Неопределено;
КонецЕсли;
Возврат Данные;
КонецФункции
// ЭтоТестовыйМодуль
// Проверяет, является ли модуль модулем с тестами
// Параметры:
// МетаданныеМодуля - Структура - Описание метаданных модуля, см. ЮТФабрика.ОписаниеМодуля
//
// Возвращаемое значение:
// Булево - Этот модуль содержит тесты
Функция ЭтоТестовыйМодуль(МетаданныеМодуля) Экспорт
#Если Сервер Тогда
Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев());
#КонецЕсли
#Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТонкийКлиент Тогда
Если МетаданныеМодуля.КлиентУправляемоеПриложение Тогда
Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев());
КонецЕсли;
#КонецЕсли
#Если ТолстыйКлиентОбычноеПриложение Тогда
Если МетаданныеМодуля.КлиентОбычноеПриложение Тогда
Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев());
КонецЕсли;
#КонецЕсли
Если МетаданныеМодуля.Сервер Тогда
Возврат ЮТЧитательСервер.ЭтоТестовыйМодуль(МетаданныеМодуля);
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ИмяМетодаСценариев()
Возврат "ИсполняемыеСценарии";
КонецФункции
Функция ТестовыеРасширения(ФильтрРасширений)
// TODO Фильтрация по расширению
Расширения = ЮТМетаданныеСервер.РасширенияКонфигурации();
Если ЗначениеЗаполнено(ФильтрРасширений) Тогда
Возврат ЮТОбщий.ПересечениеМассивов(ФильтрРасширений, Расширения);
Иначе
Возврат Расширения;
КонецЕсли;
КонецФункции
// Тестовые модули.
//
// Параметры:
// Фильтр - Структура - Фильтр:
// * Расширения
// * Модули
// * Наборы
// * Теги
// * Контексты
// * Пути
//
// Возвращаемое значение:
// Массив - Тестовые модули
Функция ТестовыеМодули(Фильтр)
ТестовыеМодули = Новый Массив;
ИменаРасширений = ТестовыеРасширения(Фильтр.Расширения);
Если НЕ ЗначениеЗаполнено(ИменаРасширений) Тогда
Возврат ТестовыеМодули;
КонецЕсли;
// TODO Фильтрация по путям
МодулиРасширения = ЮТМетаданныеСервер.МетаданныеМодулей(ИменаРасширений, Фильтр.Модули);
Для Каждого ОписаниеМодуля Из МодулиРасширения Цикл
Если ЭтоТестовыйМодуль(ОписаниеМодуля) Тогда
ТестовыеМодули.Добавить(ОписаниеМодуля);
КонецЕсли;
КонецЦикла;
Возврат ТестовыеМодули;
КонецФункции
Функция ТестовыеНаборыМодуля(Модуль, ПараметрыЗапуска)
// TODO Фильтрация по путям
НаборыТестов = Неопределено;
#Если Сервер Тогда
Если Модуль.Сервер Тогда
НаборыТестов = ИсполняемыеСценарииМодуля(Модуль);
Иначе
// клиентский модуль на сервере мы увы не прочтем
// TODO Надо наверное как об этом сказать, возможно в скипед кинуть
КонецЕсли;
#ИначеЕсли Клиент Тогда
Если Модуль.КлиентОбычноеПриложение ИЛИ Модуль.КлиентУправляемоеПриложение Тогда
НаборыТестов = ИсполняемыеСценарииМодуля(Модуль);
ИначеЕсли Модуль.Сервер Тогда
НаборыТестов = ЮТЧитательСервер.ИсполняемыеСценарииМодуля(Модуль);
КонецЕсли;
#КонецЕсли
Возврат НаборыТестов;
КонецФункции
Функция Фильтр(ПараметрыЗапуска)
Фильтр = Новый Структура("Расширения, Модули, Наборы, Теги, Контексты, Пути");
Фильтр.Расширения = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "extensions");
Фильтр.Модули = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "modules");
Фильтр.Теги = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "tags");
Фильтр.Контексты = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "contexts");
// TODO: Подумать в каком формате задать наборы - ИмяМодуля.Набор, Набор или другой вариант
Фильтр.Наборы = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "suites");
// TODO: Обработка путей в формате: Модуль.ИмяТеста, ИмяТеста - метод, параметры, контекст
// ОМ_ЮТУтверждения.Что[0: 1].Сервер, ОМ_ЮТУтверждения.Что[1: Структура].Сервер
Фильтр.Пути = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "paths");
Возврат Фильтр;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ebc2ea92-fc13-4f72-bf9a-a46b4866ad37">
<name>ЮТЧитатель</name>
<synonym>
<key>ru</key>
<value>ЮТЧитатель</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,55 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// ПрочитатьНаборТестов
// См. ЮТЧитатель.ПрочитатьНаборТестов
//
Функция ИсполняемыеСценарииМодуля(Знач МетаданныеМодуля) Экспорт
Возврат ЮТЧитатель.ИсполняемыеСценарииМодуля(МетаданныеМодуля);
КонецФункции
Функция ЭтоТестовыйМодуль(МетаданныеМодуля) Экспорт
Возврат ЮТЧитатель.ЭтоТестовыйМодуль(МетаданныеМодуля);
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ffb0e301-cc9f-4631-b0a4-d0ea2fe968a7">
<name>ЮТЧитательСервер</name>
<synonym>
<key>ru</key>
<value>ЮТЧитатель сервер</value>
</synonym>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,7 @@
{
"reportDir": "reports",
"testExtensions": [
"tests"
],
"closeAfterTests": true
}

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a4be19a9-3685-49d0-9bfd-1c2448f91d99">
<name>ЮТКонфигурационныйФайлПоУмолчанию</name>
<synonym>
<key>ru</key>
<value>ЮТКонфигурационный файл по умолчанию</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" xmlns:mdclassExtension="http://g5.1c.ru/v8/dt/metadata/mdclass/extension" uuid="8ebe57d7-1182-4eea-bdda-375c1e0262e4">
<name>YAXUNIT</name>
<synonym>
<key>ru</key>
<value>YAXUNIT</value>
</synonym>
<version>1.0.0</version>
<objectBelonging>Adopted</objectBelonging>
<extension xsi:type="mdclassExtension:ConfigurationExtension">
<managedApplicationModule>Extended</managedApplicationModule>
</extension>
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="7aac7ebc-1c41-419f-aac1-52a9be0908ba"/>
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="a0ea5602-5711-43f0-ae72-26204f907950"/>
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="b8f84992-e90b-41b5-b663-77dbeb5a8c9b"/>
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="4fb22a5b-2d3a-445e-b9c7-b51a4e59f82a"/>
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="d26a61dd-a7a6-44b9-b131-be84fcf8c021"/>
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="8339b2da-95e3-48c0-b355-f1f6179cebb2"/>
<keepMappingToExtendedConfigurationObjectsByIDs>true</keepMappingToExtendedConfigurationObjectsByIDs>
<namePrefix>ЮТ</namePrefix>
<configurationExtensionCompatibilityMode>8.3.10</configurationExtensionCompatibilityMode>
<configurationExtensionPurpose>AddOn</configurationExtensionPurpose>
<scriptVariant>Russian</scriptVariant>
<languages uuid="b8fdae66-bc14-47de-9a8d-e0323e0d9ce8">
<name>Русский</name>
<objectBelonging>Adopted</objectBelonging>
<extension xsi:type="mdclassExtension:LanguageExtension">
<languageCode>Checked</languageCode>
</extension>
<languageCode>ru</languageCode>
</languages>
<subsystems>Subsystem.ЮТФункциональность</subsystems>
<commonTemplates>CommonTemplate.ЮТКонфигурационныйФайлПоУмолчанию</commonTemplates>
<commonModules>CommonModule.ОМ_ЮТИсполнитель</commonModules>
<commonModules>CommonModule.ОМ_ЮТУтверждения</commonModules>
<commonModules>CommonModule.ОМ_ЮТЧитатель</commonModules>
<commonModules>CommonModule.ЮТ</commonModules>
<commonModules>CommonModule.ЮТИсполнитель</commonModules>
<commonModules>CommonModule.ЮТИсполнительСервер</commonModules>
<commonModules>CommonModule.ЮТКонтекст</commonModules>
<commonModules>CommonModule.ЮТКонтекстКлиент</commonModules>
<commonModules>CommonModule.ЮТКонтекстСервер</commonModules>
<commonModules>CommonModule.ЮТМетаданныеСервер</commonModules>
<commonModules>CommonModule.ЮТОбщий</commonModules>
<commonModules>CommonModule.ЮТОтчет</commonModules>
<commonModules>CommonModule.ЮТОтчетJSON</commonModules>
<commonModules>CommonModule.ЮТОтчетJUnit</commonModules>
<commonModules>CommonModule.ЮТПараметры</commonModules>
<commonModules>CommonModule.ЮТПараметрыСервер</commonModules>
<commonModules>CommonModule.ЮТПовторногоИспользования</commonModules>
<commonModules>CommonModule.ЮТРегистрацияОшибок</commonModules>
<commonModules>CommonModule.ЮТТестовыеДанные</commonModules>
<commonModules>CommonModule.ЮТТесты</commonModules>
<commonModules>CommonModule.ЮТУтверждения</commonModules>
<commonModules>CommonModule.ЮТФабрика</commonModules>
<commonModules>CommonModule.ЮТЧитатель</commonModules>
<commonModules>CommonModule.ЮТЧитательСервер</commonModules>
</mdclass:Configuration>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,38 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
Перем ЮТДанныеКонтекста Экспорт;
/////////////////////////////////////////////////////////////////////////////////
// Обработчики событий модуля
/////////////////////////////////////////////////////////////////////////////////
#Область ОбработчикиСобытий
/////////////////////////////////////////////////////////////////////////////////
// ОТКРЫТИЕ ПРИЛОЖЕНИЯ
/////////////////////////////////////////////////////////////////////////////////
// Используется для перехвата управления расширением после отработки запуска приложения
&После("ПриНачалеРаботыСистемы")
Процедура ЮТПриНачалеРаботыСистемы()
ЮТ.ВыполнитьМодульноеТестирование();
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b36a006a-66ee-4a1d-bdc9-feebc5cdde82">
<name>ЮТФормированиеОтчета</name>
<synonym>
<key>ru</key>
<value>Формирование отчета</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<includeInCommandInterface>true</includeInCommandInterface>
<content>CommonModule.ЮТОтчетJSON</content>
<content>CommonModule.ЮТОтчетJUnit</content>
<parentSubsystem>Subsystem.ЮТФункциональность</parentSubsystem>
</mdclass:Subsystem>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2000d722-2a1d-47b1-8b5d-f3ebcb93e898">
<name>ЮТФункциональность</name>
<synonym>
<key>ru</key>
<value>Функциональность</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<subsystems>ЮТФормированиеОтчета</subsystems>
</mdclass:Subsystem>

4
sonarlint.json Normal file
View File

@ -0,0 +1,4 @@
{
"serverId": "sonar",
"projectKey": "yaxunit:develop"
}

55
v8config.json Normal file
View File

@ -0,0 +1,55 @@
{
"GLOBAL": {
"ВерсияПлатформы": "8.3.10.2309",
"version": "2.1",
"ФорматEDT": true
},
"АвтоТестирование": {
"Выполнять": true,
"ВыполнятьБазовые": true,
"ВыполнятьxUnit": true,
"ТестыxUnitВРасширении": true,
"ИсполнительxUnitВРасширении": true,
"ВыполнятьVanessa": false,
"ПредварительнаяПодготовкаБазы": false,
"ПередаватьПокрытиеТестамиВСонар": false
},
"АвтоДокументирование": {
"Выполнять": false,
"КодПространстваConfluence": "yaxunit",
"ПоследнийОбработанныйКоммит": "",
"Шаблоны": ""
},
"АнализИсходников": {
"Выполнять": true,
"ДочерниеПроекты": []
},
"АвтоСборка": {
"ВключитьНомерСборки": true,
"ОбновлятьВерсиюКонфигурации": false,
"КаталогРасположенияСборок": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\yaxunit",
"КаталогРасположенияСборокRelease": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\yaxunit\\releases",
"КаталогРасположенияОбразов": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БСП\\spec",
"ВыполнятьНаСервернойБазе": false
},
"Уведомления": {
"Выполнять": true,
"Ответственные": [{
"Адресат": "arch-bots",
"Транспорт": "rocketchat"
}]
},
"Сонар": {
"Сервер": "c7-sonar-server.tlc.lan",
"Порт": "9000",
"Токен": "6c0a7cc2bf2e8f054562da6fabf3f2bf41e7a308",
"Профили": "bsl bia; Sonar way (outdated copy)"
},
"СвязанныеПроекты": {
"bsp": {
"Репозиторий": "git@gitlab.dellin.ru:orais/bsp/bsp.git",
"Ветка": "master",
"Назначение": "Основная конфигурация"
}
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>ТестыПример</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
<nature>com._1c.g5.v8.dt.core.V8ExtensionNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -0,0 +1,3 @@
Manifest-Version: 1.0
Runtime-Version: 8.3.10
Base-Project: configuration

View File

@ -0,0 +1,67 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Набор тестов для общего модуля СтроковыеФункцииКлиентСервер
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// Набор стандартных методов тестового модуля
/////////////////////////////////////////////////////////////////////////////////
#Область ТестыAPI
// ИсполняемыеСценарии
// Сервисный метод для получения списка тестовых методов
// Параметры:
// ДополнительныеПараметры - Структура - Дополнительные параметры, используемые при формировании списка тестов
// Возвращаемое значение:
// Массив - Имена методов тестов
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
// Добавление теста в тестовый набор по умолчанию с указанием представления теста
ЮТТесты.Тест("ТестовыйМетод3", "Тестовый метод 3");
// Добавление теста для клиента в тестовый набор по умолчанию
ЮТТесты.ТестКлиент("ТестовыйМетод4");
// Добавление теста для клиента в тестовый набор по умолчанию
ЮТТесты.ТестСервер("ТестовыйМетод4");
ЮТТесты.ТестовыйНабор("ТестовыйНабор")
.Тест("ТестовыйМетод")
.Тест("ТестовыйМетод2")
.Тест("ТестовыйМетод5", , "Тег1");
// Создание тестового набора со списком тегов
ЮТТесты.ТестовыйНабор("Тестовый набор 2", "Тег1, Тег2")
// Добавление теста в созданный тестовый набор с указанием тегов, которые будут объединены с тегами набора
.Тест("ТестовыйМетод6", , "Тег5, Тег6");
ВызватьИсключение "Ошибка загрузки сценариев";
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Реализация тестов
/////////////////////////////////////////////////////////////////////////////////
#Область Тесты
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e8617fc6-e9d5-4d2d-85d4-e23166fcf0f2">
<name>ОМ_ОшибкаЗагрузкиСценариев</name>
<synonym>
<key>ru</key>
<value>Ошибка загрузки сценариев</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,108 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2022 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Набор тестов для общего модуля СтроковыеФункцииКлиентСервер
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// Набор стандартных методов тестового модуля
/////////////////////////////////////////////////////////////////////////////////
#Область ТестыAPI
// ИсполняемыеСценарии
// Сервисный метод для получения списка тестовых методов
// Параметры:
// ДополнительныеПараметры - Структура - Дополнительные параметры, используемые при формировании списка тестов
// Возвращаемое значение:
// Массив - Имена методов тестов
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
// Добавление теста в тестовый набор по умолчанию с указанием представления теста
ЮТТесты.Тест("ТестовыйМетод3", "Тестовый метод 3");
// Добавление теста для клиента в тестовый набор по умолчанию
ЮТТесты.ТестКлиент("ТестовыйМетод4");
// Добавление теста для клиента в тестовый набор по умолчанию
ЮТТесты.ТестСервер("ТестовыйМетод4");
ЮТТесты.ТестовыйНабор("ТестовыйНабор")
.Тест("ТестовыйМетод")
.Тест("ТестовыйМетод2")
.Тест("ТестовыйМетод5", , "Тег1");
// Создание тестового набора со списком тегов
ЮТТесты.ТестовыйНабор("Тестовый набор 2", "Тег1, Тег2")
// Добавление теста в созданный тестовый набор с указанием тегов, которые будут объединены с тегами набора
.Тест("ТестовыйМетод6", , "Тег5, Тег6");
КонецПроцедуры
Процедура ПередВсемиТестами() Экспорт
КонецПроцедуры
Процедура ПередТестовымНабором() Экспорт
Контекст = ЮТКонтекст.КонтекстНабора();
Контекст.Вставить("Дата", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПередТестом() Экспорт
Контекст = ЮТКонтекст.КонтекстТеста();
Контекст.Вставить("ДатаТеста", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПослеТеста() Экспорт
Контекст = ЮТКонтекст.КонтекстТеста();
Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ДатаТеста);
Контекст = ЮТКонтекст.КонтекстНабора();
Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.Дата);
КонецПроцедуры
Процедура ПослеТестовогоНабора() Экспорт
Контекст = ЮТКонтекст.КонтекстНабора();
Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.Дата);
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Реализация тестов
/////////////////////////////////////////////////////////////////////////////////
#Область Тесты
Процедура ТестовыйМетод4() Экспорт
ЮТУтверждения.Что(5, "Успешное утверждение").Равно(5);
ЮТУтверждения.Что(5, "Успешное утверждение 2").НЕРавно(3);
ЮТУтверждения.Что(5, "Ошибочное утверждение").Равно(3);
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1f32571e-f4ef-4527-bd84-bda091e71a78">
<name>ОМ_СтроковыеФункцииКлиентСервер</name>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" xmlns:mdclassExtension="http://g5.1c.ru/v8/dt/metadata/mdclass/extension" uuid="8707b744-2543-4013-af0e-9e13b6624e59">
<name>tests</name>
<synonym>
<key>ru</key>
<value>Tests</value>
</synonym>
<objectBelonging>Adopted</objectBelonging>
<extension xsi:type="mdclassExtension:ConfigurationExtension">
<interfaceCompatibilityMode>Checked</interfaceCompatibilityMode>
</extension>
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="8a9d9b0a-06b5-4386-885a-eb8bcb1b0451"/>
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="43272ea1-9fa7-4bc0-8465-c5f011180e73"/>
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="86ef968e-8c32-4c3d-bb3f-7261d74f57ea"/>
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="a931567d-d5ce-4b91-84fd-0e88802c11ef"/>
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="1fd3bfeb-1675-4087-af3c-439afd61bc7c"/>
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="0184ac30-9601-4012-af54-fcaeb13cab2c"/>
<keepMappingToExtendedConfigurationObjectsByIDs>true</keepMappingToExtendedConfigurationObjectsByIDs>
<namePrefix>Расш1_</namePrefix>
<configurationExtensionCompatibilityMode>8.3.10</configurationExtensionCompatibilityMode>
<configurationExtensionPurpose>Customization</configurationExtensionPurpose>
<scriptVariant>Russian</scriptVariant>
<languages uuid="d54879e4-8d6e-4e4d-b5b8-58bc03964e55">
<name>Русский</name>
<objectBelonging>Adopted</objectBelonging>
<extension xsi:type="mdclassExtension:LanguageExtension">
<languageCode>Checked</languageCode>
</extension>
<languageCode>ru</languageCode>
</languages>
<commonModules>CommonModule.ОМ_ОшибкаЗагрузкиСценариев</commonModules>
<commonModules>CommonModule.ОМ_СтроковыеФункцииКлиентСервер</commonModules>
</mdclass:Configuration>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>