Переключение на Главную Страницу Страницы: [1] 2 3 4 ОтправитьПечать
Очень популярная тема (более 25 ответов) Тестирование разработок на платформе 1С. Управление данными (число прочтений - 13638 )
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Тестирование разработок на платформе 1С. Управление данными
07. Мая 2010 :: 06:31
Печать  
Всем привет!
Поскольку, на форуме нет раздела по тестированию, пока напишу здесь.
Предлагаю обсудить вопрос, который, по крайней мере, для меня, является, пожалуй, основным сдерживающим фактором в применении тестирования. Причем, тестирования любого вида.

Проблема достаточно многогранна, и сформулировать ее с первого раза мне, вряд ли, удастся. Но, тем не менее, с чего-то начнем.
Вобщем, суть проблемы. Для выполнения теста необходимо выполнить фазу, известную как setup, которая заключается в создании значительного количества различных данных в тестовой БД. В основном, это - создание элементов в куче справочников и заполнение кучи регистров начальными данными. Понятно, что есть тесты где этого не требуется, но речь не о таких случаях. И эта фаза меня сильно напрягает своей сложностью - всегда приходится морщить лоб, вспоминая какие виды данных нужно сгенерить, затем копипастить и редактировать кучу вызовов генераторв данных. Вобщем, эта фаза - наиболее трудоемкая при разработке теста.
При этом, специфика платформы 1С накладывает существенные ограничения на  использование существующих методик - они рассчитаны на "взрослые" языки программирования. Надо заметить, я ориентируюсь на 8, но и для 7.7 это не менее справедливо.

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

Это вкратце, для затравки. Если есть интерес к сабжу, если есть возражения или предложения, прошу отметиться в ветке. Флейм и оффтоп приветствуются тоже.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #1 - 07. Мая 2010 :: 06:48
Печать  
Ага, меня подобная проблема также сильно нагружает Печаль

По восьмерке это можно решить с помощью универсальной
выгрузки в ХМЛ-файл с использованием выгрузки по ссылкам.
Правда, есть вопрос переноса данных, несвязанных с выгружаемыми данными - например, константы, регистры, какие-нибудь настройки пользователя и т.п.
Т.е. здесь минимум 2 проблемы:
1. проблема подбора всех необходимых данных
2. возможные большие объемы выгружаемых данных, т.е. возможная крайне медленная выгрузка/загрузка данных. Соответственно, быстро подобные тесты не проверишь, что ограничивает их полезность Печаль

ЗЫ Федор, кстати, сделал для SnowTest спец.код по выгрузке/загрузке подобных тестовых данных в пустую базу на базе штатной  обработке 1С по ХМЛ-выгрузке/загрузке.
Правда, пока не релизит, и держит в секрете Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #2 - 07. Мая 2010 :: 07:21
Печать  
artbear
Обнадеживает, что проблема актуальна Улыбка

Насчет хранения в хмл. Сначала, я тоже пошел по этому пути. Были сделаны средства выгрузки/загрузки, оптимизирована скорость и т.п. Вобщем, чисто технических проблем, при этом, не было. Существенная сложность, из-за которой пришлось отказаться от этого подхода, оказалась в поддержке выгруженных данных. При изменении метаданных, сериализованные данные становятся невалидными. Была сделана эталонная база с тестовыми данными, в которую загружалась измененная конфига. В ней можно было, скажем, заполнить добавленные реквизиты, и снова выгрузить в хмл. Но тут еще проблема с взаимоисключающими данными. Например, различные значения константы. Ну и вопрос как ссылаться на загруженные данные? Хардкодить в тесте гуиды элементов справочников? Короче говоря, я не нашел эффективного способа поддерживать их в актуальном состоянии.

Пока что, я вижу единственный приемлемый способ создания данных - создавать их программно.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #3 - 07. Мая 2010 :: 10:05
Печать  
А если юзать обмен данными через Конвертацию данных?
тогда мы практически не зависим от изменения метаданных.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #4 - 07. Мая 2010 :: 10:18
Печать  
Палыч писал(а) 07. Мая 2010 :: 07:21:
artbear
Сначала, я тоже пошел по этому пути. Были сделаны средства выгрузки/загрузки, оптимизирована скорость и т.п. Вобщем, чисто технических проблем, при этом, не было. Существенная сложность, из-за которой пришлось отказаться от этого подхода, оказалась в поддержке выгруженных данных. При изменении метаданных, сериализованные данные становятся невалидными.


я сейчас (да и уже как месяца 4) тоже озадачен этой проблемой:

на ум помимо сериализации XML приходило :
1. храниться тестовые данные в формате YAML (fixtures)
2. хранить тестовые данные в виде 1С кода их создающего  

в любом случае необходимы либо:

1. реализация YAML для 1С и процедуры создания тестовых данных на основе YAML представления
2. генератор кода для создания объекта

вот такие вот бредовые пока идеи
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #5 - 07. Мая 2010 :: 12:40
Печать  
Пробовал три способа. Опишу по мере их придумки.

1. Хранить данные в тестовой БД. Самый первый способ, который использовался Фанктестом. Хреново тем, что тесты теряют независимость. И проблема даже не в разных значениях констант, а например такое было: добавляешь в спраовчник нового контрагента - ломается тест отчета о продажах, выводящий данные о всех контрагентах из справочника.

2. Создавать данные программно. Способ геморройный, приходится много времени потратить на создание кода, создающего базовые объекты, и простейшие конструкции из них. Но зато когда оно готово - писать тесты становится легко и приятно.
Код
Выбрать все
ПН = Фабрика.ПримерПродажи(Фабрика.Товар()) 


и у тебя уже есть товар, клиент, приходная накладная, расходная, приходная/расходная реализатора, все нужные счета-фактуры и отчет комиссионера. Ворочай как хочешь.

3. Хранение данных в стороннем XML. Реализовал для SnowTest'а. Про поддержку еще не думал - еще не сталкивался с изменением структуры метаданных.

Больше всего мне нравится способ номер два.Запрягаешь долго, но едешь потом быстро.
  
Наверх
www  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #6 - 11. Мая 2010 :: 08:04
Печать  
artbear писал(а) 07. Мая 2010 :: 10:05:
А если юзать обмен данными через Конвертацию данных?
тогда мы практически не зависим от изменения метаданных.

Да, была такая мысль, сделать свой десериализатор. Но только лишь прочитать данные, к сожалению недостаточно. Остальные вопросы так и остались без ответа. Нужна методика управления тестовыми данными. И, весьма желательно, опробованная на практике Улыбка


lustin писал(а) 07. Мая 2010 :: 10:18:
1. храниться тестовые данные в формате YAML (fixtures)

А чем YAML лучше XML?


lustin писал(а) 07. Мая 2010 :: 10:18:
2. генератор кода для создания объекта

Звучит, пока, несколько фантастически. Реализовывать не планируешь?
  
Наверх
ICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #7 - 11. Мая 2010 :: 09:21
Печать  
fez писал(а) 07. Мая 2010 :: 12:40:
Пробовал три способа. Опишу по мере их придумки.
2. Создавать данные программно. Способ геморройный, приходится много времени потратить на создание кода, создающего базовые объекты, и простейшие конструкции из них. Но зато когда оно готово - писать тесты становится легко и приятно.
Код
Выбрать все
ПН = Фабрика.ПримерПродажи(Фабрика.Товар()) 


и у тебя уже есть товар, клиент, приходная накладная, расходная, приходная/расходная реализатора, все нужные счета-фактуры и отчет комиссионера. Ворочай как хочешь.
Больше всего мне нравится способ номер два.Запрягаешь долго, но едешь потом быстро.


На данный момент, у меня так и сделано: куча конструкторов и макроконструкторров, записывающих в базу, скажем, элемент номенклатуры с единицами и партиями.  Нужно отметить, что на создание модулей-генераторов уходит не так много времени, как может показаться. Это - занятие, скорее, даже, приятное Улыбка
Начинаешь их использовать - казалось бы, счастье уже рядом, "писать тесты легко и приятно". Но не тут-то было. Аппетит приходит во время еды. Юниттестирование в классическом понимании, на платформе 1С невозможно по понятным причинам. Для выполнения теста мы вынуждены воспроизводить состояние информационной базы полностью: заполнять огромное количество справочников, регистров, документов, у которых, в свою очередь, огромное количество реквизитов... Вобщем, именно эту сложность и хотелось бы уменьшить.
С технической точки зрения, программное формирование данных выглядит перспективно. По-видимому,  вопрос теперь в методике...
  
Наверх
ICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #8 - 11. Мая 2010 :: 10:08
Печать  
Палыч писал(а) 11. Мая 2010 :: 08:04:
lustin писал(а) 07. Мая 2010 :: 10:18:
1. храниться тестовые данные в формате YAML (fixtures)

А чем YAML лучше XML?
lustin писал(а) 07. Мая 2010 :: 10:18:
2. генератор кода для создания объекта

Звучит, пока, несколько фантастически. Реализовывать не планируешь?


1. YAML как бы этак сказать - человекочитаемый, за счет этой человекочитаемости очень удобно создавать данные прямо в блокноте  Улыбка - и diff для истории изменений выглядит красиво (а не то что на xml)

2. насчет генератора кода
- идея то была в свое время как раз придумана Федором (http://1c.alterplast.ru/exchange.html)
- как получившийся код выполнить через v8unpack и обработку-пустышку - было подсмотрено у tormozit в его ИнструментахРазработчика
- а насчет реализации - сказать труднее - кроме меня самого на текущих местах работы это и не надо никому - всем кнопочки подавай  Печаль. Ближайший месяц покажет... Кстати такую разработку надо однозначно через тестирование реализовывать  Улыбка



  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #9 - 11. Мая 2010 :: 10:28
Печать  
lustin писал(а) 11. Мая 2010 :: 10:08:
YAML как бы этак сказать - человекочитаемый


Насколько понимаю, такое описание тождественно вызову макроконструктора типа:

Код
Выбрать все
ГенереторОбъектов.СоздатьКонтрагента("инн", "наименование", "родитель") 



Ну и, опять же, нужна методика.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #10 - 11. Мая 2010 :: 10:36
Печать  
Палыч писал(а) 11. Мая 2010 :: 08:04:
artbear писал(а) 07. Мая 2010 :: 10:05:
А если юзать обмен данными через Конвертацию данных?
тогда мы практически не зависим от изменения метаданных.

Да, была такая мысль, сделать свой десериализатор. Но только лишь прочитать данные, к сожалению недостаточно.  Улыбка

Твой ответ не понятен Печаль зачем писать свой десериализатор?

Ручная схема работы с использованием КД выглядит так:
1. в КД делаются правила для переноса данных. т.к. конфы практически одинаковые, то правила делаются совершенно элементарно, тыканием кнопочек.
2. Далее в КД получаем файл правил, который будет юзаться как при выгрузке, так и при загрузке данных в исходной (рабочая?) и конечной (пустая тестовая) базах.
3. в исходной (рабочей?) запускается спец.обработка, в которой и выбираются нужные объекты для выгрузки. Эта обработка создает спец.файл выгрузки в ХМЛ.
4. в конечной (пустая тестовая) базе с помощью спец.обработки загружается полученный ХМЛ-файл из п.3
ВСЕ - тестовые данные готовы Улыбка
теперь осталось только автоматизировать этап загрузки (п.4) для использования в автоматических тестах.

Трудности - которые я вижу:
1. небольшие проблемы при изменении метаданных, но в КД все довольно просто меняется. нужно лишь не забывать об этом и вовремя менять правила.
2. ИМХО самое сложное - подбор всех нужных тестовых данных.
3. скорость загрузки может быть довольно слабой, хотя вряд ли сильно уступит варианту создания через кодогенератор.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #11 - 11. Мая 2010 :: 10:54
Печать  
artbear писал(а) 11. Мая 2010 :: 10:36:
artbear писал(а) 07. Мая 2010 :: 10:05:
А если юзать обмен данными через Конвертацию данных?
тогда мы практически не зависим от изменения метаданных.


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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #12 - 11. Мая 2010 :: 11:51
Печать  
Палыч писал(а) 11. Мая 2010 :: 09:21:
Юниттестирование в классическом понимании, на платформе 1С невозможно по понятным причинам.

Не. Мне эти причины непонятны Улыбка В 7.7 есть ++, в v8 есть возможность вызова экспортных методов. По крайней мере свои разработки можно (и нужно) писать с поправками на юниттестирование.

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

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

Считаю, что допустимо заполнить всю эту псевдостатическую информацию один раз. И проводить последующее автотестирование не на совсем пустой базе, а на хоть как-то первоначально заполненной.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #13 - 11. Мая 2010 :: 12:22
Печать  
lustin писал(а) 11. Мая 2010 :: 10:08:
Палыч писал(а) 11. Мая 2010 :: 08:04:
lustin писал(а) 07. Мая 2010 :: 10:18:
2. генератор кода для создания объекта

Звучит, пока, несколько фантастически. Реализовывать не планируешь?

2. насчет генератора кода
- идея то была в свое время как раз придумана Федором (http://1c.alterplast.ru/exchange.html)

Раз уж я был упомянут Улыбка выскажу свое мнение про генераторы кода.

Упомянутая хренотень была написана в тот момент, когда я понял, что пишу очень много в чем-то похожего кода. Тогда я и попытался несколько уменьшить объем проделываемой работы доступными на тот момент средствами. Я совсем не уверен, что окажись я сейчас в той ситуации, я бы пошел тем же путем.

Что касается создания данных для тестирования.
Не вижу принципиальной разницы между кодом фабричного метода, создающего mock object и кодом генератора. Результат один и тот же: объект создан. При этом код и вызов фабричного метода лично для меня понятнее, естественнее, удобнее и читаемее. Генератор кода выглядит некоторой дополнительной сложностью в данном случае.

В любом случае, я придерживаюсь стратегии "сначала пишем работающий код, и только потом его рефакторим." А придумывать заранее мегаархитектуру - ну его в пень.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тестирование разработок на платформе 1С. Управление данными
Ответ #14 - 11. Мая 2010 :: 12:54
Печать  
fez писал(а) 11. Мая 2010 :: 11:51:
Палыч писал(а) 11. Мая 2010 :: 09:21:
Юниттестирование в классическом понимании, на платформе 1С невозможно по понятным причинам.

Не. Мне эти причины непонятны Улыбка В 7.7 есть ++, в v8 есть возможность вызова экспортных методов. По крайней мере свои разработки можно (и нужно) писать с поправками на юниттестирование.

+1
ИМХО В 8-ке вполне удобно юзать юнит-тестирование, я в 77 не так активно применял юнит-тестирование, кроме разработки ++
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать