1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-01-08 13:06:32 +02:00

Merge branch 'release/23.04'

This commit is contained in:
Maximov Valery 2023-04-28 08:43:23 +03:00
commit 7efa1aaa10
100 changed files with 15850 additions and 807 deletions

12
.bsl-language-server.json Normal file
View File

@ -0,0 +1,12 @@
{
"$schema": "https://1c-syntax.github.io/bsl-language-server/configuration/schema.json",
"diagnostics": {
"computeTrigger": "onSave",
"ordinaryAppSupport": true,
"parameters": {
"LineLength": {
"maxLineLength": 150
}
}
}
}

View File

@ -0,0 +1,40 @@
name: Deploy to GitHub Pages
on:
push:
branches:
- develop
# Review gh actions docs if you want to further define triggers, paths, etc
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on
jobs:
deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
cache: yarn
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Build website
run: yarn build
# Popular action to deploy to GitHub Pages:
# Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# Build output to publish to the `gh-pages` branch:
publish_dir: ./build
# The following lines assign commit authorship to the official
# GH-Actions bot for deploys to `gh-pages` branch:
# https://github.com/actions/checkout/issues/13#issuecomment-724415212
# The GH actions bot is used by default if you didn't specify the two fields.
# You can swap them out with your own user credentials.
user_name: github-actions[bot]
user_email: 41898282+github-actions[bot]@users.noreply.github.com

59
.github/workflows/sq.yml vendored Normal file
View File

@ -0,0 +1,59 @@
name: sq-analyze
on: [push, pull_request]
jobs:
SonarScanner:
runs-on: ubuntu-latest
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name
steps:
- name: Checkout
uses: actions/checkout@v3
with:
repository: ${{ github.event.workflow_run.head_repository.full_name }}
ref: ${{ github.event.workflow_run.head_branch }}
fetch-depth: 0
- name: Configure env vars for SonarCloud scan
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
run: |
echo "::set-env name=PATH::/opt/sonar-scanner/bin:$PATH"
- name: Compute branch name
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
uses: nixel2007/branch-name@v3
- name: Extract version
if: github.event_name == 'push'
shell: bash
run: echo "##[set-output name=version;]` cat ./exts/yaxunit/src/Configuration/Configuration.mdo | grep -oP '(?<=<version>)[\d.]+'`"
id: extract_version
- name: Setup sonarqube
uses: warchant/setup-sonar-scanner@v3
# Анализ проекта в SonarQube (ветка)
- name: Анализ в SonarQube (branch)
if: github.event_name == 'push'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: sonar-scanner
-Dsonar.host.url=https://sonar.openbsl.ru
-Dsonar.branch.name=${{ env.BRANCH_NAME }}
-Dsonar.projectVersion=${{ steps.extract_version.outputs.version }}
# Анализ проекта в SonarQube (PR)
# https://docs.sonarqube.org/latest/analysis/pull-request/
- name: Анализ в SonarQube (pull-request)
if: github.event_name == 'pull_request'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: sonar-scanner
-Dsonar.host.url=https://sonar.openbsl.ru
-Dsonar.pullrequest.key=${{ github.event.pull_request.number }}
-Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }}
-Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }}
-Dsonar.scm.revision=${{ github.event.pull_request.head.sha }}

169
README.md
View File

@ -1,167 +1,20 @@
# YAXUnit. Расширение для запуска тестов
# ![Logo](documentation/static/img/logo.png) YAXUnit. Расширение для запуска тестов
- [Назначение](#назначение)
- [Возможности](#возможности)
- [Пример тестового модуля](#пример-тестового-модуля)
- [Запуск](#запуск)
- [Запуск из EDT](#запуск-из-edt)
- [Запуск вне EDT](#запуск-вне-edt)
- [Благодарности](#благодарности)
- [Лицензия](#лицензия)
----
[![Actions Status](https://github.com/bia-technologies/yaxunit/actions/workflows/sq.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions)
[![Download](https://img.shields.io/github/release/bia-technologies/yaxunit.svg?label=download&style=flat)](https://github.com/bia-technologies/yaxunit/releases/latest)
[![GitHub Releases](https://img.shields.io/github/downloads/bia-technologies/yaxunit/latest/total?style=flat-square)](https://github.com/bia-technologies/yaxunit/releases)
[![Quality Gate](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=yaxunit)
[![Maintainability](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=sqale_rating)](https://sonar.openbsl.ru/dashboard?id=yaxunit)
Обсудить в [телеграмм чате](https://t.me/BIAOpenTools/12)
## Назначение
----
Самостоятельное расширение для написания и выполнения модульного тестирования.
## Документация
### Возможности
- YAXUnit - это расширение с открытым исходным кодом, которое используется для написания и выполнения тестов
- Разрабатывалось с оглядкой на JUnit5, пожалуй, лучший фреймворк тестирования
- Предоставляет движок выполнения тестов
- Предоставляет утверждения для проверки ожидаемых результатов
- Тесты могут быть организованы в наборы и выполняться в разных контекстах
- Позволяет быстрее и проще не только писать, но и читать тесты
- Результаты тестирования могут быть сохранены в отчет, на текущий момент jUnit и json.
- Большая часть пользовательского API реализована как [текучие выражения](https://ru.wikipedia.org/wiki/Fluent_interface)
- Предусмотрена возможность расширения функциональности, можно регистрировать свои форматы отчетов, добавлять модули с утверждениями
- Реализован [плагин для EDT](https://github.com/bia-technologies/edt-test-runner), который упрощает процесс запуска тестов
Подробнее ознакомиться с функциональностью вы можете изучив [документацию](docs/api-topic.md).
А для того, что бы начать писать тесты необходимо [установить расширение](docs/install.md) в свою IDE (конфигуратор или EDT).
## Пример тестового модуля
Для создания теста нужно в расширении (в отдельном или в том же) добавить модуль, содержащий экспортный метод регистрации - `ИсполняемыеСценарии` и реализовать тесты.
Пример модуля тестов:
```bsl
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
// Регистрация тестов
ЮТТесты // Регистрация тестов выполняет через модуль регистратор
.ДобавитьТестовыйНабор("Математические методы") // Набор - объединение тестов
.ДобавитьТест("Сложение") // Обязательно при регистрации указываем имя экспортного метода
.ДобавитьТест("Вычитание", "Вычитание") // Также можно указать представление теста
.ДобавитьТест("Вычитание", "ВычитаниеСервер", , "Сервер") // Контекст исполнения, по умолчанию тест выполняется во всех контекстах модуля
.ДобавитьКлиентскийТест("УмножениеНаКлиенте") // Есть отдельный метод для регистрации клиентских тестов
.ДобавитьСерверныйТест("ДелениеНаСервере", "Деление на сервер") // Есть отдельный метод для регистрации серверных тестов
.ДобавитьТестовыйНабор("Строковые методы")
.ДобавитьТест("СтрНайти")
.ДобавитьТест("СтрРазделить");
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура Сложение() Экспорт
// Реализация теста на сложение
ЮТест.ОжидаетЧто(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение
.ИмеетТип("Число") // Проверим тип
.Заполнено() // Заполненность проверяемого значения
.Больше(0) // Сравним с нулем
.Равно(5); // Проверим ожидаемый результат
ЮТест.ОжидаетЧто(-8 + 8, "-8 + 8") // Проверим второй вариант
.Равно(0);
КонецПроцедуры
Процедура Вычитание() Экспорт
// Реализация теста на вычитание
ЮТест.ОжидаетЧто(2 - 3, "2 - 3").ИмеетТип("Число").Заполнено().Меньше(0);
КонецПроцедуры
#КонецОбласти
#Область События
// Также в тесте можно обрабатывать события выполнения
// Например можно реализовать подготовку и удаление тестовых данных
// Зачистку временных файлов, настройку системы
Процедура ПередВсемиТестами() Экспорт
// Выполняется перед запуском всех тестов контекста, те если есть тесты и на клиенте и на сервер, то метод будет выполнен 2 раза
Сообщить("Запуск тестирования");
КонецПроцедуры
Процедура ПередТестовымНабором() Экспорт
// Выполняется перед каждым тестовым набором для каждого контекста выполнения
Контекст = ЮТест.КонтекстТестовогоНабора(); // Контекст набора служит для хранения любых данных, нужных при тестировании
// Контекст живет в рамках контекста выполнения,
// таки образом, через контекст нельзя передавать данные между серверными и клиентскими тестами
Контекст.Вставить("ВремяНачала", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПередКаждымТестом() Экспорт
// Выполняется перед каждым тестом
Контекст = ЮТест.КонтекстТеста(); // Контекст теста служит для хранения любых данных, нужных при тестировании
// Контекст создает перед тестом и уничтожается после его выполнения
// В контекст например, можно помещать созданные в процессе данные, что бы потом их удалить
Контекст.Вставить("ВремяНачала", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПослеКаждогоТеста() Экспорт
// Выполняется после каждого теста
Контекст = ЮТест.КонтекстТеста();
Сообщить("Время выполнения теста: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала));
КонецПроцедуры
Процедура ПослеТестовогоНабора() Экспорт
// Выполняется после каждого тестового набора для каждого контекста выполнения
// Применяется для очистки данных и т.д.
Контекст = ЮТест.КонтекстТестовогоНабора();
Сообщить("Время выполнения набора: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала));
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
// Выполняется после выполнения всех тестов контекста, те если есть тесты и на клиенте и на сервер, то метод будет выполнен 2 раза
// В этом событии все контексты уже уничтожены
Сообщить("Тестирование завершено");
КонецПроцедуры
#КонецОбласти
```
После запуска тестов модуля в EDT (используя [плагин](https://github.com/bia-technologies/edt-test-runner)) получаем такой отчет:
![Отчет](docs/images/report.PNG)
## Запуск
### Запуск из EDT
При разработке в EDT процесс запуска тестов можно упростить, установив [плагин](https://github.com/bia-technologies/edt-test-runner)
и настроив конфигурацию запуска, как указано в описании плагина.
### Запуск вне EDT
Для запуска тестов без использования EDT необходимо:
1. Сформировать файл конфигурации запуска [вручную](docs/run.md), либо воспользоваться [формой настройки](docs/yaxunit-ui.md)
2. [Запустить 1С:Предприятие](docs/run.md) с параметром `RunUnitTests=ПутьКФайлуКонфигурации.json`.
[https://bia-technologies.github.io/yaxunit/](https://bia-technologies.github.io/yaxunit/)
## Благодарности

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View File

@ -1,85 +0,0 @@
# Запуск
Для запуска тестов необходимо запустить 1С:Предприятие с параметром `RunUnitTests`, при необходимости можно указать путь к файлу конфигурации запуска.
## Конфигурация запуска
Конфигурация настраивается в файле json и может иметь следующие параметры:
| Имя параметра | Тип | Значение по умолчанию | Описание |
|-------------------|-----------|-----------------------|--------------------------------------------------------------------------------------------------------------|
| `filter` | `Object` | Object, смотрите ниже | Параметры фильтрации, поиска тестов |
| `reportFormat` | `String` | `"jUnit"` | Формат отчета о тестировании, возможные значения: `"jUnit"`, `"JSON"` |
| `reportPath` | `String` | `""` | Путь к формируемому отчету, можно указать или каталог (в которому будет создан файл отчета) или путь к файлу |
| `closeAfterTests` | `Boolean` | `True` | Признак закрытия 1С:Предприятие по завершению тестирования |
| `showReport` | `Boolean` | `True` | Открыть форму отчета завершению тестирования |
| `logging` | `Object` | Смотрите ниже | Параметры логирования, подробнее ниже |
Параметры фильтрации:
| Имя параметра | Тип | Значение по умолчанию | Описание |
|---------------|---------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------|
| `extensions` | `Array` | `["tests"]` | Список имен расширений, из которых грузятся тесты |
| `modules` | `Array` | `Null` | Список имен модулей, из которых грузятся тесты |
| `tests` | `Array` | `Null` | Список полных путей к исполняемым тестам (`[имя модуля.имя теста]`) |
| `suites` | `Array` | `Null` | **Не реализованно.** Список имен тестовых наборов, которые будут запускаться |
| `tags` | `Array` | `Null` | **Не реализованно.** Список тегов, которые будут запускаться |
| `contexts` | `Array` | `Null` | Список имен контекстов исполнения, в которых будут запускаться тесты |
| `paths` | `Array` | `Null` | **Не реализованно.** Список полных путей к исполняемым тестам (`[имя модуля.имя теста|имя модуля.имя теста.имя контекста]`) |
Параметры логирования:
| Имя параметра | Тип | Значение по умолчанию | Описание |
|---------------|-----------|-----------------------|---------------------------------------------------------------------|
| `file` | `String` | `""` | Путь к файлу лога |
| `enable` | `Boolean` | `Null` | Признак использования логирования. Если не указан, зависит от файла, если он указан - вкл, если не указан - выкл |
| `level` | `String` | `"debug"` | Уровень детализации лога. Возможные значения: `"debug"`, `"info"`, `"error"` |
Примеры:
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"
}
```
3. Запустить все тесты с выводом подробного лога в файл, сохранить отчет файл `C:\temp\jUnit\report.xml`
```JSON
{
"reportPath": "C:\\temp\\jUnit\\report.xml",
"logging": {
"file": "C:\\temp\\jUnit\\tests.log",
"level": "debug"
}
}
```
## Строка запуска предприятия
`[путь к клиенту 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`

20
documentation/.gitignore vendored Normal file
View File

@ -0,0 +1,20 @@
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

41
documentation/README.md Normal file
View File

@ -0,0 +1,41 @@
# Website
This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
### Installation
```
$ yarn
```
### Local Development
```
$ yarn start
```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
### Build
```
$ yarn build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
### Deployment
Using SSH:
```
$ USE_SSH=true yarn deploy
```
Not using SSH:
```
$ GIT_USER=<Your GitHub username> yarn deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.

View File

@ -0,0 +1,7 @@
---
sidebar_position: 1
---
# Программный интерфейс
Здесь будет расположена информация о программном интерфейсе YAxUnit

View File

@ -0,0 +1,3 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};

View File

@ -0,0 +1,7 @@
---
sidebar_position: 1
---
# Руководство разработчика
Здесь будут собраны материалы по доработке тестового движка.

View File

@ -0,0 +1,32 @@
---
sidebar_position: 2
tags: [Getting started]
---
# Пишем первый тест
Для создания теста нужно в расширении (в отдельном или в том же) добавить модуль, содержащий экспортный метод регистрации - ИсполняемыеСценарии и реализовать тесты.
```bsl title="ОМ_ПервыйТест"
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("Сложение")
.СПараметрами(2, 3, 5)
.СПараметрами(2, -3, -1)
;
КонецПроцедуры
Процедура Сложение(ПервыйОперанд, ВторойОперанд, Результат) Экспорт
ЮТест.ОжидаетЧто(ПервыйОперанд + ВторойОперанд)
.ИмеетТип("Число")
.Равно(Результат);
КонецПроцедуры
#КонецОбласти
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

View File

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 168 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -0,0 +1,67 @@
---
sidebar_position: 2
sidebar_label: Установка плагина EDT
---
# Установка плагина для работы с тестами в EDT
```mdx-code-block
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
```
Для того, что бы вам и нам было проще писать тесты мы разработали плагин для EDT.
С его помощью вы сможете:
* Запускать и отлаживать свои тесты;
* Просматривать результаты выполнения.
* И [что-то еще](https://github.com/bia-technologies/edt-test-runner/blob/develop/docs/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8.md)
Для установки плагина вам необходимо воспользоваться стандартным функционалом Eclipse (EDT) `Установить новое ПО...`.
* Открываем EDT.
* Переходим к `Установить новое ПО` (в меню `Справка`);
* Добавляем новый репозиторий;
```mdx-code-block
<Tabs>
<TabItem value="master" label="Основной репозиторий">
```
```url
https://bia-technologies.github.io/edt-test-runner/repository
```
```mdx-code-block
</TabItem>
<TabItem value="develop" label="Develop">
```
```url
https://bia-technologies.github.io/edt-test-runner/dev/repository
```
```mdx-code-block
</TabItem>
</Tabs>
```
![Установка плагина](images/plugin-install-from-rep.png)
:::tip совет
Для ускорения установки можно убрать галочку `Обращаться во время инсталляции ко всем сайтам ...`
:::
* Нажимаем далее;
* Принимаем лицензию;
* Соглашаемся с предупреждением безопасности;
* И перезагружаем IDE.
:::note примечание
EDT будет долго перезагружаться и это нормально.
:::

View File

@ -1,29 +1,43 @@
---
sidebar_position: 1
tags: [Getting started]
---
# Установка
YAXUnit - это расширение для 1С:Предприятия, которое надо добавить к вашему проекту.
## Требования
* 1С:Предприятие версии 8.3.10 или старше
## Установка в EDT
### Первичная установка тестового движка в рабочее пространство (workspace)
1. Качаем архив [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
2. Распаковываем содержимое в каталог с исходниками (не в воркспейс)
3. Импортируем проект
1. Скачаем архив [релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
![Страница релиза](images/gh-release.png)
2. Копируем из архива расширение расположенное в каталоге `exts/yaxunit/` в свой каталог с исходниками (не в воркспейс)
![Содержимое архива](images/gh-release-content.png)
3. Импортируем проект расширения в воркспейс
![Импорт проекта](images/project-import.png)
4. Привязываем импортированный проект расширения к конфигурации
![Связь с базовым проектом](images/link-base-project.png)
5. Обновляем конфигурацию
6. В конфигураторе снимаем с расширения **безопасный режим** и **защиту от опасных действий**
7. Готово, можно приступить к написанию тестов.
:::tip совет
Для удобства разработки тестов рекомендуется [установить плагин](install-plugin.md)
:::
### Обновление тестового движка
1. Качаем архив [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
1. Скачаем архив [релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
2. Если вы дорабатывали движок, то скачиваем архив оригинальной установленной версии движка
3. Разархивируем их во временный каталог
4. Воспользуемся механизмом сравнения объединения EDT
![Сравнение объединение](images/compare.png)
* Второй источник - каталог к новой версии тестового движка
* Использование третьего источника нужно для трехстороннего сравнения и применяется при доработках движка.
@ -32,7 +46,8 @@
## Установка в конфигуратор
1. Качаем расширение (cfe) из [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
1. Скачаем расширение (cfe) [релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
![Страница релиза](images/gh-release.png)
2. Загружаем в конфигуратор
3. Снимаем с расширения **безопасный режим** и **защиту от опасных действий**
4. Готово

View File

@ -0,0 +1,73 @@
# Конфигурация запуска
Конфигурация настраивается в файле json и может иметь следующие параметры.
## Основные параметры
| Имя параметра | Тип | Значение по умолчанию | Описание |
|-------------------|-----------|-------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| `filter` | `Object` | [Object, смотрите ниже](#параметры-фильтрации) | Параметры фильтрации, поиска тестов |
| `reportFormat` | `String` | `"jUnit"` | Формат отчета о тестировании, возможные значения: `"jUnit"`, `"JSON"` |
| `reportPath` | `String` | `""` | Путь к формируемому отчету, можно указать или каталог (в которому будет создан файл отчета) или путь к файлу |
| `closeAfterTests` | `Boolean` | `True` | Признак закрытия 1С:Предприятие по завершению тестирования |
| `showReport` | `Boolean` | `True` | Открыть форму отчета завершению тестирования |
| `logging` | `Object` | [Object, смотрите ниже](#параметры-логирования) | Параметры логирования, подробнее ниже |
| `exitCode` | `String` | `""` | Путь к файлу, в который будет записан признак успешного выполнения (0 - успешно, 1 - есть ошибки) |
## Параметры фильтрации
| Имя параметра | Тип | Значение по умолчанию | Описание |
|---------------|---------|-----------------------|------------------------------------------------------------------------------|
| `extensions` | `Array` | `["tests"]` | Список имен расширений, из которых грузятся тесты |
| `modules` | `Array` | `Null` | Список имен модулей, из которых грузятся тесты |
| `tests` | `Array` | `Null` | Список полных путей к исполняемым тестам (`[имя модуля.имя теста]`) |
| `suites` | `Array` | `Null` | **Не реализованно.** Список имен тестовых наборов, которые будут запускаться |
| `tags` | `Array` | `Null` | **Не реализованно.** Список тегов, которые будут запускаться |
| `contexts` | `Array` | `Null` | Список имен контекстов исполнения, в которых будут запускаться тесты |
| `paths` | `Array` | `Null` | **Не реализованно.** Список полных путей к исполняемым тестам |
## Параметры логирования
| Имя параметра | Тип | Значение по умолчанию | Описание |
|---------------|-----------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------|
| `file` | `String` | `""` | Путь к файлу лога |
| `enable` | `Boolean` | `Null` | Признак использования логирования. Если не указан, зависит от параметра `file`, если он указан - вкл, если не указан - выкл |
| `level` | `String` | `"debug"` | Уровень детализации лога. Возможные значения: `"debug"`, `"info"`, `"error"` |
Примеры:
1. Запустить тесты расположенные в модулях `МодульТестов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"
}
```
3. Запустить все тесты с выводом подробного лога в файл, сохранить отчет файл `C:\temp\jUnit\report.xml`
```JSON
{
"reportPath": "C:\\temp\\jUnit\\report.xml",
"logging": {
"file": "C:\\temp\\jUnit\\tests.log",
"level": "debug"
}
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -0,0 +1,30 @@
# Запуск
Для запуска тестов необходимо запустить 1С:Предприятие с параметром `RunUnitTests`, при необходимости можно указать путь к файлу [конфигурации запуска](configuration.md).
:::caution Важно
*После загрузки расширения в информационную базу необходимо отключить у него `безопасный режим` и `защиту от опасных действий`*
:::
## Запуск из EDT
Для запуска тестов из EDT необходимо установить [плагин](../install/install-plugin.md), либо вручную создать файл [конфигурации запуска](configuration.md) и указать его в параметрах запуска.
![EDT](images/from-edt.png)
## Запуск из конфигуратора
Для запуска тестов из конфигуратора вы можете
* Вручную создать файл [конфигурации запуска](configuration.md) и указать его в параметрах запуска
![Конфигуратор](images/from-configurator.png)
* Воспользоваться [интерфейсом настройки](../yaxunit-ui.md#интерфейс-настройки-конфигурации)
## Строка запуска предприятия
`[путь к клиенту 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`

View File

@ -1,3 +1,7 @@
---
tags: [Getting started, Asserts]
---
# Утверждения
Каждый тестовый сценарий должен проверить результат работы тестируемого метода, будь то функция или процедура.

View File

@ -1,3 +1,7 @@
---
tags: [Getting started]
---
# Контекст
Одним из важнейших блоков работы тестового движка является механизм контекстов.

View File

@ -1,3 +1,8 @@
---
description: Create a doc page with rich content.
tags: [Getting started]
---
# Пользовательский API
Для разработчиков тестов расширение предоставляет API для:

View File

@ -1,3 +1,6 @@
---
tags: [Getting started, Mock]
---
# Мокито
Мокито - модуль созданный по образу популярного java-фреймворка для тестирования [Mockito](https://site.mockito.org/). Расширяет возможности тестирования, позволяет легко менять логику работы системы подменяя результаты работы методов, отключая какие-либо алгоритмы и проверки.
@ -28,9 +31,15 @@
Работа с Мокито делится на 3 стадии:
1. Обучение - настраиваем поведение методов системы
2. Прогон - выполнение теста целевого метода
3. Проверка - анализ вызовов
```mermaid
flowchart LR
training(Обучение) --> run(Прогон, запуск тестового метода)
run --> check(Проверка)
```
* [Обучение](#обучение) - настраиваем поведение методов системы
* [Прогон](#прогон) - выполнение теста целевого метода
* [Проверка](#проверка) - анализ вызовов
## Использование
@ -44,7 +53,7 @@
* использовать явный вызов метода с параметрами на стадии обучения, например `Мокито.Обучение(Справочники.ИсточникиДанных).Когда(Справочники.ИсточникиДанных.СохраненныеБезопасныеДанные(Справочник)).Вернуть(Результат)`
* использовать явный вызов метода с параметрами на стадии проверки, например `Мокито.Проверить(Справочники.ИсточникиДанных).КоличествоВызовов(Справочники.ИсточникиДанных.СохраненныеБезопасныеДанные(Справочник)).Больше(1)`
Примеры добавления методов в расширение:
Примеры добавления методов в расширение.
#### Метод общего модуля
@ -178,7 +187,7 @@
1. `Мокито.Обучение(РаботаСHTTP).Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(Мокито.ТипизированныйПараметр(ТипИсточникДанных), Мокито.ЧисловойПараметр())).Вернуть(3)`
2. `Мокито.Обучение(РаботаСHTTP).Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(Мокито.ТипизированныйПараметр(ТипИсточникДанных), Мокито.ЧисловойПараметр()).Вернуть(3)`
## Прогон
### Прогон
После обучения, настройки реакций на вызовы методов, можно запускать тест нужного метода. Для перехода к этому режиму работы Мокито используется метод `Прогон`.
@ -198,7 +207,7 @@
Результат = РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 2); // Результат будет равен 2
```
## Проверка
### Проверка
После прогона теста можно проверить какие методы, с какими параметрами вызывались. Для этих целей необходимо воспользоваться методом `Проверить`

View File

@ -1,3 +1,6 @@
---
tags: [Getting started, Test data]
---
# Тестовые данные
Почти в каждом тесте разработчику необходимы данные, которые он будет использовать при тестировании: элементы справочников, документы, остатки и тд.

View File

@ -1,3 +1,6 @@
---
tags: [Getting started]
---
# Регистрация тестовых методов (ЮТТесты)
Кроме того, чтобы написать тестовые сценарии, разработчик должен зарегистрировать их в движке.

View File

@ -2,7 +2,7 @@
## Интерфейс отчета
Для просмотра результатов тестирования в режиме 1С:Предприятие, вам необходимо в параметрах запуска указать [настройку](../README.md#конфигурация-запуска) `showReport`
Для просмотра результатов тестирования в режиме 1С:Предприятие, вам необходимо в параметрах запуска указать [настройку](run) `showReport`
Например, создав файла настроек
```json

View File

@ -0,0 +1,178 @@
// @ts-check
// Note: type annotations allow type checking and IDEs autocompletion
const lightCodeTheme = require('prism-react-renderer/themes/github');
const darkCodeTheme = require('prism-react-renderer/themes/dracula');
/** @type {import('@docusaurus/types').Config} */
const config = {
title: 'YAx Unit',
tagline: 'Модульные тесты для 1С - это не сложно',
favicon: 'img/logo.png',
// Set the production url of your site here
url: 'https://bia-technologies.github.io/',
// Set the /<baseUrl>/ pathname under which your site is served
// For GitHub pages deployment, it is often '/<projectName>/'
baseUrl: '/yaxunit',
// GitHub pages deployment config.
// If you aren't using GitHub pages, you don't need these.
organizationName: 'bia-technologies', // Usually your GitHub org/user name.
projectName: 'yaxunit', // Usually your repo name.
deploymentBranch: 'gh-pages',
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',
// Even if you don't use internalization, you can use this field to set useful
// metadata like html lang. For example, if your site is Chinese, you may want
// to replace "en" with "zh-Hans".
i18n: {
defaultLocale: 'en',
locales: ['en'],
},
presets: [
[
'classic',
/** @type {import('@docusaurus/preset-classic').Options} */
({
docs: {
routeBasePath: 'docs',
sidebarPath: require.resolve('./sidebars.js'),
// Please change this to your repo.
// Remove this to remove the "edit this page" links.
editUrl:
'https://github.com/bia-technologies/yaxunit/',
},
blog: false,
theme: {
customCss: require.resolve('./src/css/custom.css'),
},
}),
]
],
plugins: [
[
'@docusaurus/plugin-content-docs',
{
id: 'api',
path: 'api',
routeBasePath: 'api',
sidebarPath: require.resolve('./sidebarsAPI.js'),
// ... other options
},
],
[
'@docusaurus/plugin-content-docs',
{
id: 'lessons',
path: 'lessons',
routeBasePath: 'lessons',
sidebarPath: require.resolve('./sidebarsLessons.js'),
// ... other options
},
],
[
'@docusaurus/plugin-content-docs',
{
id: 'contributing',
path: 'contributing',
routeBasePath: 'contributing',
sidebarPath: require.resolve('./sidebarsContributing.js'),
// ... other options
},
]
],
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
// Replace with your project's social card
navbar: {
title: 'YAx Unit',
logo: {
alt: 'YaxUnit Logo',
src: 'img/logo.png',
},
items: [
{
type: 'doc',
docId: 'user-api/index',
position: 'left',
label: 'Описание',
},
{
type: 'doc',
docId: 'index',
docsPluginId: 'lessons',
position: 'left',
label: 'Уроки',
},
{
type: 'doc',
docId: 'index',
docsPluginId: 'api',
position: 'left',
label: 'API',
},
{
type: 'doc',
docId: 'index',
docsPluginId: 'contributing',
position: 'left',
label: 'Руководство разработчика',
},
{
href: 'https://github.com/bia-technologies/yaxunit',
label: 'bia-technologies/yaxunit',
position: 'right',
},
],
},
footer: {
style: 'dark',
links: [
{
title: 'Docs',
items: [
{
label: 'Tutorial',
to: '/docs/user-api',
},
],
},
{
title: 'Community',
items: [
{
label: 'Telegram',
href: 'https://t.me/BIAOpenTools/12',
}
],
},
{
title: 'More',
items: [
{
label: 'GitHub',
href: 'https://github.com/bia-technologies/yaxunit',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} BIA Technologies, Inc. Built with Docusaurus.`,
},
prism: {
theme: lightCodeTheme,
darkTheme: darkCodeTheme,
},
}),
markdown: {
mermaid: true,
},
themes: ['@docusaurus/theme-mermaid'],
};
module.exports = config;

View File

@ -0,0 +1,3 @@
# Уроки и примеры использования YAxUnit
Здесь будут собраны различные материалы для лучшего понимая принципов написания тестов в работы с YAxUnit

12966
documentation/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
{
"name": "documentation",
"version": "0.0.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
"start": "docusaurus start",
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids"
},
"dependencies": {
"@docusaurus/core": "2.3.1",
"@docusaurus/preset-classic": "2.3.1",
"@docusaurus/theme-mermaid": "^2.3.1",
"@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1",
"prism-react-renderer": "^1.3.5",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "2.3.1"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"engines": {
"node": ">=16.14"
}
}

33
documentation/sidebars.js Normal file
View File

@ -0,0 +1,33 @@
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
// But you can create a sidebar manually
/*
tutorialSidebar: [
'intro',
'hello',
{
type: 'category',
label: 'Tutorial',
items: ['tutorial-basics/create-a-document'],
},
],
*/
};
module.exports = sidebars;

View File

@ -0,0 +1,33 @@
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
api: [{type: 'autogenerated', dirName: '.'}],
// But you can create a sidebar manually
/*
tutorialSidebar: [
'intro',
'hello',
{
type: 'category',
label: 'Tutorial',
items: ['tutorial-basics/create-a-document'],
},
],
*/
};
module.exports = sidebars;

View File

@ -0,0 +1,33 @@
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
contributing: [{type: 'autogenerated', dirName: '.'}],
// But you can create a sidebar manually
/*
tutorialSidebar: [
'intro',
'hello',
{
type: 'category',
label: 'Tutorial',
items: ['tutorial-basics/create-a-document'],
},
],
*/
};
module.exports = sidebars;

View File

@ -0,0 +1,33 @@
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
lessons: [{type: 'autogenerated', dirName: '.'}],
// But you can create a sidebar manually
/*
tutorialSidebar: [
'intro',
'hello',
{
type: 'category',
label: 'Tutorial',
items: ['tutorial-basics/create-a-document'],
},
],
*/
};
module.exports = sidebars;

View File

@ -0,0 +1,30 @@
/**
* Any CSS included here will be global. The classic template
* bundles Infima by default. Infima is a CSS framework designed to
* work well for content-centric websites.
*/
/* You can override the default Infima variables here. */
:root {
--ifm-color-primary: #2e8555;
--ifm-color-primary-dark: #29784c;
--ifm-color-primary-darker: #277148;
--ifm-color-primary-darkest: #205d3b;
--ifm-color-primary-light: #33925d;
--ifm-color-primary-lighter: #359962;
--ifm-color-primary-lightest: #3cad6e;
--ifm-code-font-size: 95%;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
}
/* For readability concerns, you should choose a lighter palette in dark mode. */
[data-theme='dark'] {
--ifm-color-primary: #25c2a0;
--ifm-color-primary-dark: #21af90;
--ifm-color-primary-darker: #1fa588;
--ifm-color-primary-darkest: #1a8870;
--ifm-color-primary-light: #29d5b0;
--ifm-color-primary-lighter: #32d8b4;
--ifm-color-primary-lightest: #4fddbf;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
}

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,197 @@
---
sidebar_position: 0
slug: /
---
# YAXUnit. Расширение для запуска тестов
----
[![Actions Status](https://github.com/bia-technologies/yaxunit/actions/workflows/sq.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions)
[![Download](https://img.shields.io/github/release/bia-technologies/yaxunit.svg?label=download&style=flat)](https://github.com/bia-technologies/yaxunit/releases/latest)
[![GitHub Releases](https://img.shields.io/github/downloads/bia-technologies/yaxunit/latest/total?style=flat-square)](https://github.com/bia-technologies/yaxunit/releases)
[![Quality Gate](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=yaxunit)
[![Maintainability](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=sqale_rating)](https://sonar.openbsl.ru/dashboard?id=yaxunit)
Обсудить в [телеграмм чате](https://t.me/BIAOpenTools/12)
----
- [Назначение](#назначение)
- [Возможности](#возможности)
- [Пример тестового модуля](#пример-тестового-модуля)
- [Запуск](#запуск)
- [Запуск из EDT](#запуск-из-edt)
- [Запуск вне EDT](#запуск-вне-edt)
- [Благодарности](#благодарности)
- [Лицензия](#лицензия)
## Назначение
Самостоятельное расширение для написания и выполнения модульного тестирования.
### Возможности
- YAXUnit - это расширение с открытым исходным кодом, которое используется для написания и выполнения тестов
- Разрабатывалось с оглядкой на JUnit5, пожалуй, лучший фреймворк тестирования
- Предоставляет движок выполнения тестов
- Предоставляет утверждения для проверки ожидаемых результатов
- Тесты могут быть организованы в наборы и выполняться в разных контекстах
- Позволяет быстрее и проще не только писать, но и читать тесты
- Результаты тестирования могут быть сохранены в отчет, на текущий момент jUnit и json.
- Большая часть пользовательского API реализована как [текучие выражения](https://ru.wikipedia.org/wiki/Fluent_interface)
- Предусмотрена возможность расширения функциональности, можно регистрировать свои форматы отчетов, добавлять модули с утверждениями
- Реализован [плагин для EDT](https://github.com/bia-technologies/edt-test-runner), который упрощает процесс запуска тестов
Подробнее ознакомиться с функциональностью вы можете изучив [документацию](/docs/user-api).
А для того, что бы начать писать тесты необходимо [установить расширение](/docs/install) в свою IDE (конфигуратор или EDT).
## Пример тестового модуля
Для создания теста нужно в расширении (в отдельном или в том же) добавить модуль, содержащий экспортный метод регистрации - `ИсполняемыеСценарии` и реализовать тесты.
Пример модуля тестов:
```bsl
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
// Регистрация тестов
ЮТТесты // Регистрация тестов выполняет через модуль регистратор
.ДобавитьТестовыйНабор("Математические методы") // Набор - объединение тестов
.ДобавитьТест("Сложение") // Обязательно при регистрации указываем имя экспортного метода
.ДобавитьТест("Вычитание", "Вычитание") // Также можно указать представление теста
.ДобавитьТест("Вычитание", "ВычитаниеСервер", , "Сервер") // Контекст исполнения, по умолчанию тест выполняется во всех контекстах модуля
.ДобавитьКлиентскийТест("УмножениеНаКлиенте") // Есть отдельный метод для регистрации клиентских тестов
.ДобавитьСерверныйТест("ДелениеНаСервере", "Деление на сервер") // Есть отдельный метод для регистрации серверных тестов
.ДобавитьТестовыйНабор("Строковые методы")
.ДобавитьТест("СтрНайти")
.ДобавитьТест("СтрРазделить");
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура Сложение() Экспорт
// Реализация теста на сложение
ЮТест.ОжидаетЧто(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение
.ИмеетТип("Число") // Проверим тип
.Заполнено() // Заполненность проверяемого значения
.Больше(0) // Сравним с нулем
.Равно(5); // Проверим ожидаемый результат
ЮТест.ОжидаетЧто(-8 + 8, "-8 + 8") // Проверим второй вариант
.Равно(0);
КонецПроцедуры
Процедура Вычитание() Экспорт
// Реализация теста на вычитание
ЮТест.ОжидаетЧто(2 - 3, "2 - 3").ИмеетТип("Число").Заполнено().Меньше(0);
КонецПроцедуры
#КонецОбласти
#Область События
// Также в тесте можно обрабатывать события выполнения
// Например можно реализовать подготовку и удаление тестовых данных
// Зачистку временных файлов, настройку системы
Процедура ПередВсемиТестами() Экспорт
// Выполняется перед запуском всех тестов контекста, те если есть тесты и на клиенте и на сервер, то метод будет выполнен 2 раза
Сообщить("Запуск тестирования");
КонецПроцедуры
Процедура ПередТестовымНабором() Экспорт
// Выполняется перед каждым тестовым набором для каждого контекста выполнения
Контекст = ЮТест.КонтекстТестовогоНабора(); // Контекст набора служит для хранения любых данных, нужных при тестировании
// Контекст живет в рамках контекста выполнения,
// таки образом, через контекст нельзя передавать данные между серверными и клиентскими тестами
Контекст.Вставить("ВремяНачала", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПередКаждымТестом() Экспорт
// Выполняется перед каждым тестом
Контекст = ЮТест.КонтекстТеста(); // Контекст теста служит для хранения любых данных, нужных при тестировании
// Контекст создает перед тестом и уничтожается после его выполнения
// В контекст например, можно помещать созданные в процессе данные, что бы потом их удалить
Контекст.Вставить("ВремяНачала", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПослеКаждогоТеста() Экспорт
// Выполняется после каждого теста
Контекст = ЮТест.КонтекстТеста();
Сообщить("Время выполнения теста: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала));
КонецПроцедуры
Процедура ПослеТестовогоНабора() Экспорт
// Выполняется после каждого тестового набора для каждого контекста выполнения
// Применяется для очистки данных и т.д.
Контекст = ЮТест.КонтекстТестовогоНабора();
Сообщить("Время выполнения набора: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала));
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
// Выполняется после выполнения всех тестов контекста, те если есть тесты и на клиенте и на сервер, то метод будет выполнен 2 раза
// В этом событии все контексты уже уничтожены
Сообщить("Тестирование завершено");
КонецПроцедуры
#КонецОбласти
```
После запуска тестов модуля в EDT (используя [плагин](https://github.com/bia-technologies/edt-test-runner)) получаем такой отчет:
![Отчет](images/report.png)
## Запуск
### Запуск из EDT
При разработке в EDT процесс запуска тестов можно упростить, установив [плагин](https://github.com/bia-technologies/edt-test-runner)
и настроив конфигурацию запуска, как указано в описании плагина.
### Запуск вне EDT
Для запуска тестов без использования EDT необходимо:
1. Сформировать файл конфигурации запуска [вручную](/docs/run), либо воспользоваться [формой настройки](/docs/yaxunit-ui)
2. [Запустить 1С:Предприятие](/docs/run) с параметром `RunUnitTests=ПутьКФайлуКонфигурации.json`.
## Благодарности
Приносим благодарность всему [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)

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -58,13 +58,20 @@
КонецФункции
// Прогон
// Переводит мокито в режим прогона тестов
// Вызов этого метода обязателен перед выполнением тестового прогона метода
Процедура Прогон() Экспорт
// Переводит мокито в режим прогона тестов
// Вызов этого метода обязателен перед выполнением тестового прогона метода
//
// Параметры:
// СброситьСтатистику - Булево - Сбросить статистику прошлых прогонов
Процедура Прогон(СброситьСтатистику = Истина) Экспорт
Режимы = МокитоСлужебный.РежимыРаботы();
МокитоСлужебный.УстановитьРежим(Режимы.Тестирование);
Если СброситьСтатистику Тогда
МокитоСлужебный.ОчиститьСтатистику();
КонецЕсли;
КонецПроцедуры
// Проверить.
@ -139,7 +146,7 @@
// см. МокитоСлужебный.ОписаниеМаскиПараметра
Функция ТипизированныйПараметр(Тип) Экспорт
МаскаПараметра = МокитоСлужебный.ОписаниеМаскиПараметра(МокитоСлужебный.ТипыУсловийПараметров().Тип, 1);
МаскаПараметра = МокитоСлужебный.ОписаниеМаскиПараметра(МокитоСлужебный.ТипыУсловийПараметров().Тип, 10);
МаскаПараметра.Вставить("Тип", Тип);
Возврат МаскаПараметра;

View File

@ -224,7 +224,7 @@
Иначе
Условия.Добавить(Новый Структура("Режим, Значение, Приоритет", "Значение", Параметр, 10));
Условия.Добавить(Новый Структура("Режим, Значение, Приоритет", "Значение", Параметр, 100));
КонецЕсли;

View File

@ -46,24 +46,28 @@
// ОбщийМодуль
Функция КоличествоВызовов(ИмяМетода = Неопределено, ПараметрыВызова = Неопределено) Экспорт
Параметры = ПараметрыПроверки();
Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда
СтруктураВызоваМетода = ИмяМетода;
Иначе
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, ПараметрыВызова);
КонецЕсли;
Если СтруктураВызоваМетода.Объект <> Параметры.ПроверяемыйОбъект Тогда
ВызватьИсключение "Установлен другой проверяемый объект";
КонецЕсли;
Параметры.СтруктураВызоваМетода = СтруктураВызоваМетода;
СпозиционироватьсяНаМетоде(ИмяМетода, ПараметрыВызова);
Возврат МокитоПроверки;
КонецФункции
// Возвращает информацию о вызовах метода.
//
// Параметры:
// ИмяМетода - Строка - Имя метода проверяемого объекта
// - Произвольный - Вызов метода проверяемого объекта
// ПараметрыВызова - Массив из Произвольный - Параметры вызова метода проверяемого объекта, необходим при указании имени метода
// Возвращаемое значение:
// Массив из см. МокитоСлужебный.СтруктураВызоваМетода - Вызовы метода
Функция Вызовы(ИмяМетода = Неопределено, ПараметрыВызова = Неопределено) Экспорт
СпозиционироватьсяНаМетоде(ИмяМетода, ПараметрыВызова);
Возврат СтатистикаВызовов();
КонецФункции
// Равно.
// Проверяет подобранные вызовы. Их количество должно быть равно переданному значение, иначе вызывается исключение
// Параметры:
@ -269,4 +273,22 @@
КонецФункции
Процедура СпозиционироватьсяНаМетоде(ИмяМетода = Неопределено, ПараметрыВызова = Неопределено)
Параметры = ПараметрыПроверки();
Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда
СтруктураВызоваМетода = ИмяМетода;
Иначе
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, ПараметрыВызова);
КонецЕсли;
Если СтруктураВызоваМетода.Объект <> Параметры.ПроверяемыйОбъект Тогда
ВызватьИсключение "Установлен другой проверяемый объект";
КонецЕсли;
Параметры.СтруктураВызоваМетода = СтруктураВызоваМетода;
КонецПроцедуры
#КонецОбласти

View File

@ -35,6 +35,19 @@
КонецПроцедуры
// Настройки.
//
// Возвращаемое значение:
// Структура - Настройки:
// * Метод - Строка
// * Реакция - Строка
// * Настройки - Строка
// * Перехват - Строка
// * Режим - Строка - см. РежимыРаботы
// * Статистика - Структура - Статистика вызовов:
// * Вызовы - Соответствие из Структура
// * ПараметрыОбучения - Структура
// * ПараметрыПроверки - Структура
Функция Настройки() Экспорт
Настройки = ЮТКонтекст.ЗначениеКонтекста(КлючНастроек());
@ -181,7 +194,7 @@
ИначеЕсли Условие.Режим = ТипыУсловий.Значение Тогда
Совпадает = Условие.Значение = Параметр;
Совпадает = ЮТОбщий.ДанныеСовпадают(Условие.Значение, Параметр);
ИначеЕсли Условие.Режим = ТипыУсловий.Тип Тогда
@ -263,6 +276,8 @@
#КонецОбласти
#Область Статистика
Функция СтатистикаВызовов(Знач Объект, ИмяМетода) Экспорт
Если ЭтоОбъект(Объект) Тогда
@ -279,6 +294,15 @@
КонецФункции
Процедура ОчиститьСтатистику() Экспорт
Настройки = Настройки();
Настройки.Статистика.Вызовы.Очистить();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытий
Процедура ПередКаждымТестом(ОписаниеСобытия) Экспорт
@ -383,19 +407,33 @@
Функция НайтиРеакцию(ПараметрыПерехватаМетода, СтруктураВызоваМетода)
Реакция = Неопределено;
Приоритет = 0;
ПараметрыВызова = СтруктураВызоваМетода.Параметры;
Для Каждого ВозможнаяРеакция Из ПараметрыПерехватаМетода.Реакции Цикл
ПриоритетыРеакций = Новый Массив();
ЛучшийПриоритет = 0;
Для Каждого Реакция Из ПараметрыПерехватаМетода.Реакции Цикл
ПриоритетВозможнойРеакции = ПроверитьРеакцию(ВозможнаяРеакция, ПараметрыВызова);
ПриоритетРеакции = ПроверитьРеакцию(Реакция, ПараметрыВызова);
ПриоритетыРеакций.Добавить(Новый Структура("Приоритет, Реакция", ПриоритетРеакции, Реакция));
Если ПриоритетВозможнойРеакции > Приоритет Тогда
Реакция = ВозможнаяРеакция;
Приоритет = ПриоритетВозможнойРеакции;
Если ЛучшийПриоритет < ПриоритетРеакции Тогда
ЛучшийПриоритет = ПриоритетРеакции;
КонецЕсли;
КонецЦикла;
Реакция = Неопределено;
Для Каждого ПриоритетРеакции Из ПриоритетыРеакций Цикл
Если ПриоритетРеакции.Приоритет = ЛучшийПриоритет Тогда
Реакция = ПриоритетРеакции.Реакция;
Иначе
Продолжить;
КонецЕсли;
Если Реакция.Действие <> Неопределено И НЕ Реакция.Действие.Обработано Тогда
Прервать;
КонецЕсли;
КонецЦикла;

View File

@ -20,51 +20,101 @@
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#Область СлужебныйПрограммныйИнтерфейс
#Если Клиент Тогда
// ВыполнитьМодульноеТестирование
// Метод, по параметрам запуска, запускает выполнение всего процесса тестирования.
//
// Параметры:
// Параметры - См. ЮТФабрика.ПараметрыЗапуска
Процедура ВыполнитьМодульноеТестирование(Параметры = Неопределено) Экспорт
Процедура ВыполнитьМодульноеТестирование() Экспорт
Если Параметры = Неопределено Тогда
Параметры = ЮТПараметры.ПараметрыЗапуска(ПараметрЗапуска);
ПараметрыИсполнения = ПараметрыИсполнения();
ПараметрыИсполнения.АргументыЗапуска = ПараметрЗапуска;
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьПараметры");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикАнализПараметровЗапуска");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьОтчет");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьКодВозврата");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗавершить");
ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
Процедура ВызватьОбработчик(Обработчик, Результат = Неопределено) Экспорт
Если Обработчик <> Неопределено Тогда
ВыполнитьОбработкуОповещения(Обработчик, Результат);
КонецЕсли;
Если НЕ Параметры.ВыполнятьМодульноеТестирование Тогда
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ОбработчикиЦепочкиДействий
Процедура ОбработчикОшибки(ИнформацияОбОшибки, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
// TODO Подумать надо ли и как реализовать нормально
КонецПроцедуры
Процедура ОбработчикЗагрузитьПараметры(Результат, ДополнительныеПараметры) Экспорт
Обработчик = СледующийОбработчик(ДополнительныеПараметры);
ЮТПараметрыЗапуска.ПараметрыЗапуска(ДополнительныеПараметры.АргументыЗапуска, Обработчик);
КонецПроцедуры
Процедура ОбработчикАнализПараметровЗапуска(ПараметрыЗапуска, ДополнительныеПараметры) Экспорт
ДополнительныеПараметры.ПараметрыЗапуска = ПараметрыЗапуска;
Если НЕ ПараметрыЗапуска.ВыполнятьМодульноеТестирование Тогда
Возврат;
КонецЕсли;
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
Процедура ОбработчикЗагрузитьТесты(Результат, ДополнительныеПараметры) Экспорт
Параметры = ДополнительныеПараметры.ПараметрыЗапуска;
ЮТКонтекст.ИнициализироватьКонтекст();
ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings);
ЮТСобытия.Инициализация(Параметры);
// Повторно сохраним для передачи на сервер
ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения());
ЮТКонтекст.УстановитьКонтекстИсполнения(ДанныеКонтекстаИсполнения());
ЮТКонтекст.УстановитьКонтекстИсполнения(ЮТФабрика.НовыйКонтекстИсполнения());
ЮТСобытия.ПередЧтениеСценариев();
ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(Параметры);
ЮТСобытия.ПослеЧтенияСценариев(ТестовыеМодули);
РезультатыТестирования = Новый Массив();
КоллекцияКатегорийНаборов = Новый Массив();
Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл
КатегорииНаборов = КатегорииНаборовТестовМодуля(ТестовыйМодуль);
КоллекцияКатегорийНаборов.Добавить(КатегорииНаборов);
КонецЦикла;
ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов);
ДополнительныеПараметры.КоллекцияКатегорийНаборов = КоллекцияКатегорийНаборов;
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
Процедура ОбработчикВыполнитьТестирование(Результат, ДополнительныеПараметры) Экспорт
РезультатыТестирования = Новый Массив();
КоллекцияКатегорийНаборов = ДополнительныеПараметры.КоллекцияКатегорийНаборов;
Для Каждого КатегорииНаборов Из КоллекцияКатегорийНаборов Цикл
Результат = ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, КатегорииНаборов.ТестовыйМодуль);
Результат = ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, КатегорииНаборов.ТестовыйМодуль);
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат);
Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Серверные, КатегорииНаборов.ТестовыйМодуль);
@ -76,129 +126,81 @@
КонецЦикла;
ЮТОтчет.СформироватьОтчет(РезультатыТестирования, Параметры);
ДополнительныеПараметры.РезультатыТестирования = РезультатыТестирования;
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
Процедура ОбработчикСохранитьОтчет(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(ДополнительныеПараметры.ПараметрыЗапуска.reportPath) Тогда
Обработчик = СледующийОбработчик(ДополнительныеПараметры);
ЮТОтчет.СформироватьОтчет(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска, Обработчик);
Иначе
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
Процедура ОбработчикСохранитьКодВозврата(Результат, ДополнительныеПараметры) Экспорт
ЗаписатьКодВозврата(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска);
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
Процедура ОбработчикЗавершить(Результат, ДополнительныеПараметры) Экспорт
Параметры = ДополнительныеПараметры.ПараметрыЗапуска;
Если Параметры.showReport Тогда
ПоказатьОтчет(РезультатыТестирования, Параметры);
ПоказатьОтчет(ДополнительныеПараметры.РезультатыТестирования, Параметры);
ИначеЕсли Параметры.CloseAfterTests Тогда
ПрекратитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
#КонецЕсли
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// Выполняет тесты группы наборов, соответствующих одному режиму выполнения (клиент/сервер)
// Параметры:
// Наборы - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Результат прогона наборов тестов с заполненной информацией о выполнении
Функция ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль) Экспорт
Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено)
Если Наборы.Количество() = 0 Тогда
Возврат Наборы;
КонецЕсли;
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки);
Возврат Наборы;
КонецЕсли;
Для Каждого Набор Из Наборы Цикл
Результат = ВыполнитьНаборТестов(Набор, ТестовыйМодуль);
Если Результат <> Неопределено Тогда
Набор.Тесты = Результат;
КонецЕсли;
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки);
КонецЕсли;
ТестовыйМодуль.Ошибки.Очистить(); // Эти ошибки используются как буфер и уже скопированы в наборы, но ломают последующие наборы
Возврат Наборы;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль)
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор);
Если ЕстьОшибки(Набор) Тогда
Возврат Неопределено;
КонецЕсли;
Результаты = Новый Массив();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест;
Для Каждого Тест Из Набор.Тесты Цикл
Тест.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередКаждымТестом(ТестовыйМодуль, Набор, Тест);
ВыполнитьТестовыйМетод(Тест);
ЮТСобытия.ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест);
ОбработатьЗавершениеТеста(Тест);
Результаты.Добавить(Тест);
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор);
Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта;
Возврат Результаты;
КонецФункции
Процедура ОбработатьЗавершениеТеста(Тест)
Тест.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Тест.ДатаСтарта;
Тест.Статус = ЮТРегистрацияОшибок.СтатусВыполненияТеста(Тест);
Обработчик = СледующийОбработчик(ПараметрыИсполнения);
ВыполнитьОбработкуОповещения(Обработчик, Результат);
КонецПроцедуры
Функция СледующийОбработчик(ПараметрыИсполнения)
ПараметрыИсполнения.ИндексСледующегоОбработчика = ПараметрыИсполнения.ИндексСледующегоОбработчика + 1;
Возврат ПараметрыИсполнения.Цепочка[ПараметрыИсполнения.ИндексСледующегоОбработчика];
КонецФункции
Процедура ДобавитьОбработчикЦепочки(ПараметрыИсполнения, ИмяМетода)
Обработчик = Новый ОписаниеОповещения(ИмяМетода, ЭтотОбъект, ПараметрыИсполнения, "ОбработчикОшибки", ЭтотОбъект);
ПараметрыИсполнения.Цепочка.Добавить(Обработчик);
КонецПроцедуры
Функция ПараметрыИсполнения()
Параметры = Новый Структура();
Параметры.Вставить("АргументыЗапуска");
Параметры.Вставить("ПараметрыЗапуска");
Параметры.Вставить("Цепочка", Новый Массив());
Параметры.Вставить("ИндексСледующегоОбработчика", -1);
Параметры.Вставить("КоллекцияКатегорийНаборов");
Параметры.Вставить("РезультатыТестирования");
Возврат Параметры;
КонецФункции
Функция КатегорииНаборовТестовМодуля(ТестовыйМодуль)
КатегорииНаборов = ОписаниеКатегорияНабораТестов(ТестовыйМодуль);
КатегорииНаборов = ЮТФабрика.ОписаниеКатегорияНабораТестов(ТестовыйМодуль);
ИсполняемыеТестовыеНаборы = Новый Массив;
@ -288,79 +290,6 @@
КонецФункции
Функция ЕстьОшибки(Объект)
Возврат ЗначениеЗаполнено(Объект.Ошибки);
КонецФункции
Процедура ВыполнитьТестовыйМетод(Тест)
Если ЕстьОшибки(Тест) Тогда
Возврат;
КонецЕсли;
СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста();
Тест.Статус = СтатусыИсполненияТеста.Исполнение;
Ошибка = ЮТОбщий.ВыполнитьМетод(Тест.ПолноеИмяМетода, Тест.Параметры);
Если Ошибка <> Неопределено Тогда
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуВыполненияТеста(Тест, Ошибка);
КонецЕсли;
КонецПроцедуры
Процедура СкопироватьОшибкиВ(Объекты, Ошибки)
Для Каждого Объект Из Объекты Цикл
ЮТОбщий.ДополнитьМассив(Объект.Ошибки, Ошибки);
Если Объект.Свойство("Статус") Тогда
Объект.Статус = ЮТФабрика.СтатусыИсполненияТеста().Сломан;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Данные контекста исполнения.
//
// Возвращаемое значение:
// Структура - Данные контекста исполнения:
// * Уровень - Строка
Функция ДанныеКонтекстаИсполнения()
Контекст = Новый Структура();
Контекст.Вставить("Уровень", "");
Возврат Контекст;
КонецФункции
// Описание категория набора тестов.
//
// Параметры:
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Структура - Описание категория набора тестов:
// * ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
// * Клиентские - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Серверные - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Пропущенные - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ОписаниеКатегорияНабораТестов(ТестовыйМодуль)
КатегорииНаборов = Новый Структура();
КатегорииНаборов.Вставить("ТестовыйМодуль", ТестовыйМодуль);
КатегорииНаборов.Вставить("Клиентские", Новый Массив());
КатегорииНаборов.Вставить("Серверные", Новый Массив());
КатегорииНаборов.Вставить("Пропущенные", Новый Массив());
Возврат КатегорииНаборов;
КонецФункции
#Если Клиент Тогда
Процедура ПоказатьОтчет(РезультатыТестирования, Параметры)
Данные = Новый Структура("РезультатыТестирования, ПараметрыЗапуска", РезультатыТестирования, Параметры);
@ -369,6 +298,50 @@
ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Основная", Новый Структура("АдресХранилища", АдресДанных));
КонецПроцедуры
// Записать код возврата.
//
// Параметры:
// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// Параметры - см. ЮТФабрика.ПараметрыЗапуска
Процедура ЗаписатьКодВозврата(РезультатыТестирования, Параметры)
Успешно = Истина;
Если ПустаяСтрока(Параметры.exitCode) Тогда
Возврат;
КонецЕсли;
Для Каждого Набор Из РезультатыТестирования Цикл
Если ЗначениеЗаполнено(Набор.Ошибки) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
Для Каждого Тест Из Набор.Тесты Цикл
Если ЗначениеЗаполнено(Тест.Ошибки) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Успешно Тогда
Прервать;
КонецЕсли;
КонецЦикла;
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТИсполнительКлиент.ЗаписатьКодВозврата");
#Иначе
Запись = Новый ЗаписьТекста(Параметры.exitCode, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку(?(Успешно, 0, 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="c9bf0e7a-6503-44eb-bef0-b37e1d3c6e22">
<name>ЮТИсполнительКлиент</name>
<synonym>
<key>ru</key>
<value>Исполнитель клиент</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,162 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 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 Тогда
Возврат Наборы;
КонецЕсли;
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки);
Возврат Наборы;
КонецЕсли;
Для Каждого Набор Из Наборы Цикл
Результат = ВыполнитьНаборТестов(Набор, ТестовыйМодуль);
Если Результат <> Неопределено Тогда
Набор.Тесты = Результат;
КонецЕсли;
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки);
КонецЕсли;
ТестовыйМодуль.Ошибки.Очистить(); // Эти ошибки используются как буфер и уже скопированы в наборы, но ломают последующие наборы
Возврат Наборы;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль)
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор);
Если ЕстьОшибки(Набор) Тогда
Возврат Неопределено;
КонецЕсли;
Результаты = Новый Массив();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест;
Для Каждого Тест Из Набор.Тесты Цикл
Тест.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередКаждымТестом(ТестовыйМодуль, Набор, Тест);
ВыполнитьТестовыйМетод(Тест);
ЮТСобытия.ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест);
ОбработатьЗавершениеТеста(Тест);
Результаты.Добавить(Тест);
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор);
Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта;
Возврат Результаты;
КонецФункции
Процедура ОбработатьЗавершениеТеста(Тест)
Тест.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Тест.ДатаСтарта;
Тест.Статус = ЮТРегистрацияОшибок.СтатусВыполненияТеста(Тест);
КонецПроцедуры
Функция ЕстьОшибки(Объект)
Возврат ЗначениеЗаполнено(Объект.Ошибки);
КонецФункции
Процедура ВыполнитьТестовыйМетод(Тест)
Если ЕстьОшибки(Тест) Тогда
Возврат;
КонецЕсли;
СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста();
Тест.Статус = СтатусыИсполненияТеста.Исполнение;
Ошибка = ЮТОбщий.ВыполнитьМетод(Тест.ПолноеИмяМетода, Тест.Параметры);
Если Ошибка <> Неопределено Тогда
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуВыполненияТеста(Тест, Ошибка);
КонецЕсли;
КонецПроцедуры
Процедура СкопироватьОшибкиВ(Объекты, Ошибки)
Для Каждого Объект Из Объекты Цикл
ЮТОбщий.ДополнитьМассив(Объект.Ошибки, Ошибки);
Если Объект.Свойство("Статус") Тогда
Объект.Статус = ЮТФабрика.СтатусыИсполненияТеста().Сломан;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -1,6 +1,6 @@
<?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>
<name>ЮТИсполнительКлиентСервер</name>
<synonym>
<key>ru</key>
<value>Исполнитель</value>

View File

@ -16,14 +16,6 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
@ -41,14 +33,8 @@
// Массив - Результат прогона наборов тестов, структура набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ВыполнитьГруппуНаборовТестов(Знач Наборы, Знач ТестовыйМодуль) Экспорт
Возврат ЮТИсполнитель.ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль);
Возврат ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль);
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -191,12 +191,13 @@
//
// Возвращаемое значение:
// Произвольный - Созданный объект или ссылка на него
Функция Записать(ВернутьОбъект = Ложь) Экспорт
Функция Записать(ВернутьОбъект = Ложь, ОбменДаннымиЗагрузка = Ложь) Экспорт
Контекст = Контекст();
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.ОбменДаннымиЗагрузка = ОбменДаннымиЗагрузка;
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);

View File

@ -52,7 +52,7 @@
// Возвращает значение вложенного контекста, вложенного реквизита контекста
// Параметры:
// ИмяРеквизита - Строка - Имя реквизита/вложенного контекста
//
// ПолучитьССервера - Булево - Получить значение из серверного контекста
// Возвращаемое значение:
// Структура, Неопределено - Значение реквизита/вложенного контекста
Функция ЗначениеКонтекста(ИмяРеквизита, ПолучитьССервера = Ложь) Экспорт
@ -69,6 +69,7 @@
Объект = Объект[Ключи[Инд]];
КонецЦикла;
//@skip-check constructor-function-return-section
Возврат ЮТОбщий.ЗначениеСтруктуры(Объект, Ключи[Ключи.ВГраница()]);
КонецФункции
@ -105,10 +106,11 @@
// Данные живут в рамках одного теста, но доступны в обработчиках событий `ПередКаждымТестом` и `ПослеКаждогоТеста`
// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеКаждогоТеста`
// Возвращаемое значение:
// Структура - Контекст теста
// Неопределено - Если метод вызывается за рамками теста
// - Структура - Контекст теста
// - Неопределено - Если метод вызывается за рамками теста
Функция КонтекстТеста() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаТеста());
КонецФункции
@ -123,10 +125,11 @@
// + `ПослеКаждогоТеста`
// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеКаждогоТеста`
// Возвращаемое значение:
// Структура - Контекст набора тестов
// Неопределено - Если метод вызывается за рамками тестового набора
// - Структура - Контекст набора тестов
// - Неопределено - Если метод вызывается за рамками тестового набора
Функция КонтекстНабора() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаНабораТестов());
КонецФункции
@ -137,10 +140,11 @@
// Доступны в каждом тесте модуля и в обработчиках событий
// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеВсехТестов`
// Возвращаемое значение:
// Структура - Контекст тестового модуля
// Неопределено - Если метод вызывается за рамками тестового модуля
// - Структура - Контекст тестового модуля
// - Неопределено - Если метод вызывается за рамками тестового модуля
Функция КонтекстМодуля() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаМодуля());
КонецФункции
@ -162,9 +166,10 @@
// Возвращает служебный контекст, содержит дополнительные детали ошибки теста
//
// Возвращаемое значение:
// Неопределено, Структура - Контекст ошибки, см. ЮТРегистрацияОшибок.НовыйКонтекстОшибки
// Неопределено, Структура - Контекст ошибки, см. ЮТФабрика.ОписаниеКонтекстаОшибки
Функция КонтекстОшибки() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаОшибки());
КонецФункции
@ -175,6 +180,7 @@
// Неопределено, Структура - Контекст проверки
Функция КонтекстПроверки() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаУтверждений());
КонецФункции
@ -185,6 +191,7 @@
// Неопределено, Структура - Контекст проверки
Функция КонтекстЧитателя() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаЧитателя());
КонецФункции
@ -192,9 +199,10 @@
// КонтекстЧитателя
// Возвращает служебный контекста, данные используемые исполнителем тестов
// Возвращаемое значение:
// см. ЮТИсполнитель.ДанныеКонтекстаИсполнения
// см. ЮТФабрика.НовыйКонтекстИсполнения
Функция КонтекстИсполнения() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаИсполнения());
КонецФункции

View File

@ -158,7 +158,7 @@
// Обработка события "ПослеФормированияИсполняемыхНаборовТестов"
// Параметры:
// КоллекцияКатегорийНаборов - Массив из см. ЮТИсполнитель.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
// КоллекцияКатегорийНаборов - Массив из см. ЮТФабрика.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
Процедура ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов) Экспорт
Количество = 0;

View File

@ -0,0 +1,50 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 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="a3405948-b02e-4e4b-8195-dd51bf07a4c4">
<name>ЮТНастройкиВыполнения</name>
<synonym>
<key>ru</key>
<value>Параметры</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -516,7 +516,6 @@
КонецПроцедуры
// КоллекцияВСоответствие
// Возвращает соответствие элементов переданной коллекции, в качестве ключей выступают значения указанного поля элементов коллекции.
//
// Параметры:
@ -525,7 +524,7 @@
// ИмяПоляЗначения - Строка - если указан, значениями результата будут не элементы, а значения соответствующих полей элементов коллекции.
// Возвращаемое значение:
// Соответствие Из Произвольный - полученное соответствие.
Функция КоллекцияВСоответствие(Коллекция, ИмяПоляКлюча, ИмяПоляЗначения = Неопределено) Экспорт
Функция ВСоответствие(Коллекция, ИмяПоляКлюча, ИмяПоляЗначения = Неопределено) Экспорт
Результат = Новый Соответствие();
@ -541,6 +540,120 @@
КонецФункции
// Возвращает структуру элементов переданной коллекции, в качестве ключей выступают значения указанного поля элементов коллекции.
//
// Параметры:
// Коллекция - Произвольный - значение, для которого определен итератор, и возможно обращение к полям элементов через квадратные скобки.
// ИмяПоляКлюча - Строка - имя поля элемента коллекции, которое будет ключом соответствия.
// ИмяПоляЗначения - Строка - если указан, значениями результата будут не элементы, а значения соответствующих полей элементов коллекции.
// Возвращаемое значение:
// Структура Из Произвольный - полученная структура.
Функция ВСтруктуру(Коллекция, ИмяПоляКлюча, ИмяПоляЗначения = Неопределено) Экспорт
Результат = Новый Структура();
Для Каждого ЭлементКоллекции Из Коллекция Цикл
Значение = ?(ИмяПоляЗначения = Неопределено, ЭлементКоллекции, ЭлементКоллекции[ИмяПоляЗначения]);
Результат.Вставить(ЭлементКоллекции[ИмяПоляКлюча], Значение);
КонецЦикла;
Возврат Результат;
КонецФункции
// Сравнивает данные сложной структуры с учетом вложенности.
//
// Параметры:
// Данные1 - Структура
// - ФиксированнаяСтруктура
// - Соответствие из Произвольный
// - ФиксированноеСоответствие из Произвольный
// - Массив из Произвольный
// - ФиксированныйМассив из Произвольный
// - Строка
// - Число
// - Булево - сравниваемые данные.
// Данные2 - Произвольный - те же типы, что и для параметра Данные1.
//
// Возвращаемое значение:
// Булево - Истина, если совпадают.
//
Функция ДанныеСовпадают(Данные1, Данные2) Экспорт
ТипЗначенияДанные1 = ТипЗнч(Данные1);
Если ТипЗначенияДанные1 <> ТипЗнч(Данные2) Тогда
Возврат Ложь;
КонецЕсли;
Если ТипЗначенияДанные1 = Тип("Структура")
ИЛИ ТипЗначенияДанные1 = Тип("ФиксированнаяСтруктура") Тогда
Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого КлючИЗначение Из Данные1 Цикл
СтароеЗначение = Неопределено;
Если НЕ Данные2.Свойство(КлючИЗначение.Ключ, СтароеЗначение)
ИЛИ НЕ ДанныеСовпадают(КлючИЗначение.Значение, СтароеЗначение) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
ИначеЕсли ТипЗначенияДанные1 = Тип("Соответствие")
ИЛИ ТипЗначенияДанные1 = Тип("ФиксированноеСоответствие") Тогда
Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
КлючиНовогоСоответствия = Новый Соответствие;
Для Каждого КлючИЗначение Из Данные1 Цикл
КлючиНовогоСоответствия.Вставить(КлючИЗначение.Ключ, Истина);
СтароеЗначение = Данные2.Получить(КлючИЗначение.Ключ);
Если НЕ ДанныеСовпадают(КлючИЗначение.Значение, СтароеЗначение) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Для Каждого КлючИЗначение Из Данные2 Цикл
Если КлючиНовогоСоответствия[КлючИЗначение.Ключ] = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
ИначеЕсли ТипЗначенияДанные1 = Тип("Массив")
ИЛИ ТипЗначенияДанные1 = Тип("ФиксированныйМассив") Тогда
Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Для Индекс = 0 По Данные1.ВГраница() Цикл
Если НЕ ДанныеСовпадают(Данные1[Индекс], Данные2[Индекс]) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецЕсли;
Возврат Данные1 = Данные2;
КонецФункции
#КонецОбласти
#Область ЧтениеДанных
@ -646,8 +759,8 @@
// Булево - Это каталог
Функция ЭтоКаталог(ПутьКФайлу) Экспорт
Файл = Новый Файл(ПутьКФайлу);
Возврат Файл.Существует() И Файл.ЭтоКаталог();
ВызовУстаревшегоМетода("ЮТОбщий.ЭтоКаталог", "ЮТФайлы.ЭтоКаталог");
Возврат ЮТФайлы.Существует(ПутьКФайлу) И ЮТФайлы.ЭтоКаталог(ПутьКФайлу);
КонецФункции

View File

@ -20,86 +20,94 @@
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#Область СлужебныйПрограммныйИнтерфейс
// СформироватьОтчет
// Формирует отчет о результатах тестирования по заданным параметрам
// Параметры:
// РезультатВыполнения - Массив - Коллекция результатов выполнения, каждый элемент - структура, см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// ПараметрыЗапуска - Структура - Параметры запуска, см. ЮТФабрика.ПараметрыЗапуска
Процедура СформироватьОтчет(РезультатВыполнения, ПараметрыЗапуска) Экспорт
// Обработчик - ОписаниеОповещения
Процедура СформироватьОтчет(РезультатВыполнения, ПараметрыЗапуска, Обработчик) Экспорт
Модули = ЮТРасширения.ГенераторыОтчетов();
МодульОтчета = Неопределено;
Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.reportPath) Тогда
ВызватьИсключение "Не указан путь сохранения отчета";
КонецЕсли;
Для Каждого Модуль Из Модули Цикл
Если Модуль.РеализуетФормат(ПараметрыЗапуска.reportFormat) Тогда
МодульОтчета = Модуль;
Прервать;
КонецЕсли;
КонецЦикла;
МодульОтчета = МодульФормирования(ПараметрыЗапуска.reportFormat);
Если МодульОтчета = Неопределено Тогда
ВызватьИсключение СтрШаблон("Отчет в формате %1 не поддерживается", ПараметрыЗапуска.reportFormat);
КонецЕсли;
ИмяФайлаОтчета = ИмяФайлаОтчета(Модуль, ПараметрыЗапуска);
ДанныеОтчета = Модуль.ДанныеОтчета(РезультатВыполнения);
ПараметрыФормирования = Новый Структура("РезультатВыполнения, ПараметрыЗапуска, Обработчик", РезультатВыполнения, ПараметрыЗапуска, Обработчик);
ПараметрыФормирования.Вставить("МодульОтчета", МодульОтчета);
Если ДанныеОтчета = Неопределено Тогда
ВызватьИсключение "Не удалось получить данные отчета";
ИначеЕсли НЕ ЗначениеЗаполнено(ИмяФайлаОтчета) Тогда
ВызватьИсключение "Не удалось сформировать имя файла отчета";
Иначе
ДанныеОтчета.Записать(ИмяФайлаОтчета);
КонецЕсли;
ОбработчикПолученияИмениФайла = Новый ОписаниеОповещения("ПослеФормированияИмениФайла", ЭтотОбъект, ПараметрыФормирования);
ИмяФайлаОтчета(ПараметрыФормирования, ОбработчикПолученияИмениФайла);
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ИмяФайлаОтчета(Модуль, ПараметрыЗапуска)
Процедура ИмяФайлаОтчета(ПараметрыФормирования, Обработчик)
ИмяФайла = Неопределено;
ПараметрыПроверки = Новый Структура("ПараметрыФормирования, Обработчик", ПараметрыФормирования, Обработчик);
ПутьКОтчету = ПараметрыЗапуска.reportPath;
ОбработчикПроверки = Новый ОписаниеОповещения("ПослеПроверкиКаталога", ЭтотОбъект, ПараметрыПроверки);
ЮТФайлы.ЭтоКаталог(ПараметрыФормирования.ПараметрыЗапуска.reportPath, ОбработчикПроверки);
Если НЕ ЗначениеЗаполнено(ПутьКОтчету) Тогда
ВызватьИсключение "Не указан путь сохранения отчета";
КонецПроцедуры
Функция МодульФормирования(Формат)
Модули = ЮТРасширения.ГенераторыОтчетов();
МодульОтчета = Неопределено;
Для Каждого Модуль Из Модули Цикл
Если Модуль.РеализуетФормат(Формат) Тогда
МодульОтчета = Модуль;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат МодульОтчета;
КонецФункции
Процедура ПослеФормированияИмениФайла(ИмяФайлаОтчета, Параметры) Экспорт
ДанныеОтчета = Параметры.МодульОтчета.ДанныеОтчета(Параметры.РезультатВыполнения);
Если ДанныеОтчета = Неопределено Тогда
ВызватьИсключение "Не удалось получить данные отчета";
Иначе
ДанныеОтчета.Записать(ИмяФайлаОтчета);
КонецЕсли;
Если ЮТОбщий.ЭтоКаталог(ПутьКОтчету) Тогда
ИмяФайла = ЮТОбщий.ОбъединитьПути(ПутьКОтчету, Модуль.ИмяФайлаПоУмолчанию());
ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик);
КонецПроцедуры
Процедура ПослеПроверкиКаталога(ЭтоКаталог, Параметры) Экспорт
ПутьКОтчету = Параметры.ПараметрыФормирования.ПараметрыЗапуска.reportPath;
Если ЭтоКаталог Тогда
ИмяФайла = ЮТОбщий.ОбъединитьПути(ПутьКОтчету, Параметры.ПараметрыФормирования.МодульОтчета.ИмяФайлаПоУмолчанию());
Иначе
ИмяФайла = ПутьКОтчету;
КонецЕсли;
Возврат ИмяФайла;
ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик, ИмяФайла);
КонецФункции
КонецПроцедуры
#КонецОбласти

View File

@ -16,24 +16,21 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#Область СлужебныйПрограммныйИнтерфейс
// ПараметрыЗапуска
// Возвращает загруженные параметры запуска тестирования
// Параметры:
// ПараметрыЗапускаСтрокой - Строка - Параметры запуска приложения
// Обработчик - ОписаниеОповещения
//
// Возвращаемое значение:
// см. ЮТФабрика.ПараметрыЗапуска
Функция ПараметрыЗапуска(Знач ПараметрыЗапускаСтрокой) Экспорт
Функция ПараметрыЗапуска(Знач ПараметрыЗапускаСтрокой, Обработчик) Экспорт
Попытка
Параметры = ПрочитатьПараметрыЗапуска(ПараметрыЗапускаСтрокой);
Параметры = ПрочитатьПараметрыЗапуска(ПараметрыЗапускаСтрокой, Обработчик);
Исключение
@ -54,55 +51,25 @@
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Функция ЗначениеНастройкиТеста(ИмяНастройки, ОписаниеТеста, ОписаниеТестовогоНабора, ЗначениеПоУмолчанию) Экспорт
Значение = ЗначениеПоУмолчанию;
Если ОписаниеТеста.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = ОписаниеТеста.НастройкиВыполнения[ИмяНастройки];
ИначеЕсли ОписаниеТестовогоНабора.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = ОписаниеТестовогоНабора.НастройкиВыполнения[ИмяНастройки];
Иначе
ГлобальныеНастройки = ЮТКонтекст.ГлобальныеНастройкиВыполнения();
Если ГлобальныеНастройки.Свойство(ИмяНастройки) Тогда
Значение = ГлобальныеНастройки[ИмяНастройки];
КонецЕсли;
КонецЕсли;
Возврат Значение;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
// ПрочитатьПараметрыЗапуска
// Читает параметры из строки запуска
// Параметры:
// ПараметрыЗапускаСтрокой - Строка - Строка с параметрами запуска.
// Содержит ключ запуска и строку с конфигурационным файлом.
// Формат строки "RunUnitTests=/путь/к/конфигурационному/файлу", где ключ указывается обязательно, а путь - по желанию
// Содержит ключ запуска и строку с конфигурационным файлом.
// Формат строки "RunUnitTests=/путь/к/конфигурационному/файлу",
// где ключ указывается обязательно, а путь - по желанию
// Обработчик - ОписаниеОповещения
//
// Возвращаемое значение:
// см. ЮТФабрика.ПараметрыЗапуска
Функция ПрочитатьПараметрыЗапуска(Знач ПараметрыЗапускаСтрокой)
Функция ПрочитатьПараметрыЗапуска(Знач ПараметрыЗапускаСтрокой, Обработчик)
Параметры = ЮТФабрика.ПараметрыЗапуска();
Если Не ЗначениеЗаполнено(ПараметрыЗапускаСтрокой) Тогда
ЮТИсполнительКлиент.ВызватьОбработчик(Обработчик, Параметры);
Возврат Параметры;
КонецЕсли;
@ -139,11 +106,12 @@
Если ЗначениеЗаполнено(КонфигурационныйФайл) Тогда
ПараметрыИзФайла = ПрочитатьКонфигурационныйФайл(КонфигурационныйФайл);
ДополнитьПараметрыПрочитанными(Параметры, ПараметрыИзФайла);
КонецЕсли;
ЮТИсполнительКлиент.ВызватьОбработчик(Обработчик, Параметры);
Возврат Параметры;
КонецФункции

View File

@ -1,12 +1,11 @@
<?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>
<name>ЮТПараметрыЗапуска</name>
<synonym>
<key>ru</key>
<value>Параметры</value>
</synonym>
<comment>Используется для обработки и дополнения параметров запуска тестов</comment>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -186,7 +186,7 @@
// Обработка события "ПослеФормированияИсполняемыхНаборовТестов"
// Параметры:
// КоллекцияКатегорийНаборов - Массив из см. ЮТИсполнитель.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
// КоллекцияКатегорийНаборов - Массив из см. ЮТФабрика.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
Процедура ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов) Экспорт
Параметры = ЮТОбщий.ЗначениеВМассиве(КоллекцияКатегорийНаборов);
@ -271,7 +271,7 @@
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции;
Возврат ЮТПараметры.ЗначениеНастройкиТеста(ИмяПараметра, ОписаниеСобытия.Тест, ОписаниеСобытия.Набор, Ложь);
Возврат ЮТНастройкиВыполнения.ЗначениеНастройкиТеста(ИмяПараметра, ОписаниеСобытия.Тест, ОписаниеСобытия.Набор, Ложь);
КонецФункции

View File

@ -369,7 +369,30 @@
КонецФункции
// Удаляет переданные объекта
//
// Параметры:
// Ссылки - Массив из ЛюбаяСсылка
Процедура Удалить(Ссылки) Экспорт
ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки);
КонецПроцедуры
#Если Сервер Тогда
// Возвращает мок для HTTPСервисЗапрос.
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция HTTPСервисЗапрос() Экспорт
Возврат Обработки.ЮТHTTPСервисЗапрос.Создать();
КонецФункции
#КонецЕсли
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////

View File

@ -143,6 +143,20 @@
КонецФункции
Процедура Удалить(Знач Ссылки) Экспорт
Если ТипЗнч(Ссылки) <> Тип("Массив") Тогда
Ссылки = ЮТОбщий.ЗначениеВМассиве(Ссылки);
КонецЕсли;
Для Каждого Ссылка Из Ссылки Цикл
Ссылка.ПолучитьОбъект().Удалить();
КонецЦикла;
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы

View File

@ -82,7 +82,14 @@
// СтатусыИсполненияТеста
// Возвращает перечисление возможных статусов выполнения теста, жизненный цикл теста
// Возвращаемое значение:
// ФиксированнаяСтруктура - Статусы исполнения теста
// ФиксированнаяСтруктура - Статусы исполнения теста:
// * Ожидание- Строка - Тест не выполнялся
// * Исполнение- Строка - Тест выполняется в данный момент
// * Успешно- Строка - Тест успешно пройден
// * Ошибка- Строка - Тест упал с ошибкой выполнения
// * Сломан- Строка - Тест упал на проверках утверждений
// * Пропущен- Строка - Тест пропущен по каким либо причинам
// * НеРеализован- Строка - Тест не реализован
Функция СтатусыИсполненияТеста() Экспорт
Статусы = Новый Структура();
@ -102,7 +109,7 @@
// Типы ошибок.
//
// Возвращаемое значение:
// ФиксированнаяСтруктура
// ФиксированнаяСтруктура - Типы возможных ошибок:
// * ТестНеРеализован - Строка
// * ОшибкаСравнения - Строка
// * ОшибкаОбработкиСобытия - Строка
@ -121,6 +128,7 @@
Типы.Вставить(ТипОшибки.Ключ, ТипОшибки.Ключ);
КонецЦикла;
//@skip-check constructor-function-return-section
Возврат Новый ФиксированнаяСтруктура(Типы);
КонецФункции
@ -131,20 +139,23 @@
ЮТПовторногоИспользования.ПараметрыТиповОшибок();
КонецЕсли;
Возврат ЮТТестовыеДанные.СтруктураMarkDown("Ключ",
"| Ключ | Представление | Статус |
||--------------------------------|----------------------------------|--------------|
|| ТестНеРеализован | Не реализован | НеРеализован |
|| ОшибкаСравнения | Ошибка сравнения | Ошибка |
|| ОшибкаОбработкиСобытия | Ошибка обработки события | Сломан |
|| Утверждений | Ошибка утверждений | Ошибка |
|| Исполнения | Ошибка исполнения | Сломан |
|| ЧтенияТестов | Загрузки тестов | Сломан |
|| МалоПараметров | Мало фактических параметров | Сломан |
|| МногоПараметров | Много фактических параметров | Сломан |
|| НекорректныйКонтекстИсполнения | Некорректный контекст исполнения | Пропущен |
|| Пропущен | Пропущен | Пропущен |
|");
Статусы = СтатусыИсполненияТеста();
Реквизиты = "Ключ, Представление, Статус";
ТипыОшибок = Новый Массив();
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ТестНеРеализован", "Не реализован", Статусы.НеРеализован));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ТестНеРеализован", "Не реализован", Статусы.НеРеализован));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ОшибкаСравнения", "Ошибка сравнения", Статусы.Ошибка));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ОшибкаОбработкиСобытия", "Ошибка обработки события", Статусы.Сломан));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "Утверждений", "Ошибка утверждений", Статусы.Ошибка));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "Исполнения", "Ошибка исполнения", Статусы.Сломан));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ЧтенияТестов", "Загрузки тестов", Статусы.Сломан));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "МалоПараметров", "Мало фактических параметров", Статусы.Сломан));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "МногоПараметров", "Много фактических параметров", Статусы.Сломан));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "НекорректныйКонтекстИсполнения", "Некорректный контекст исполнения", Статусы.Пропущен));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "Пропущен", "Пропущен", Статусы.Пропущен));
Возврат ЮТОбщий.ВСтруктуру(ТипыОшибок, "Ключ");
КонецФункции
@ -346,6 +357,8 @@
// * reportFormat - Строка - Формат отчета о тестировании.
// Модули реализующие различные форматы отчетов собраны в подсистеме ЮТФормированиеОтчета
// * logging - см. ПараметрыЛогирования
// * showReport - Булево - Признак необходмости отобразить отчет в 1с по окончании тестирования
// * exitCode - Строка - Путь к файлу, в который будет записан коды выхода
Функция ПараметрыЗапуска() Экспорт
Параметры = Новый Структура;
@ -359,6 +372,7 @@
Параметры.Вставить("reportFormat", "jUnit");
Параметры.Вставить("showReport", Ложь);
Параметры.Вставить("logging", ПараметрыЛогирования());
Параметры.Вставить("exitCode", "");
Возврат Параметры;
@ -489,6 +503,48 @@
КонецФункции
// Описание категория набора тестов.
//
// Параметры:
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Структура - Описание категория набора тестов:
// * ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
// * Клиентские - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Серверные - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Пропущенные - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ОписаниеКатегорияНабораТестов(ТестовыйМодуль) Экспорт
КатегорииНаборов = Новый Структура();
КатегорииНаборов.Вставить("ТестовыйМодуль", ТестовыйМодуль);
КатегорииНаборов.Вставить("Клиентские", Новый Массив());
КатегорииНаборов.Вставить("Серверные", Новый Массив());
КатегорииНаборов.Вставить("Пропущенные", Новый Массив());
//@skip-check constructor-function-return-section
Возврат КатегорииНаборов;
КонецФункции
#КонецОбласти
#Область КонструкторыКонтекстов
// Данные контекста исполнения.
//
// Возвращаемое значение:
// Структура - Данные контекста исполнения:
// * Уровень - Строка
Функция НовыйКонтекстИсполнения() Экспорт
Контекст = Новый Структура();
Контекст.Вставить("Уровень", "");
Возврат Контекст;
КонецФункции
#КонецОбласти
// КонтекстыМодуля

View File

@ -0,0 +1,75 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 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="2874e686-3785-4050-994a-bf457fa32700">
<name>ЮТФайлы</name>
<synonym>
<key>ru</key>
<value>Файлы</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -73,8 +73,8 @@
ЮТТесты.ПередЧтениемСценариевМодуля(ОписаниеМодуля);
ПолноеИмяМетода = ОписаниеМодуля.Имя + ".ИсполняемыеСценарии";
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ЮТОбщий.ЗначениеВМассиве(Неопределено));
ПолноеИмяМетода = ОписаниеМодуля.Имя + "." + ИмяМетодаСценариев();
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода);
Если Ошибка <> Неопределено Тогда
@ -84,12 +84,13 @@
Если ТипОшибки = ТипыОшибок.ТестНеРеализован Тогда
ЭтоТестовыйМодуль = Ложь;
Ошибка = Неопределено;
ИначеЕсли ТипОшибки = ТипыОшибок.МногоПараметров Тогда
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода);
ИначеЕсли ТипОшибки = ТипыОшибок.МалоПараметров Тогда
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ЮТОбщий.ЗначениеВМассиве(Неопределено));
ЮТОбщий.СообщитьПользователю("Используется устаревшая сигнатура метода `ИсполняемыеСценарии`, метод не должен принимать параметров.");
КонецЕсли;
КонецЕсли;
Если Ошибка <> Неопределено Тогда
Данные = Новый Массив(); // Фиксируем, чтобы отобразить в отчете

View File

@ -39,7 +39,8 @@
<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>
@ -52,12 +53,13 @@
<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>
@ -68,8 +70,10 @@
<commonModules>CommonModule.ЮТТесты</commonModules>
<commonModules>CommonModule.ЮТУтверждения</commonModules>
<commonModules>CommonModule.ЮТФабрика</commonModules>
<commonModules>CommonModule.ЮТФайлы</commonModules>
<commonModules>CommonModule.ЮТФильтрация</commonModules>
<commonModules>CommonModule.ЮТЧитатель</commonModules>
<commonModules>CommonModule.ЮТЧитательСервер</commonModules>
<dataProcessors>DataProcessor.ЮТHTTPСервисЗапрос</dataProcessors>
<dataProcessors>DataProcessor.ЮТЮнитТесты</dataProcessors>
</mdclass:Configuration>

View File

@ -35,7 +35,7 @@
&После("ПриНачалеРаботыСистемы")
Процедура ЮТПриНачалеРаботыСистемы()
ЮТИсполнитель.ВыполнитьМодульноеТестирование();
ЮТИсполнительКлиент.ВыполнитьМодульноеТестирование();
КонецПроцедуры

View File

@ -35,7 +35,7 @@
&После("ПриНачалеРаботыСистемы")
Процедура ЮТПриНачалеРаботыСистемы()
ЮТИсполнитель.ВыполнитьМодульноеТестирование();
ЮТИсполнительКлиентСервер.ВыполнитьМодульноеТестирование();
КонецПроцедуры

View File

@ -0,0 +1,252 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 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.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Если Сервер Тогда
#Область ОписаниеПеременных
//@skip-check object-module-export-variable
Перем HTTPМетод Экспорт;
//@skip-check object-module-export-variable
Перем БазовыйURL Экспорт;
//@skip-check object-module-export-variable
Перем Заголовки Экспорт;
//@skip-check object-module-export-variable
Перем ОтносительныйURL Экспорт;
//@skip-check object-module-export-variable
Перем ПараметрыURL Экспорт;
//@skip-check object-module-export-variable
Перем ПараметрыЗапроса Экспорт;
Перем Тело;
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Возвращает тело как двоичные данные.
//
// Возвращаемое значение:
// ДвоичныеДанные - Тело
Функция ПолучитьТелоКакДвоичныеДанные() Экспорт
ТипТела = ТипЗнч(Тело);
Если Тело = Неопределено Тогда
Возврат ПолучитьДвоичныеДанныеИзBase64Строки("");
ИначеЕсли ТипТела = Тип("ДвоичныеДанные") Тогда
Возврат Тело;
ИначеЕсли ТипТела = Тип("Строка") Тогда
Возврат ПолучитьДвоичныеДанныеИзСтроки(Тело);
КонецЕсли;
КонецФункции
// Возвращает тело как поток.
//
// Возвращаемое значение:
// Поток - Тело
Функция ПолучитьТелоКакПоток() Экспорт
Возврат ПолучитьТелоКакДвоичныеДанные().ОткрытьПотокДляЧтения();
КонецФункции
// Возвращает тело как строку.
//
// Параметры:
// Кодировка - КодировкаТекста, Строка - Кодировка
//
// Возвращаемое значение:
// Строка - Тело
Функция ПолучитьТелоКакСтроку(Кодировка = Неопределено) Экспорт
ТипТела = ТипЗнч(Тело);
Если Тело = Неопределено Тогда
Возврат "";
ИначеЕсли ТипТела = Тип("ДвоичныеДанные") Тогда
Возврат ПолучитьСтрокуИзДвоичныхДанных(Тело, Кодировка);
ИначеЕсли ТипТела = Тип("Строка") Тогда
Возврат Тело;
КонецЕсли;
КонецФункции
// Устанавливает тело как двоичные данные.
// При получении тела в другом формате происходит конвертация
//
// Параметры:
// Данные - ДвоичныеДанные
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция УстановитьТелоКакДвоичныеДанные(Данные) Экспорт
Тело = Данные;
Возврат ЭтотОбъект;
КонецФункции
// Устанавливает тело как строку.
// При получении тела в другом формате происходит конвертация
//
// Параметры:
// Строка - Строка
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция УстановитьТелоКакСтроку(Строка) Экспорт
Тело = Строка;
Возврат ЭтотОбъект;
КонецФункции
// Устанавливает тело как строку JSON.
// Сериализует переданный объект в строку JSON и сохраняет в тело
// При получении тела в другом формате происходит конвертация
//
// Параметры:
// Данные - Произвольный
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция УстановитьТелоКакСтрокуJSON(Данные) Экспорт
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
Тело = ЗаписьJSON.Закрыть();
Возврат ЭтотОбъект;
КонецФункции
// Добавляет заголовок.
//
// Параметры:
// ИмяЗаголовка - Строка
// Значение - Строка
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция ДобавитьЗаголовок(ИмяЗаголовка, Значение) Экспорт
Заголовки.Вставить(ИмяЗаголовка, Значение);
Возврат ЭтотОбъект;
КонецФункции
// Добавляет параметр запроса.
//
// Параметры:
// ИмяПараметра - Строка
// Значение - Строка
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция ДобавитьПараметрЗапроса(ИмяПараметра, Значение) Экспорт
ПараметрыЗапроса.Вставить(ИмяПараметра, Значение);
Возврат ЭтотОбъект;
КонецФункции
// Добавляет параметр URL.
//
// Параметры:
// ИмяПараметра - Строка
// Значение - Строка
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция ДобавитьПараметрURL(ИмяПараметра, Значение) Экспорт
ПараметрыURL.Вставить(ИмяПараметра, Значение);
Возврат ЭтотОбъект;
КонецФункции
// Устанавливает HTTP метод
//
// Параметры:
// Значение - Строка - Имя http метода
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция Метод(Значение) Экспорт
HTTPМетод = Значение;
Возврат ЭтотОбъект;
КонецФункции
// Устанавливает базовый URL.
//
// Параметры:
// Значение - Строка - базовый URL
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция БазовыйURL(Значение) Экспорт
БазовыйURL = Значение;
Возврат ЭтотОбъект;
КонецФункции
// Устанавливает относительный URL.
//
// Параметры:
// Значение - Строка - относительный URL
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция ОтносительныйURL(Значение) Экспорт
ОтносительныйURL = Значение;
Возврат ЭтотОбъект;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура Инициализировать()
HTTPМетод = "GET";
БазовыйURL = "";
Заголовки = Новый Соответствие();
ОтносительныйURL = "";
ПараметрыURL = Новый Соответствие();
ПараметрыЗапроса = Новый Соответствие();
КонецПроцедуры
#КонецОбласти
#Область Инициализация
Инициализировать();
#КонецОбласти
#КонецЕсли

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="81c2b3c4-8e40-4811-aab0-e7a1371d0c51">
<producedTypes>
<objectType typeId="5b53c341-183f-4aa0-b3ec-1f355d0f74f5" valueTypeId="26dcab52-beab-4c30-aa64-02887735d56e"/>
<managerType typeId="d0cecbc4-c89f-4ef2-ab8d-10bcfd8c514c" valueTypeId="50afe94b-4ccb-4a26-9a80-01121c6fef66"/>
</producedTypes>
<name>ЮТHTTPСервисЗапрос</name>
<synonym>
<key>ru</key>
<value>Мок для HTTPСервис запрос</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
</mdclass:DataProcessor>

View File

@ -457,20 +457,185 @@
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:CheckBoxFieldExtInfo"/>
</items>
<items xsi:type="form:FormField">
<name>ВыводЛога</name>
<id>66</id>
<items xsi:type="form:FormGroup">
<name>ГруппаФайлы</name>
<id>75</id>
<items xsi:type="form:FormField">
<name>ИмяФайлаОтчета</name>
<id>81</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>ИмяФайлаОтчета</segments>
</dataPath>
<extendedTooltip>
<name>ИмяФайлаОтчетаРасширеннаяПодсказка</name>
<id>83</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ИмяФайлаОтчетаКонтекстноеМеню</name>
<id>82</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>InputField</type>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:InputFieldExtInfo">
<handlers>
<event>StartChoice</event>
<name>ИмяФайлаОтчетаНачалоВыбора</name>
</handlers>
<autoMaxHeight>true</autoMaxHeight>
<wrap>true</wrap>
<choiceButton>true</choiceButton>
<clearButton>true</clearButton>
<chooseType>true</chooseType>
<typeDomainEnabled>true</typeDomainEnabled>
<textEdit>true</textEdit>
</extInfo>
</items>
<items xsi:type="form:FormField">
<name>ВыводЛога</name>
<id>66</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>ИмяФайлаЛога</segments>
</dataPath>
<extendedTooltip>
<name>ВыводЛогаРасширеннаяПодсказка</name>
<id>68</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ВыводЛогаКонтекстноеМеню</name>
<id>67</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>InputField</type>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:InputFieldExtInfo">
<handlers>
<event>StartChoice</event>
<name>ВыводЛогаНачалоВыбора</name>
</handlers>
<wrap>true</wrap>
<choiceButton>true</choiceButton>
<clearButton>true</clearButton>
<chooseType>true</chooseType>
<typeDomainEnabled>true</typeDomainEnabled>
<textEdit>true</textEdit>
</extInfo>
</items>
<items xsi:type="form:FormField">
<name>ИмяФайлаКодаВозврата</name>
<id>72</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>ИмяФайлаКодаВозврата</segments>
</dataPath>
<extendedTooltip>
<name>ИмяФайлаКодаВозвратаРасширеннаяПодсказка</name>
<id>74</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ИмяФайлаКодаВозвратаКонтекстноеМеню</name>
<id>73</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>InputField</type>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:InputFieldExtInfo">
<handlers>
<event>StartChoice</event>
<name>ИмяФайлаКодаВозвратаНачалоВыбора</name>
</handlers>
<autoMaxHeight>true</autoMaxHeight>
<wrap>true</wrap>
<choiceButton>true</choiceButton>
<clearButton>true</clearButton>
<chooseType>true</chooseType>
<typeDomainEnabled>true</typeDomainEnabled>
<textEdit>true</textEdit>
</extInfo>
</items>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>ИмяФайлаЛога</segments>
</dataPath>
<title>
<key>ru</key>
<value>Вывод в файл</value>
</title>
<extendedTooltip>
<name>ВыводЛогаРасширеннаяПодсказка</name>
<id>68</id>
<name>ГруппаФайлыРасширеннаяПодсказка</name>
<id>76</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
@ -483,33 +648,15 @@
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ВыводЛогаКонтекстноеМеню</name>
<id>67</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>InputField</type>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:InputFieldExtInfo">
<handlers>
<event>StartChoice</event>
<name>ВыводЛогаНачалоВыбора</name>
</handlers>
<wrap>true</wrap>
<choiceButton>true</choiceButton>
<clearButton>true</clearButton>
<openButton>true</openButton>
<chooseType>true</chooseType>
<typeDomainEnabled>true</typeDomainEnabled>
<textEdit>true</textEdit>
<type>UsualGroup</type>
<extInfo xsi:type="form:UsualGroupExtInfo">
<group>Vertical</group>
<representation>NormalSeparation</representation>
<showLeftMargin>true</showLeftMargin>
<united>true</united>
<showTitle>true</showTitle>
<throughAlign>Auto</throughAlign>
<currentRowUse>DontUse</currentRowUse>
</extInfo>
</items>
<items xsi:type="form:FormField">
@ -926,7 +1073,7 @@
<name>ИмяФайлаЛога</name>
<title>
<key>ru</key>
<value>Вывод отладочных сообщений в файл</value>
<value>Отладочные сообщения</value>
</title>
<id>61</id>
<valueType>
@ -963,6 +1110,48 @@
<segments>ОтобразитьОтчет</segments>
</settingsSavedData>
</attributes>
<attributes>
<name>ИмяФайлаКодаВозврата</name>
<title>
<key>ru</key>
<value>Код возврата</value>
</title>
<id>64</id>
<valueType>
<types>String</types>
<stringQualifiers/>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
<settingsSavedData xsi:type="form:DataPath">
<segments>ИмяФайлаКодаВозврата</segments>
</settingsSavedData>
</attributes>
<attributes>
<name>ИмяФайлаОтчета</name>
<title>
<key>ru</key>
<value>Отчет</value>
</title>
<id>65</id>
<valueType>
<types>String</types>
<stringQualifiers/>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
<settingsSavedData xsi:type="form:DataPath">
<segments>ИмяФайлаОтчета</segments>
</settingsSavedData>
</attributes>
<formCommands>
<name>УстановитьФлажки</name>
<title>

View File

@ -64,6 +64,20 @@
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаКодаВозвратаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ВыбратьФайл("All files(*.*)|*.*", ИмяФайлаЛога, Новый ОписаниеОповещения("УстановитьИмяФайлаКодаВозврата", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаОтчетаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ВыбратьФайл("jUnit(*.xml)|*.xml|All files(*.*)|*.*", ИмяФайлаЛога, Новый ОписаниеОповещения("УстановитьИмяФайлаОтчета", ЭтотОбъект));
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоТестов
@ -290,7 +304,7 @@
&НаКлиенте
Процедура ОбновитьСтрокуЗапуска()
ПараметрыЗапускаЮнитТестов = СтрШаблон("%1=%2", ЮТПараметры.КлючЗапуска(), ФайлКонфигурации);
ПараметрыЗапускаЮнитТестов = СтрШаблон("%1=%2", ЮТПараметрыЗапуска.КлючЗапуска(), ФайлКонфигурации);
Если ЗапускИзКонфигуратор Тогда
@ -359,6 +373,24 @@
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИмяФайлаКодаВозврата(ВыбранныйФайл, ДополнительныеПараметры) Экспорт
Если ВыбранныйФайл <> Неопределено Тогда
ИмяФайлаКодаВозврата = ВыбранныйФайл;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИмяФайлаОтчета(ВыбранныйФайл, ДополнительныеПараметры) Экспорт
Если ВыбранныйФайл <> Неопределено Тогда
ИмяФайлаОтчета = ВыбранныйФайл;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьФайл(Фильтр, ИмяФайла, Оповещение)
@ -389,13 +421,19 @@
ВызватьИсключение "Сохранение конфигурации из веб-клиента не поддерживается";
#Иначе
Конфигурация = ЮТФабрика.ПараметрыЗапуска();
Конфигурация.Удалить("ВыполнятьМодульноеТестирование");
Конфигурация.showReport = ОтобразитьОтчет;
Конфигурация.closeAfterTests = Истина;
Конфигурация.reportPath = ЮТОбщий.Каталог(ФайлКонфигурации);
Конфигурация.Удалить("ВыполнятьМодульноеТестирование");
Конфигурация.reportPath = ИмяФайлаОтчета;
Конфигурация.logging.enable = ЗначениеЗаполнено(ИмяФайлаЛога);
Конфигурация.logging.file = ИмяФайлаЛога;
Если ЗначениеЗаполнено(ИмяФайлаКодаВозврата) Тогда
Конфигурация.exitCode = ИмяФайлаКодаВозврата;
КонецЕсли;
Если НЕ (УстановленФильтрПоРасширению(Конфигурация) ИЛИ УстановленФильтрПоМодулям(Конфигурация)) Тогда
УстановитьФильтрПоТестам(Конфигурация);
КонецЕсли;

View File

@ -11,26 +11,32 @@
<content>CommonModule.МокитоПроверки</content>
<content>CommonModule.МокитоСлужебный</content>
<content>CommonModule.ЮТест</content>
<content>CommonModule.ЮТИсполнитель</content>
<content>CommonModule.ЮТИсполнительКлиентСервер</content>
<content>CommonModule.ЮТИсполнительСервер</content>
<content>CommonModule.ЮТКонструкторВариантов</content>
<content>CommonModule.ЮТКонструкторТестовыхДанных</content>
<content>CommonModule.ЮТКонтекст</content>
<content>CommonModule.ЮТКонтекстКлиент</content>
<content>CommonModule.ЮТКонтекстСервер</content>
<content>CommonModule.ЮТКонтекстТеста</content>
<content>CommonModule.ЮТЛогирование</content>
<content>CommonModule.ЮТЛогированиеВызовСервера</content>
<content>CommonModule.ЮТМетаданные</content>
<content>CommonModule.ЮТМетаданныеПовтИсп</content>
<content>CommonModule.ЮТМетаданныеСервер</content>
<content>CommonModule.ЮТОбщий</content>
<content>CommonModule.ЮТОбщийВызовСервера</content>
<content>CommonModule.ЮТОтчет</content>
<content>CommonModule.ЮТОтчетJSON</content>
<content>CommonModule.ЮТОтчетJUnit</content>
<content>CommonModule.ЮТПараметры</content>
<content>CommonModule.ЮТПараметрыЗапуска</content>
<content>CommonModule.ЮТПовторногоИспользования</content>
<content>CommonModule.ЮТРасширения</content>
<content>CommonModule.ЮТРегистрацияОшибок</content>
<content>CommonModule.ЮТСобытия</content>
<content>CommonModule.ЮТТестовыеДанные</content>
<content>CommonModule.ЮТТестовыеДанныеВызовСервера</content>
<content>CommonModule.ЮТТестовыеДанныеСлужебный</content>
<content>CommonModule.ЮТТесты</content>
<content>CommonModule.ЮТУтверждения</content>
<content>CommonModule.ЮТФабрика</content>
@ -43,5 +49,7 @@
<content>CommonPicture.ЮТУпал</content>
<content>CommonPicture.ЮТУспешно</content>
<content>CommonPicture.ЮТЭлементыТестов</content>
<content>DataProcessor.ЮТHTTPСервисЗапрос</content>
<content>DataProcessor.ЮТЮнитТесты</content>
<content>CommonTemplate.ЮТОписаниеМетаданных</content>
</mdclass:Subsystem>

15
sonar-project.properties Normal file
View File

@ -0,0 +1,15 @@
# must be unique in a given SonarQube instance
sonar.projectKey=yaxunit
# this is the name displayed in the SonarQube UI
sonar.projectName=YAxUnit
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set.
# If not set, SonarQube starts looking for source code from the directory containing
# the sonar-project.properties file.
sonar.sources=./
sonar.inclusions=**/*.bsl, **/*.os
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
sonar.bsl.languageserver.configurationPath=.bsl-language-server.json

View File

@ -31,3 +31,19 @@
КонецЕсли;
КонецФункции
&Вместо("Методы")
Функция Расш1_Методы() Экспорт
ПараметрыМетода = Новый Массив;
ПрерватьВыполнение = Ложь;
Результат = Мокито.АнализВызова(Интеграция, "Методы", ПараметрыМетода, ПрерватьВыполнение);
Если НЕ ПрерватьВыполнение Тогда
Возврат ПродолжитьВызов();
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции

View File

@ -22,7 +22,9 @@
ЮТТесты
.ДобавитьТест("Обучение")
.ДобавитьТест("Обучение_ЦепочкаВызовов")
.ДобавитьТест("Проверить")
.ДобавитьТест("Прогон_НакоплениеСтатистики").СПараметрами(Истина).СПараметрами(Ложь)
.ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов")
;
@ -62,6 +64,24 @@
КонецПроцедуры
Процедура Обучение_ЦепочкаВызовов() Экспорт
Адрес = "service.com";
Мокито.Обучение(Интеграция)
.Когда("ВыполнитьЗапрос").Вернуть(0)
.Когда(Интеграция.ВыполнитьЗапрос(Адрес)).Вернуть(1)
.Когда(Интеграция.ВыполнитьЗапрос(Адрес)).Вернуть(2)
.Когда(Интеграция.ВыполнитьЗапрос(Адрес)).Вернуть(3)
.Прогон();
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(Адрес), "Вызов 1").Равно(1);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(Адрес), "Вызов 2").Равно(2);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(Адрес), "Вызов 3").Равно(3);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(Адрес), "Вызов 4").Равно(3);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос("Адрес"), "Вызов 5").Равно(0);
КонецПроцедуры
Процедура Проверить() Экспорт
ЛюбойПараметр = Мокито.ЛюбойПараметр();
@ -87,6 +107,17 @@
.КоличествоВызовов(Интеграция.ВыполнитьЗапрос(Мокито.ТипизированныйПараметр(Тип("Строка")), ЛюбойПараметр)).Равно(2)
;
ВызовыМетода = Мокито.Проверить(Интеграция).Вызовы("ВыполнитьЗапрос");
ЮТест.ОжидаетЧто(ВызовыМетода, "Вызовы метода ВыполнитьЗапрос")
.ИмеетТип("Массив")
.ИмеетДлину(3)
.КаждыйЭлементСодержитСвойствоСоЗначением("Объект", Интеграция)
.КаждыйЭлементСодержитСвойствоСоЗначением("ИмяМетода", "ВыполнитьЗапрос")
.КаждыйЭлементСодержитСвойство("Параметры")
.Свойство("[0].Параметры[0]").Равно("Адрес")
.Свойство("[1].Параметры[0]").Равно(Адрес)
.Свойство("[2].Параметры[1]").Равно(2);
КонецПроцедуры
#Если Сервер Тогда
@ -165,6 +196,40 @@
КонецПроцедуры
#КонецЕсли
Процедура Прогон_НакоплениеСтатистики(НакоплениеСтатистики) Экспорт
Описание = ?(НакоплениеСтатистики, "Накопление статистики", "Сброс статистки");
Адрес = "service.com";
Мокито.Обучение(Интеграция)
.Когда("ВыполнитьЗапрос").Вернуть(1)
.Наблюдать("Методы")
.Прогон();
Интеграция.ВыполнитьЗапрос(Адрес);
Интеграция.Методы();
Мокито.Проверить(Интеграция)
.КоличествоВызовов("ВыполнитьЗапрос").Равно(1)
.КоличествоВызовов("Методы").Равно(1);
Мокито.Прогон(НЕ НакоплениеСтатистики);
Интеграция.ВыполнитьЗапрос(Адрес);
Интеграция.Методы();
Если НакоплениеСтатистики Тогда
Мокито.Проверить(Интеграция)
.КоличествоВызовов("ВыполнитьЗапрос").Равно(2)
.КоличествоВызовов("Методы").Равно(2);
Иначе
Мокито.Проверить(Интеграция)
.КоличествоВызовов("ВыполнитьЗапрос").Равно(1)
.КоличествоВызовов("Методы").Равно(1);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -16,13 +16,9 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ТестыAPI
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("ВыброситьИсключение")
@ -30,10 +26,6 @@
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура ВыброситьИсключение() Экспорт
Адрес = "service.com";
@ -54,7 +46,3 @@
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -16,10 +16,6 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
@ -28,6 +24,7 @@
.ДобавитьТест("ДобавитьСтроку")
.ДобавитьТест("ОбъединитьВСтруктуру")
.ДобавитьТест("СформироватьСтрокуСимволов")
.ДобавитьТест("ДанныеСовпадают")
;
КонецПроцедуры
@ -146,4 +143,35 @@
КонецФункции
Процедура ДанныеСовпадают() Экспорт
Массив = ЮТОбщий.ЗначениеВМассиве(1, 2, "3");
Структура = Новый Структура("Строка, Число, Массив", "1", 1, Массив);
Соответствие = Новый Соответствие();
Соответствие.Вставить("Строка", "1");
Соответствие.Вставить(2, "Число");
Соответствие.Вставить("Массив", Массив);
Варианты = ЮТест.Варианты("Значение")
.Добавить(Массив)
.Добавить(Структура)
.Добавить(Соответствие)
.Добавить(Новый ФиксированныйМассив(Массив))
.Добавить(Новый ФиксированнаяСтруктура(Структура))
.Добавить(Новый ФиксированноеСоответствие(Соответствие))
.СписокВариантов();
Для Каждого Вариант Из Варианты Цикл
Описание = Строка(ТипЗнч(Вариант.Значение));
ЮТест.ОжидаетЧто(
ЮТОбщий.ДанныеСовпадают(Вариант.Значение, Вариант.Значение),
Описание)
.ЭтоИстина();
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -16,53 +16,30 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Набор тестов для общего модуля СтроковыеФункцииКлиентСервер
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
/////////////////////////////////////////////////////////////////////////////////
// Набор стандартных методов тестового модуля
/////////////////////////////////////////////////////////////////////////////////
#Область ТестыAPI
// ИсполняемыеСценарии
// Сервисный метод для получения списка тестовых методов
// Параметры:
// ДополнительныеПараметры - Структура - Дополнительные параметры, используемые при формировании списка тестов
// Возвращаемое значение:
// Массив - Имена методов тестов
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
Процедура ИсполняемыеСценарии() Экспорт
Возврат; // TODO Реанимировать после реализации проброса доп параметров
// Добавление теста в тестовый набор по умолчанию с указанием представления теста
ЮТТесты.ДобавитьТест("ТестовыйМетод3", "Тестовый метод 3");
// Добавление теста для клиента в тестовый набор по умолчанию
ЮТТесты.ТестКлиент("ТестовыйМетод4");
// Добавление теста для клиента в тестовый набор по умолчанию
ЮТТесты.ТестСервер("ТестовыйМетод4");
ЮТТесты.ТестовыйНабор("ТестовыйНабор")
.ДобавитьТест("ТестовыйМетод")
.ДобавитьТест("ТестовыйМетод2")
.ДобавитьТест("ТестовыйМетод5", , "Тег1");
// Создание тестового набора со списком тегов
ЮТТесты.ТестовыйНабор("Тестовый набор 2", "Тег1, Тег2")
// Добавление теста в созданный тестовый набор с указанием тегов, которые будут объединены с тегами набора
.ДобавитьТест("ТестовыйМетод6", , "Тег5, Тег6");
ЮТТесты
// Добавление теста в тестовый набор по умолчанию с указанием представления теста
.ДобавитьТест("ТестовыйМетод3", "Тестовый метод 3")
// Добавление теста для клиента в тестовый набор по умолчанию
.ДобавитьКлиентскийТест("ТестовыйМетод4")
// Добавление теста для клиента в тестовый набор по умолчанию
.ДобавитьСерверныйТест("ТестовыйМетод4")
.ДобавитьТестовыйНабор("ТестовыйНабор")
.ДобавитьТест("ТестовыйМетод")
.ДобавитьТест("ТестовыйМетод2")
.ДобавитьТест("ТестовыйМетод5", , "Тег1")
// Создание тестового набора со списком тегов
.ДобавитьТестовыйНабор("Тестовый набор 2", "Тег1, Тег2")
// Добавление теста в созданный тестовый набор с указанием тегов, которые будут объединены с тегами набора
.ДобавитьТест("ТестовыйМетод6", , "Тег5, Тег6");
ВызватьИсключение "Ошибка загрузки сценариев";
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Реализация тестов
/////////////////////////////////////////////////////////////////////////////////
#Область Тесты
#КонецОбласти

View File

@ -16,10 +16,6 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
@ -33,10 +29,10 @@
Процедура ЗаполнитьСправочник() Экспорт
#Если Сервер Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта(Справочники.Товары);
#Иначе
#Если Клиент Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары");
#Иначе
Конструктор = ЮТест.Данные().КонструкторОбъекта(Справочники.Товары);
#КонецЕсли
Конструктор
@ -53,7 +49,7 @@
.Свойство("Вид").Заполнено();
Ссылка = Конструктор.Записать();
#Если Сервер Тогда
#Если НЕ Клиент Тогда
ЮТест.ОжидаетЧто(Ссылка, "Созданный объект")
.Заполнено()
.ИмеетТип("СправочникСсылка.Товары")
@ -67,10 +63,10 @@
Процедура ЗаполнитьДокумент() Экспорт
#Если Сервер Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
#Иначе
#Если Клиент Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара");
#Иначе
Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
#КонецЕсли
Ссылка = Конструктор
@ -91,7 +87,7 @@
.Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество)
.Провести();
#Если Сервер Тогда
#Если НЕ Клиент Тогда
ЮТест.ОжидаетЧто(Ссылка, "Созданный объект")
.Заполнено()
.ИмеетТип("ДокументСсылка.ПриходТовара")
@ -114,7 +110,3 @@
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,59 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 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="87209e33-355d-4495-9c74-f774c7572055">
<name>ОМ_ЮТТестовыеДанные</name>
<synonym>
<key>ru</key>
<value>О м тестовые данные</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -16,10 +16,6 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
@ -40,7 +36,7 @@
.СПараметрами(Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыХарактеристик, СправочникСсылка.Банки, ПеречислениеСсылка.СостоянияЗаказов"))
.СПараметрами(Новый ОписаниеТипов("ВидДвиженияНакопления"))
;
КонецПроцедуры
Процедура Фикция(ОписаниеТипа) Экспорт
@ -55,6 +51,3 @@
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -16,13 +16,9 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("СПараметрами")

View File

@ -16,15 +16,8 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
#Область ТестыAPI
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
@ -77,10 +70,6 @@
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура Что() Экспорт
ЮТУтверждения.Что(1, "Проверяемый контекст");
@ -270,7 +259,7 @@
КонецПроцедуры
Процедура Метод() Экспорт
Процедура Метод() Экспорт
ЮТУтверждения.Что(ОМ_ЮТУтверждения, "Контекст метода")
.Метод("МетодБезИсключение");
@ -2020,8 +2009,6 @@
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ПроверитьОшибкуУтверждения(ИнформацияОбОшибке, ОжидаемоеОписание)

View File

@ -16,26 +16,18 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ТестыAPI
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("ЭтоПодходящееРасширение")
.ДобавитьТест("ЭтоПодходящийМодуль")
.ДобавитьТест("ОтфильтроватьТестовыеНаборы")
;
КонецПроцедуры
#КонецОбласти
#Область Тесты
Процедура ЭтоПодходящееРасширение() Экспорт
Варианты = Новый Массив();
@ -228,6 +220,3 @@
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -18,7 +18,7 @@
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("ИсполняемыеСценарииМодуля")
@ -93,7 +93,7 @@
Наборы = ЮТЧитатель.ЗагрузитьТесты(ПараметрыЗапуска);
ЮТест.ОжидаетЧто(Наборы, "Прочитанные наборы расширения tests")
.ИмеетДлину(11);
.ИмеетДлину(13);
КонецПроцедуры
@ -117,7 +117,7 @@
.Элемент(1).ИмеетТип("Структура")
.Элемент(2).ИмеетТип("Структура")
;
НаборПоУмолчанию = Сценарии[0];
НаборЭтоТестовыйМодуль = Сценарии[1];
НаборЗагрузкаТестов = Сценарии[2];
@ -157,7 +157,3 @@
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -16,13 +16,9 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("Пропустить")
@ -97,6 +93,3 @@
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,87 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 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.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("Конструктор")
.ДобавитьТест("УстановитьТело")
;
КонецПроцедуры
Процедура Конструктор() Экспорт
Запрос = ЮТест.Данные().HTTPСервисЗапрос()
.ДобавитьЗаголовок("Заголовок", "Заголовок")
.ДобавитьПараметрЗапроса("Параметр1", 1)
.ДобавитьПараметрURL("Параметр2", 2)
.Метод("GET");
ЮТест.ОжидаетЧто(Запрос)
.Свойство("HTTPМетод").Равно("GET")
.Свойство("Заголовки.Заголовок").Равно("Заголовок")
.Свойство("ПараметрыЗапроса.Параметр1").Равно(1)
.Свойство("ПараметрыURL.Параметр2").Равно(2);
КонецПроцедуры
Процедура УстановитьТело() Экспорт
Описание = "Тело не установлено";
Запрос = ЮТест.Данные().HTTPСервисЗапрос();
ЮТест.ОжидаетЧто(Запрос, Описание)
.Метод("ПолучитьТелоКакДвоичныеДанные").НеВыбрасываетИсключение()
.Метод("ПолучитьТелоКакПоток").НеВыбрасываетИсключение()
.Метод("ПолучитьТелоКакСтроку").НеВыбрасываетИсключение()
.Метод("ПолучитьТелоКакСтроку", ЮТОбщий.ЗначениеВМассиве(КодировкаТекста.UTF8)).НеВыбрасываетИсключение();
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакСтроку()).Равно("");
Тело = "Тело";
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Тело);
Описание = "Тело установлено из двоичных данных";
Запрос = ЮТест.Данные().HTTPСервисЗапрос()
.УстановитьТелоКакДвоичныеДанные(ДвоичныеДанные);
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакДвоичныеДанные(), Описание + ". Получение двоичных данных").Равно(ДвоичныеДанные);
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакСтроку(), Описание + ". Получение строки").Равно(Тело);
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакСтроку("UTF-8"), Описание + ". Получение строки UTF-8").Равно(Тело);
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакПоток(), Описание + ". Получение потока").ИмеетТип("Поток");
Описание = "Тело установлено из строки";
Запрос = ЮТест.Данные().HTTPСервисЗапрос()
.УстановитьТелоКакСтроку(Тело);
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакДвоичныеДанные(), Описание + ". Получение двоичных данных").Равно(ДвоичныеДанные);
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакСтроку(), Описание + ". Получение строки").Равно(Тело);
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакСтроку("UTF-8"), Описание + ". Получение строки UTF-8").Равно(Тело);
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакПоток(), Описание + ". Получение потока").ИмеетТип("Поток");
Описание = "Тело установлено из JSON";
Запрос = ЮТест.Данные().HTTPСервисЗапрос()
.УстановитьТелоКакСтрокуJSON(Новый Массив());
ЮТест.ОжидаетЧто(Запрос.ПолучитьТелоКакСтроку(), Описание + ". Получение строки").Равно("[]");
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2d597d20-67f3-47c7-96e0-c0e0241f0e9b">
<name>Обр_ЮТHTTPСервисЗапрос</name>
<synonym>
<key>ru</key>
<value>Обр HTTPСервис запрос</value>
</synonym>
<server>true</server>
</mdclass:CommonModule>

View File

@ -0,0 +1,37 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 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 ИЗ %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="88f72d9b-2cef-4ea0-882b-50bc299dfa4e">
<name>ПомощникТестированияВызовСервера</name>
<synonym>
<key>ru</key>
<value>Помощник тестирования вызов сервера</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -24,17 +24,20 @@
<languageCode>ru</languageCode>
</languages>
<commonModules>CommonModule.Интеграция</commonModules>
<commonModules>CommonModule.Обр_ЮТHTTPСервисЗапрос</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.ОМ_ЮТЧитатель</commonModules>
<commonModules>CommonModule.ПомощникТестированияВызовСервера</commonModules>
<catalogs>Catalog.Встречи</catalogs>
<catalogs>Catalog.Товары</catalogs>
<documents>Document.ПриходТовара</documents>