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

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С v8.3 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

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

2160 руб.

05.08.2024    1398    15    1    

9

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

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

1800 руб.

20.01.2022    7881    20    0    

14

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

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

2400 руб.

04.07.2022    8499    38    1    

29

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

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

28.11.2024    2111    user1999010    3    

16

Облачные сервисы, хостинг Linux Тестирование QA Сервера Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

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

31.10.2024    1427    capitan    0    

0

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

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

21.10.2024    3069    leemuar    8    

23

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

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

30.08.2024    1374    Scorpion4eg    6    

8

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

Иногда возникают ситуации, когда надо развернуть тестовую базу клиента / свою на серверах Windows или Linux. Тестовые базы могут понадобиться в разных ситуациях: у клиента ошибка, на нашей базе она не воспроизводится, реализуем новый функционал и хотелось бы протестировать на Linux и т.д. А теперь представим, что это все на потоке. Что тестовых баз 1С не одна, а 20-30. И получаем проблему, что непонятно, занята она сейчас кем-то или нет. Предлагаю вариант решения этой проблемы.

28.06.2024    1602    Diversus    12    

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