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

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

 

 

 

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

 

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

См. также

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

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

2160 руб.

20.01.2022    8754    30    0    

16

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

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

2400 руб.

04.07.2022    9246    40    1    

31

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

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

3000 руб.

05.08.2024    2163    17    1    

11

DevOps и автоматизация разработки Рефакторинг и качество кода Тестирование QA Программист Платформа 1С v8.3 Бесплатно (free)

Расскажу, почему осознанно не буду внедрять SonarQube в свой рабочий процесс несмотря на то, что инструмент очень понравился. Статей, как его внедрили и используют, много. А почему внедрили, попробовали и отказались, по-моему, еще не было.

12.03.2025    1142    ovetgana    23    

-4

Нейросети Рефакторинг и качество кода Тестирование QA Программист Платформа 1С v8.3 Бесплатно (free)

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

11.03.2025    4185    mrXoxot    50    

46

Рефакторинг и качество кода Тестирование QA Программист Платформа 1С v8.3 Бесплатно (free)

В последней статье по докладу Александра Кириллова, с которым он выступил на конференции INFOSTART TECH EVENT 2024, обсудим особенности тестирования после завершения рефакторинга платформеннозависимого кода

11.03.2025    471    it-expertise    0    

3

Тестирование QA Программист Платформа 1С v8.3 Бесплатно (free)

Внедрили мы, с моими девчонками, в тестовом режиме в конце прошлого года в свой рабочий процесс Сонар. Всем очень понравилось - оповещения об ошибках приходят, мы эти ошибки правим. Можно гордо на годовом собрании о достижениях отчитываться. А теперь, наконец-то, пришло время оценить результаты.

10.03.2025    1430    ovetgana    22    

1

Тестирование QA Программист Платформа 1С v8.3 1С:Документооборот Россия Абонемент ($m)

Обработка подготавливает тестовую базу для удобного тестирования и разработки.

1 стартмани

04.03.2025    366    0    FeDBuka    3    

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