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

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 который в момент написания работал отлично и быстро, но в какой – то момент что-то произошло и метод стал выполняться долго, что было сразу обнаружено при прогонке тестов.

 

 

 

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

 

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

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

См. также

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

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

3600 руб.

05.08.2024    4327    22    1    

16

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

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

2400 руб.

04.07.2022    11456    44    1    

35

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

Запуск дымового тестирования не требует выделенной инфраструктуры, обучения и лишних затрат. Найти ошибки и улучшить качество разработки можно малыми силами, просто запустив готовые наборы тест-кейсов на своей локальной машине. Расскажем о преимуществах методики дымового тестирования и возможностях доработанного фреймворка Vanessa ADD.

12.11.2025    2849    arcius_7012    14    

24

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

Во время прошедшей в начале октября конференции INFOSTART TECH EVENT 2025 Инфостарт Лаборатория и Инфостарт Обучение проводили тестирование всех желающих на знание фреймворка Vanessa Automation. Хочу поделиться результатами этого мероприятия и подробно разобрать пятерку вопросов, которые оказались самыми сложными для участников сертификации.

05.11.2025    1616    kuntashov    7    

20

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

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

28.10.2025    803    Kirramone    0    

2

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

Тестирование – неотъемлемый этап разработки, и чтобы приносить ценность бизнесу быстрее, его имеет смысл оптимизировать. Расскажем о том, какие инструменты помогут в десятки раз ускорить прогон 7000 тестов и организовать многопоточность без потери качества.

30.09.2025    1392    kraynev-navi    0    

6

Тестирование QA 1С:Предприятие 8 Бесплатно (free)

Этот текст о том, без чего не обходится работа тестировщика. Статья будет полезна начинающим тестировщикам и всем, кто работает с 1С и хочет понять, как тестирование помогает ловить ошибки и делать систему удобнее.

01.09.2025    5164    Oksana_Makr    2    

16

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

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

29.08.2025    2371    Scorpion4eg    0    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ImHunter 341 04.10.24 10:40 Сейчас в теме
Вроде неплохо. Но почему листинги картинками?...
2. Sakharyuk_Ilya 61 04.10.24 11:15 Сейчас в теме
Да, это моя 2я статья, в следующей статье обязательно текстом выложу.
4. Viktor_Ermakov 393 07.10.24 10:16 Сейчас в теме
(2) Уважаемый автор, у тебя есть шанс уже в этой статье сделать "красиво"
Ее можно отредактировать, вставив листинги кода, и удалив картинки :-)
Жолтокнижниг; +1 Ответить
6. ImHunter 341 12.10.24 10:57 Сейчас в теме
(2) Так откорректируйте тек статью...
3. alex_sayan 68 06.10.24 04:48 Сейчас в теме
"Если" в тестовых методах считается антипаттерном. Наличие Если намекает, что тест имеет слишком много ответственности. Тестовые методы должны быть линейными
SirAlex; kpotoyalo; spyke; +3 Ответить
5. Sakharyuk_Ilya 61 10.10.24 04:10 Сейчас в теме
(3) Спасибо за обратную связь, учтем это, но даже при всем при этом тест отлично работает и приносит огромную пользу)
7. Жолтокнижниг 282 14.10.24 11:42 Сейчас в теме
(5) @Sakharyuk_Ilya есть несколько замечаний:
1. Изучите подробнее документацию, а именно схему нейминга модулей
2. Не следует тестовый метод начинать с "Тест_", то что это тесты и так понятно
3. При использовании текучих выражений (примеры создания данных через конструктор) очень важно правильное форматирование, отступы.
IvanTerentev; +1 Ответить
8. Sakharyuk_Ilya 61 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. Вывод: Необходимы тесты для тестов.
Для отправки сообщения требуется регистрация/авторизация