Старт в юнит-тестах

25.10.24

Разработка - Тестирование QA

Юнит-тесты в 1С – это круто!

Юнит тестирование в 1С.

Модульное тестирование (или юнит-тестирование) — это процесс проверки отдельных модулей программного обеспечения на предмет их корректности.

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

Цель модульного тестирования — убедиться в том, что каждый модуль работает правильно и соответствует спецификациям. Этот метод позволяет выявить и исправить ошибки на ранних этапах разработки, что упрощает процесс отладки и обеспечивает более надёжное программное обеспечение.

 

Плюсы юнит-тестирования, которые я выявил:

  1. Можно легко и быстро проверить какую-либо процедуру или функцию
  2. При написании теста  часто бывает так, что такой похожий необходимый метод уже есть, и он покрыт тестом, остается только переиспользовать.
  3. Улучшается качество кода
  4. Часто ошибки в коде выявляются на этапе как раз юнит-тестирования до отправки на проверку тестировщику или заказчику
  5. Оперативное выявление ошибок
  6. Возможность тестировать бизнес логику
  7. Позволяет вести разработку через тестирование (TDD)

 

Коротко о TDD

TDD - разработка через тестирование, сначала пишет тесты, потом пишем код под эти тесты, после успешной прогонки тестов код считается готовым.

 

Некоторые замечания при работе по TDD:

  • Сложно, прям очень сложно перестроиться с привычного стиля программирования, но это возможно.
  • Получается быстро находить ошибки и исправлять их так как тест обычно пишется под небольшой кусочек кода.
  • Уверенность в качестве кода
  • Перед написанием кода сначала думаешь как лучше спроектировать то или иное решение, опять же чтобы и тестами было удобно покрыть и данные сгенерировать для теста.
  • Тесты позволяют создавать слабосвязанные методы, так как тест сложно наложить на сильно взаимосвязанные методы нам просто приходится их упрощать, делать обособленными.
  • Отладка, отладчик, точки останова и т. п. теперь не нужны.
  • Отсутствует дублирование кода

 

   YAxUnit

За YAxUnit спасибо Кирилкину Дмитрию, он нам открыл эту замечательную вещь.

YAxUnit представляет собой мощный инструмент написания тестов для решений на платформе 1С:Предприятие.

Подробнее можно почитать здесь: https://bia-technologies.github.io/yaxunit/

 

Что мы сделали

YAxUnit представляет собой расширение, поэтому мы создали для себя хранилище для расширения, чтобы можно было заниматься коллективным созданием тестов.

 

Простые правила при написании тестов:

  1. Называть общие модули «ОМ_» + Название метаданного


     
  2. Метод теста обзывать «Тест_» + имя метода в основной конфигурации

 

  1. Напротив покрытого теста ставить комментарий «Покрыто юнит-тестом»

 

  1. Код необходимо выносить либо в модуль менеджера либо в общие модули, можно, в том числе, и в клиентские

 

Примеры Тестов

Приведу 3 примера: простой и посложнее. И тест, который отрабатывает, но есть нюанс.

 

  1. Простой пример - есть потребность передать для обработки введенный пользователем путь к файлу без кавычек.

 

Пишем простенький тест на клиенте:

 Процедура ИсполняемыеСценарии() Экспорт
	 
	 ЮТТесты 
	 .ДобавитьКлиентскийТест("Тест_СократитьДвойныеКавычки"); 
	 
 КонецПроцедуры
 
 Процедура Тест_СократитьДвойныеКавычки() Экспорт
	 
	 СтрокаСКавычками = """СтрокаСКавычками""";	
	 СтрокаБезКавычек = АвтоматизацияКлиент.СократитьДвойныеКавычки(СтрокаСКавычками);
	 ЮТест.ОжидаетЧто(СтрНайти(СтрокаБезКавычек, """",) = 0);
	 ЮТест.ОжидаетЧто(СтрокаБезКавычек).ИмеетТип("Строка");
	 
 КонецПроцедуры

 

Пишем код:

Функция СократитьДвойныеКавычки(Знач Значение) Экспорт
	
	Пока СтрНачинаетсяС(Значение, """") Цикл
		Значение = Сред(Значение, 2); 
	КонецЦикла; 
	
	Пока СтрЗаканчиваетсяНа(Значение, """") Цикл
		Значение = Лев(Значение, СтрДлина(Значение) - 1);
	КонецЦикла;
	
	Возврат Значение;
	
КонецФункции

 

 

Запускаем тест:

 

 

 

Код и тест готовы.

 

Еще простой пример - необходимо проверить правильность перевода значений характеристик сторонним сервисом и работоспособность.

Процедура Тест_ПолучитьТелоПереводаСтрокиHTTP() Экспорт
	
	РегистрМенеджер = РегистрыСведений.СинонимыХарактеристикСопровождения;
	ЭталоноеТелоЗапроса = Новый Структура;
	МассивЯзыков = Новый Массив;
	МассивЯзыков.Добавить("en");//kk
	МассивЯзыков.Добавить("he");//en
	МассивЯзыков.Добавить("kk");//he
	ЭталоноеТелоЗапроса.Вставить("languages", МассивЯзыков);
	values = Новый Массив;
	
	ПереводимыеЗначения = Новый Структура;
	ПереводимыеЗначения.Вставить("type", "Цвет");
	ПереводимыеЗначения.Вставить("value", "");
	values.Добавить(ПереводимыеЗначения);
		
	ЭталоноеТелоЗапроса.Вставить("values", values);
	
	ЗащищенноеСоединение = новый ЗащищенноеСоединениеOpenSSL;
	Соединение = Новый HTTPСоединение("translate-api.dwh.dns-shop.ru",,,,, 30, ЗащищенноеСоединение);
	
	ТелоОтветаJSON = РегистрМенеджер.ПолучитьТелоПереводаСтрокиHTTP(ЭталоноеТелоЗапроса, Соединение);
	ЮТест.ОжидаетЧто(ТелоОтветаJSON).ИмеетТип("Строка", "HTTP сервис перестал работать");
	ПроверитьКорректностьПеревода(ТелоОтветаJSON);
	
КонецПроцедуры

 

Генерируем данные, запускаем тест и пишем процедуру проверки данных

Процедура ПроверитьКорректностьПеревода(ТелоОтветаJSON)
	
	ОбъектЧтениеJSON = Новый ЧтениеJSON;
	ОбъектЧтениеJSON.УстановитьСтроку(ТелоОтветаJSON);
	РезультатЧтения = ПрочитатьJSON(ОбъектЧтениеJSON, Истина);
	ОбъектЧтениеJSON.Закрыть();
	                                               
	Для Каждого МассивПоСтроке ИЗ РезультатЧтения Цикл
		
		Для Каждого СоответствиеЯзыкаПоСтроке ИЗ МассивПоСтроке Цикл
			
			value = СоответствиеЯзыкаПоСтроке.Получить("value");
			type = СоответствиеЯзыкаПоСтроке.Получить("type");
			language = СоответствиеЯзыкаПоСтроке.Получить("language");
			
			Если language = "ru" Тогда
				Продолжить;
			КонецЕсли;
			
			Если language = "en" Тогда
				ЮТУтверждения.Что(type, СтрШаблон("Значение 'Цвет' было переведенно как %1 на Английском", type))
				.ИмеетТип(Тип("Строка"))
				.Равно("Color");
			КонецЕсли;
			
			Если language = "kk" Тогда
				ЮТУтверждения.Что(type, СтрШаблон("Значение 'Цвет' было переведенно как %1 на Казахском", type))
				.ИмеетТип(Тип("Строка"))
				.Равно("Тw9;с");
			КонецЕсли;
			
			Если language = "he" Тогда
				ЮТУтверждения.Что(type, СтрШаблон("Значение 'Цвет' было переведенно как %1 на Иврите", type))
				.ИмеетТип(Тип("Строка"))
				.Равно("צבע");
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

 

 

Далее пишем не сложный метод и запускаем тест.

Метод работает верно.

 

  1. Пример посложнее - отчет рабочее пространство менеджера ВЭД, по кнопке "Сформировать" получаем данные для отчета, далее требуется применить фильтр по полю "Заявка на стикеровку" и на основании фильтра вывести обновленную результирующую таблицу.

Условие по ТЗ:

Нам нужна потребуется проформа, на основании проформы заявка на сопровождение, заявка на стикеровка с составом на основании проформы.

Сгенерируем данные, добавим их к текущей таблице с данными, запустим метод фильтрации данных, ждем на выходе необходимый результат.

 

Генерируем данные: 

Товар1 = ЮТест.Данные().СоздатьЭлемент(Справочники.Номенклатура,,, Новый Структура("ОбменДаннымиЗагрузка", Истина));
	Товар2 = ЮТест.Данные().СоздатьЭлемент(Справочники.Номенклатура,,, Новый Структура("ОбменДаннымиЗагрузка", Истина));
	
	Проформа = ЮТест.Данные().КонструкторОбъекта(Документы.Проформа)
	.Установить("Проведен", Истина)
	.ФикцияОбязательныхПолей()
	.ТабличнаяЧасть("Состав")
	.ДобавитьСтроку()
	.Установить("Товар", Товар1)
	.Фикция("Количество")
	.Фикция("Цена")
	.ДобавитьСтроку()
	.Установить("Товар", Товар2)
	.Фикция("Количество")
	.Фикция("Цена")
	.Записать(, Истина);
	
	ЗаявкаНаСопровождение = ЮТест.Данные().КонструкторОбъекта(Документы.ЗаявкаНасопровождение)
	.Установить("Проведен", Истина)
	.Установить("ДокументОснование", Проформа)
	.ФикцияОбязательныхПолей()
	.ТабличнаяЧасть("Состав")
	.ДобавитьСтроку()
	.Установить("Товар", Товар1)
	.Установить("ЗнСт", ЛОЖЬ)
	.ДобавитьСтроку()
	.Установить("Товар", Товар2)
	.Установить("ЗнСт", ЛОЖЬ)
	.Записать(, Истина);
	
	ЗаявкаНаСтикеровку= ЮТест.Данные().КонструкторОбъекта(Документы.ЗаявкаНаСтикеровку)
	.Установить("Проведен", Истина)
	.ФикцияОбязательныхПолей()
	.ТабличнаяЧасть("Состав")
	.ДобавитьСтроку()
	.Установить("Товар", Товар1)
	.Установить("ОснованиеКорневое", Проформа)
	.ДобавитьСтроку()
	.Установить("Товар", Товар2)
	.Установить("ОснованиеКорневое", Проформа)
	.Записать(, Истина);
	
	Таблица = Таблица.Таблица;	
	НоваяСтрока = Таблица.Добавить();
	НоваяСтрока.Проформа = Проформа;
	НоваяСтрока.Товар = Товар1;
	НоваяСтрока.Количество = 1;
	НоваяСтрока.ЗаявкаНаСопровождение = ЗаявкаНаСопровождение; 
	
	НоваяСтрока = Таблица.Добавить();
	НоваяСтрока.Проформа = Проформа;
	НоваяСтрока.Количество = 1;
	НоваяСтрока.Товар = Товар2;
	НоваяСтрока.ЗаявкаНаСопровождение = ЗаявкаНаСопровождение;
	
	сткДанные.Вставить("Таблица", Таблица);

 

Получаем таблицу с данными

  • Создаем товары
  • Создаем проформу, добавляем в состав товары
  • Создаем заявку на сопровождение, в основании указываем проформу, в состав реквизит ЗнСт выставляем в ложь и добавляем товары из проформы
  • Создаем заявку на стикеровку, в составе указываем товары и в корневое основание нашу проформу
  • Добавляем данные в таблицу и заполняем параметр для вызываемой функции
  • Указываем, какой отбор необходимо проверить
сткПараметры.Вставить("УсловиеЗнСт", "НЕ втДанные.ТребуетсяЗаявкаНаСтикеровкуУровеньЗнСп");//Проверяем этот отбор

 

  • Вызываем метод и ждем в итоговой таблице 2 строки с нашими данными

 

РезультирующуаяТаблица = Отчеты.РабочееПространствоМенеджераВЭД.ПолучитьДанныеСУчетомОтбора(сткПараметры); 
НайденныеСтроки = РезультирующуаяТаблица.НайтиСтроки(Новый Структура("ЗаявкаНаСопровождение, Проформа", ЗаявкаНаСопровождение, Проформа)); 
ЮТест.ОжидаетЧто(НайденныеСтроки.Количество() = 2);	

 

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

 

  1. Также есть тест для проверки обработки файла Excell который в момент написания работал отлично и быстро, но в какой – то момент что-то произошло и метод стал выполняться долго, что было сразу обнаружено при прогонке тестов.

 

 

 

В дальнейшем есть планы все это дело автоматизировать, а именно автоматическое обновление нашего клона, автоматический запуск тестов на клоне и отправка результатов в телеграмм.

 

Спасибо за внимание.

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Тестирование QA DevOps и автоматизация разработки Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Бухгалтерия предприятие 3.0 и версии КОРП: 3.0.190.11.

5368 руб.

20.01.2022    11611    48    1    

21

DevOps и автоматизация разработки Тестирование QA Программист Пользователь 1С:Предприятие 8 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Зарплата и Управление Персоналом 3 и версии КОРП: 3.1.35.48.

5000 руб.

05.08.2024    5875    36    1    

20

Тестирование QA DevOps и автоматизация разработки Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.22.145.

5000 руб.

04.07.2022    13793    50    6    

39

Тестирование QA Программист Бесплатно (free)

Переход на Linux и PostgreSQL – серьезный этап для любой компании. Нагрузочное тестирование помогает пройти его без критических сбоев: заранее выявить узкие места, оценить поведение системы под реальной нагрузкой и снизить риск откатов после запуска. В статье разберем, почему миграция с Microsoft SQL Server и Windows на новую инфраструктуру требует отдельной проверки производительности, какие сценарии стоит включать в тест, как настраивать контур и мониторинг, как оценивать результаты и сколько времени реально занимает такой проект.

29.04.2026    404    kulmaksim    0    

3

Тестирование QA Программист Бесплатно (free)

Рассказываем о практическом кейсе нагрузочного тестирования двух баз 1С, где интеграции не эмулировались, а работали по-настоящему – через обмен между базами и поток данных из Kafka. Приведем пример сценариев и параметров тестирования, которые использовались в проекте, и объясним, почему команда отказалась от генераторов данных. Разберем плюсы и минусы такого подхода и обсудим, какие риски и подводные камни могут возникнуть при тестировании в боевых интеграциях. Покажем ошибки и ограничения, с которыми столкнулась команда, и объясним, как их удалось обойти.

20.04.2026    390    dankrav4    0    

2

Тестирование QA Программист 1С 8.3 Абонемент ($m)

Внешняя обработка позволяет генерировать автотесты.

1 стартмани

16.04.2026    465    1    Triplexx    0    

3

Тестирование QA Программист Бесплатно (free)

Создание тестовых данных для юнит- и интеграционных тестов на больших учетных системах часто оказывается самым трудозатратным этапом. Статья посвящена тому, как снять эту боль на фреймворке yaxUnit. Разбираем подходы к работе с данными (от копий баз до генерации под каждый тест) и инструменты, которые упрощают жизнь разработчику: модули-помощники, генераторы кода, макеты, фикстуры и хранение данных в коде. Учимся выстраивать контролируемую среду, ускорять подготовку сценариев и при этом сохранять читаемость и версионируемость тестовых данных. Статья будет полезна тем, кто хочет наладить воспроизводимое и удобное тестирование сложной 1С-логики, не утопая каждый раз в ручной подготовке данных.

10.04.2026    804    batsy66    0    

7

Перенос данных 1C Тестирование QA Программист Бесплатно (free)

Ручное тестирование обменов между кастомизированными базами 1С остается одной из самых сложных и болезненных задач для команд разработки. На реальных проектах показываем типичные ошибки: от неправильной подготовки тестового контура и стерильной регистрации объектов до проверки только «золотых» сценариев и пропуска скрытых зависимостей. Разбираемся, к каким последствиям это приводит на продакшене и почему внимательность к деталям здесь критически важна. Объясняем принципы, которые помогают организовать ручное тестирование интеграций так, чтобы не тратить время на псевдоошибки и не ловить проблемы уже после запуска системы.

03.04.2026    839    romandredan    0    

7
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ImHunter 344 04.10.24 10:40 Сейчас в теме
Вроде неплохо. Но почему листинги картинками?...
2. Sakharyuk_Ilya 64 04.10.24 11:15 Сейчас в теме
Да, это моя 2я статья, в следующей статье обязательно текстом выложу.
4. Viktor_Ermakov 401 07.10.24 10:16 Сейчас в теме
(2) Уважаемый автор, у тебя есть шанс уже в этой статье сделать "красиво"
Ее можно отредактировать, вставив листинги кода, и удалив картинки :-)
Жолтокнижниг; +1 Ответить
6. ImHunter 344 12.10.24 10:57 Сейчас в теме
(2) Так откорректируйте тек статью...
3. alex_sayan 69 06.10.24 04:48 Сейчас в теме
"Если" в тестовых методах считается антипаттерном. Наличие Если намекает, что тест имеет слишком много ответственности. Тестовые методы должны быть линейными
SirAlex; kpotoyalo; spyke; +3 Ответить
5. Sakharyuk_Ilya 64 10.10.24 04:10 Сейчас в теме
(3) Спасибо за обратную связь, учтем это, но даже при всем при этом тест отлично работает и приносит огромную пользу)
7. Жолтокнижниг 310 14.10.24 11:42 Сейчас в теме
(5) @Sakharyuk_Ilya есть несколько замечаний:
1. Изучите подробнее документацию, а именно схему нейминга модулей
2. Не следует тестовый метод начинать с "Тест_", то что это тесты и так понятно
3. При использовании текучих выражений (примеры создания данных через конструктор) очень важно правильное форматирование, отступы.
IvanTerentev; +1 Ответить
8. Sakharyuk_Ilya 64 17.10.24 03:25 Сейчас в теме
(7) Спасибо за ОС, действительно)
9. chagbig 33 24.07.25 12:34 Сейчас в теме
(5)
Тест простого теста из примера 1 показал.

1. напомним содержимое теста.

Процедура Тест_СократитьДвойныеКавычки() Экспорт

СтрокаСКавычками = """СтрокаСКавычками""";
СтрокаБезКавычек = АвтоматизацияКлиент.СократитьДвойныеКавычки(СтрокаСКавычками);
ЮТест.ОжидаетЧто(СтрНайти(СтрокаБезКавычек, """",) = 0);
ЮТест.ОжидаетЧто(СтрокаБезКавычек).ИмеетТип("Строка");

КонецПроцедуры

2. Любая строка с любым количеством двойных кавычек валидна по результатам теста.
3. Не валидным результатом является только любое числовое значение.
4. В качестве фикса теста можно сделать так:

4.1 Заменить строку
ЮТест.ОжидаетЧто(СтрНайти(СтрокаБезКавычек, """",) = 0);
4.2 На строку
ЮТест.ОжидаетЧто(СтрНайти(СтрокаБезКавычек, """",) = 0).Равно(Истина);

5. Вывод: Необходимы тесты для тестов.
Для отправки сообщения требуется регистрация/авторизация