TestIB8x - 0003 - Безопасный код - Option Explicit - первая реализация

16.01.08

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

Был момент, когда захотелось задвинуть этот тест подальше, т.к. в Платформе 8.х защита от небрежного кодирования проработана хорошо. Достаточно перестать использовать экспортные переменные уровня приложения, внешнего соединения и переменные уровня модуля. После этого можно "клепать" код, даже не вымыв перед этим руки и не промыв мозги Ж-).
Спасибо, комментариям на прошлое обсуждение и нескольким письмам на мыло - сподвигли на завершение начатого.
Тест получился большой - более 900 строк на JScript, но кое-какие моменты все-таки остались ...

Предисловие к описанию реализации

Тест входит в состав TestIB8x v. 1.0.1 (выложен на основном сайте brix8x.stavr.ru, сюда буду выкладывать более крупные версии) Также поднят баг-трекер (bts.stavr.ru), есть возможность оставить свои замечания и пожелания.

В ходе реализации возникла одна проблема, решить которую сам пока не могу.

Средствами платформы не получается получить полный список реквизитов формы!

Таким образом, при проверке события ПриОткрытии() формы элемента, например, нет возможности оценить код типа "формаДата = ТекущаяДата()" как корректный или нет, есть вероятность, что формаДата - реквизит формы элемента.

Можно, конечно, выдвинуть идею о том, что если реквизит есть, то он должен быть на форме, после чего, создав OLE соединение получить форму (ПолучитьФорму()) и проанализировать все ЭлементыФормы на значение свойства Элемент.Данные; Но уж очень это некрасиво.

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

Таким образом, я пока вижу один выход: Найти способ получать информацию о реквизитах форм из файла .cf.
На данный момент как это делается не знаю.
Никаких исходников в помощь нет. Желающих написать ActiveX наподобие старого доброго Rainbow тоже.
Буду рад любой помощи - ссылки на исходники, создание компоненты, другой способ получения реквизитов форм (есть ведь еще интерфейсные тесты).

А пока "ложные" срабатывания теста можно подавить, дополняя файл настроек теста.

0003 - Безопасный код – Option Explicit


Категория: Безопасный код
Название: Option Explicit
GUID: 5c11d53e-1dda-4ccb-9ce2-4ea01a9a142c
Версия: 2 от 15.01.08

Введение

Рассмотрим ситуацию с функцией, претендующей на роль универсальной, объявленной с ключевым параметром Экспорт, или еще нет, но тем не менее делающую нечто очень полезное.

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

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

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

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

Но вот код, указанный ниже потенциально небезопасен.

Пример:
Перем Ном;
Функция Универсальная() Экспорт

Ном = 1;

Возврат «»;

КонецФункции
Функция ИспользуетУниверсальную()

Перем Ном;

Ном = 6;
Сообщить(Ном); // Ном = 6

Рез =Универсальная();

Сообщить(Ном);
// Ном = 1, а ожидаем 6
Возврат «»;
КонецФункции

 

Возможно, так и задумано и переменная уровня модуля должна получить своё новое значение именно таким образом. Но с точки зрения сопровождения такая функция является функцией с «побочными» эффектами.

То же самое произойдет, если переменная Ном объявлена как экспортная в модуле приложения или внешнего соединения.

И это – плохой стиль программирования.

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

Реализация

1. Самый кардинальный метод 1 – полный отказ от использования переменных уровня приложения, внешнего соединения и модуля. В этом случае контролировать объявления локальных переменных нет необходимости, платформа нас защитит. Недостаток метода – функции из этой конфигурации могут приводить к ошибкам будучи перенесенными в другие, более лояльные конфигурации.
2. Кардинальный метод 2 – полный контроль за необходимостью объявления всех переменных, используемых в функции. Данный подход позволит получить действительно безопасный код, но требует большой внимательности даже для небольших по размеру функций.
3. В меру интеллектуальный метод – каждая функция проверяется на предмет наличия побочных присваиваний, но при этом присваивание значений переменным уровня приложения , модуля допустимы. Недостаток тот же, что и для первого метода – возможные проблемы при переносе функции в другие конфигурации.

Для каждой конфигурации может быть выбран любой из этих методов. Главное – документировать этот выбор и контролировать исполнение.

Особняком стоит объем проверяемых функций – Все или только экспортные, а также Проверять ли общие модули.

Выбор максималистов скорее всего Все, выбор минималистов – только экспортные, выбор пофигистов – тоже очевиден …

Тестирование

Объекты тестирования:
• Модуль приложения (AppModule)
• Модуль внешнего соединения (ComModule)
• Модуль сеанса [для 8.1] (SessionModule)
• Общие модули (CommonModules)
• Модули менеджера значений константы (ConstantModules)
• Модули объектов (ObjectModules)
• Модули форм (FormModules)
Параметры проверки объекта (список без учета специфики):
• Запрет экспортных переменных (disableExportVars)
• Запрет переменных модуля (disableModuleVars)
• Запрет необъявленных локальных переменных в локальных функциях (disableLocalVarsInExportFunc)
• Запрет необъявленных локальных переменных в экспортных функциях (disableLocalVarsInLocalFunc)

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

Т.к. COM-соединение позволяет получить список реквизитов объекта конфигурации, в модуле объекта мы можем определить присваивания реквизитам в контексте объекта.

Т.к. мы не имеем красивого способа получить список реквизитов формы, при тесте возможны «ложные» срабатывания на модуль формы в местах присваивания значений реквизитам формы.

Существует два решения данной проблемы:
1. Через конструкцию ЭтаФорма.Реквизит, тем более, что нам все равно нужно визуально отличать реквизиты форм от просто переменных.
2. Через занесение имени реквизита формы в файл исключений.

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

Шаг 1 Проверка каждого объекта проверки по четырем показателям


1. Проверить объявления экспортных переменных
2. Проверить объявления переменных уровня модуля
3. Проверить качество экспортных функций
4. Проверить качество локальных функций

Для пункта 4 и 5, в модуле объектов переменные в операциях присваивания проверяются дополнительно на наличие в списке реквизитов объекта метаданного.

См. также

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    1278    12    1    

7

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

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

2400 руб.

04.07.2022    8368    38    1    

29

Тестирование 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    7783    19    0    

13

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

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

31.10.2024    1308    capitan    0    

0

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

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

21.10.2024    2781    leemuar    8    

22

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

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

30.08.2024    1292    Scorpion4eg    6    

7

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

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

28.06.2024    1511    Diversus    12    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Cheshirscy 21.01.08 10:11 Сейчас в теме
На счет реквизитов формы.
Я выкручивался так. Посмотри что дает метод "ЗначениеВСтрокуВнутр" для объекта "форма", вот по этому тексту как раз можно понять какие реквизиты есть у формы, но правда текст долго анализируется, хотя.. может если его регулярными выражениями попытать....
2. brix8x 526 22.01.08 10:02 Сейчас в теме
Спасибо огромное! Этого вполне достаточно. Один минутс - нужно получать через OLE, через COM нельзя.
Но самое классное, что те же самые данные можно получать в будущем из .cf.
Поэтому пока оставлю .cf в покое и научусь парсить полученные данные Ж-)
3. native-api 11.07.24 14:17 Сейчас в теме
Форма БСП ФормаОтчета для получения списка предопределенных реквизитов (чтобы отличить их от динамически создаваемых для настроек отчета) в ПриСозданииНаСервере вызывает ПолучитьРеквизиты().

ФормаКлиентскогоПриложения (ClientApplicationForm)
ПолучитьРеквизиты (GetAttributes)
Синтаксис:
ПолучитьРеквизиты(<Путь>)
Параметры:
<Путь> (необязательный)
Тип: Строка.
Указывает путь к родительскому реквизиту. Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.
Возвращаемое значение:
Тип: Массив.
Массив объектов РеквизитФормы.
Описание:
Получает описание реквизитов формы.
Доступность:
Сервер, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Показать
Оставьте свое сообщение