gifts2017

Тестирование (внешняя обработка)

Опубликовал Василий Казьмин (awk) в раздел Программирование - Инструментарий

Тестирование - это поиск ошибок. Однако 1С в этом плане практически не предоставляет никаких инструментов.

Искал долго что-то, что помогло бы ответить на вопрос: "То что я делаю работает верно?", но все решения меня чем-то, да не устраивали. Я даже почти нашел на этом сайте то что искал, но... Мне потребовалось что-то доработать, я залез в код и волосы встали "дыбом". В итоге я написал свой инструмент. Не менее кривой :) но более мне понятный (расширяемый).

Возможности:

1. Создание справочников.

2. Создание документов.

3. Проверка документа.

4. Проверка форм.

5. Установка/Проверка констант.

6. Добавление записей в регистр сведений.

7. Выполнение произвольного кода.

8. Выполнение произвольного запроса.

9. Выполнение произвольного скрипта JScript/VBScript.

10. Выполнение запроса к базе данных.

11. Выгрузка ветвей дерева теста в файл.

12. Выгрузка теста в файл.

13. Добавление теста в дерево тестов из файла.

14. Добавление ветви тестов в дерево тестов из файла.

15. Запуск тестов в автоматическом режиме (/execute/С)

Если кому-то мао функционала:

1. Изменяем макет о программе (добавляем себя как автора изменений) - мое лицензинонное требование.

2. Добавляем форму с обязательными реквизитами:

1. Параметры

2. ПараметрыТестов

и Функциями (Процедурами):

Процедура КнопкаВыполнитьНажатие(Кнопка)

// Вставить содержимое обработчика.

СтруктураТеста = СоздатьСтруктуру();

Если МодальныйРежим Тогда 

Закрыть(СтруктураТеста);

Иначе

СтрокаТеста.Описание = СтруктураТеста.Описание;

СтрокаТеста.Тест = ЗначениеВСтрокуВнутр(СтруктураТеста);

Закрыть(СтруктураТеста);

КонецЕсли;

КонецПроцедуры

Функция СоздатьСтруктуру()
Тест = Новый Структура;
Тест.Вставить("Описание", ЭлементыФормы.ПТДОписание.ПолучитьТекст());
Тест.Вставить("Параметры", Параметры);
Тест.Вставить("ФормаРедактирования", "Уникальное название формы");
Возврат Тест;
КонецФункции
Процедура ЗаполнитьИзСтруктуры(Тест) Экспорт
Если Тест.Свойство("Описание") Тогда
ЭлементыФормы.ПТДОписание.УстановитьТекст(Тест.Описание);
КонецЕсли;


Если Тест.Свойство("Параметры") Тогда
Параметры = Тест.Параметры;
КонецЕсли;

КонецПроцедуры

В основной форме, добавляем открытие формы. 

Процедура ТестыПередНачаломИзменения...
 			СписокВыбора.Добавить(ПолучитьФорму("Уникальное название формы"),"Уникальное название формы",,КартинкаVBS);

И в модуле обработки добавляем обработку в функцию ВыполнитьТест.

Кратко о том, что такое алгоритмы: 

Есть таблица с тремя колонками: "Имя", "Тип"(Px,Qx,Fx), "Текст". 
Есть функция: ВыполнитьКод(Имя, Параметры) - возвращающая массив Результаты 

У функции три модели поведения в зависимости от типа (Px,Qx,Fx) текста, проименованного в колонке "Имя". 

Функция по имени (переменная №1 переданная в функцию) отбирает строки таблицы и последовательно их выполняет. 

Если тип Qx то выполняется запрос и в Результаты добавляется результат запроса (при этом Параметры пытаются передаться как "Параметры запроса") 

Если тип Px то Выполняется Текст и ничего не добавляется. 

Если тип Fx то Текст вычисляется а в массив добавляется результат вычислений. 

17.03.2011 Добавлены транзакции

18.03.2011

Изменения:

1. Добавлены возможности прикрепления к тестам файлов

2. Добавлены возможности сравнения файлов

Интерфейс работы и сравнения с файлов:

Функция ПолучитьФайлыПоИмени(Имя) Экспорт

Возвращает массив двоичных данных из таблицы файлов, где имя совподает с "Имя"

Функция ПолучитьФайлПоID(ID) Экспорт

Возвращает ДвоичныеДанные по ID.

Функция СравнитьДанные(Источник, Приемник, СпособСравнения = Неопределено, ПараметрыСравнения = Неопределено)

Возвращает результат сравнения (истина/ложь) файлов.

Параметры:

-Источник/Приемник:

-Тип: Строка или ДвоичныеДанные

Описание:

Если тип строка, то функция проверяет существование файла, если его нет ищет в табице файлов по ID.

Если ДвоичныеДанные, то сохроняет на диск

-Способ сравнения:

СпособСравненияФайлов по умолчанию: СпособСравненияФайлов.Двоичное

- ПараметрыСравнения

-Тип Структура

ИгнорироватьПустоеПространство

УчитыватьРазделителиСтрок

УчитыватьРегистр

По умолчанию все свойства структуры Ложь

Обновлена до версии 0.98.1

Отличия от версии 0.98

  1. Добавлена возможность создания релиза. Меню: Утилиты - Создание релиза.
  2. Добавлена новая форма тестирования форм. Она позволяет выполнить заранее определенный код на языке 1С. В коде доступны объекты:
    1. ТекущаяФорма
    2. ЭлементыФормы
    3. ГлобальныеПараметры
    4. Алгоритмы
    5. Файлы

Скачать файлы

Наименование Файл Версия Размер
Тестирование.epf 440
.epf 189,26Kb
19.09.16
440
.epf 189,26Kb Скачать
Пример теста 84
.epf 158,84Kb
19.09.16
84
.epf 158,84Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Андрей Д. (detec) 15.03.11 18:50
2. Алексей Федоров (afedorov) 15.03.11 22:31
- При нажатии кнопки "Сохранить и закрыть" в форме записи нового документа ошибка:
{Форма.Документ_Запись.Форма(183)}: Значение не является значением объектного типа (Родитель)
Вычислять = ?(ТекущиеДанные.Родитель = Неопределено, ТекущиеДанные.Вычислять,ТекущиеДанные.Родитель.Вычислять);
Документ созданый по умолчанию конфигуратором.
- В форме записи нового справочника поле описания "скукожено".
- В большинстве форм заголовки не совсем правильные.

Хорошо, что для 8.2. Еще бы управляемые формы.
3. Василий Казьмин (awk) 16.03.11 00:08
Есть на управляемых, но не обработка, а проект, может выложу (если от специфики написания очищу). Ошибки подправлю - выложу новую версию (за сообщения отдельное спасибо).
4. Василий Казьмин (awk) 16.03.11 09:06
(2) Исправил:
- При нажатии кнопки "Сохранить и закрыть" в форме записи нового документа ошибка:
{Форма.Документ_Запись.Форма(183)}: Значение не является значением объектного типа (Родитель)
Вычислять = ?(ТекущиеДанные.Родитель = Неопределено, ТекущиеДанные.Вычислять,ТекущиеДанные.Родитель.Вычислять);
Документ созданый по умолчанию конфигуратором.
- В форме записи нового справочника поле описания "скукожено".

А про:
- В большинстве форм заголовки не совсем правильные.
Можно поподробнее?
5. Алексей Федоров (afedorov) 16.03.11 10:29
(4) Например, для формы Справочник_Запись, Документ_Запись, Документ_ПроверкаРеквизитов, заголовок "Обработка Шаблонное тестирование".
Заголовок "Обработка Запрос к базе" подходит по смыслу к Форма_SQL, но помоему не к Форма_Запроса и Форма_VBS.
6. Артур Аюханов (artbear) 16.03.11 11:13
Для тестировщиков рекомендую посмотреть систему чистого юнит-тестирования SnowTest
http://www.1cpp.ru/forum/YaBB.pl?num=1267016427/0
fez в Рарусе ее активно юзает
7. Артур Аюханов (artbear) 16.03.11 11:19
(0) Жаль, конечно, что код для 8.2, на 8.1 еще немало народу работает :(
8. Артур Аюханов (artbear) 16.03.11 11:28
(0) 1. Предлагаю сделать какой-нибудь файл с набором универсальных тестов, не зависящих от конфигурации.
ИМХО это удобно для демонстрации работы обработки.
2. Тестированием занимаюсь давно и в 77 и в 8.0/8.1/8.2, из опыта знаю, что неудобно выдавать данные прохождения тестов по всем тестам.
Если все тесты прошли, достаточно вывести зеленую полосу или просто написать ОК.
Если не все тесты прошли, инфу нужно показывать только по непрошедшим тестам.
Любое другое решение просто будет показывать абсолютно ненужную подробную инфу.
Максимум, что еще можно позволить - показать общее количество тестов и количество прошедших тестов.
9. Артур Аюханов (artbear) 16.03.11 11:38
(0) Не обозначена инфа о выполнении кода в транзакции или без нее.
Выполнение кода теста в транзакции, которая по завершении теста откатывается обратно, удобно юзать для автоматической и простой очистки данных, которые меняет тест.
Тест сам должен подчищать данные или это сделает обработка-браузер тестов ?
10. Артур Аюханов (artbear) 16.03.11 11:43
(0) 1. По Алгоритмам непонятен тип Px,Qx и т.д.
Поясни, что это означает?
2. Есть ли возможность сохранять ожидания тестов и сверять их при выполнение тестов
11. Артур Аюханов (artbear) 16.03.11 12:16
(0) Сравнение данных теста с заранее сохраненными тестовыми данными очень удобно.
Например, я использую эту фичу на своей системе тестирования (сильно устаревшей, конечно) для тестирования печатных форм объектов, данных информационной базы (вдруг задним числом важные данные исправили), при разработке правил конвертации и переноса данных и т.п.
Без этой фичи придется в КАЖДОМ тесте вручную решать вопрос хранения тестовых данных, с которыми сравниваем работу теста.
12. Василий Казьмин (awk) 16.03.11 12:25
(5) Исправлю, но с низким приоритетом.
(6) Спасибо, посмотрю.
(7) К сожалению, сейчас спонсируется (оплачивается мне лично) только разработка на 8.2 найдется спонсор - буду писать под 8.1 и т.д.
(8)
1. Со временем в планах (время правда дефицит).
2. То есть нужно добавить: "Уровень детализации отчета" - думал над этим, но руки пока не дошли. Сделаю с высоким приоритетом.
(9) Подчистка пока идет на уровне самих тестов. Хотя добавить процедуры ПередВыполнениемТестирования, ПередВыполнениемТеста, ПослеВыполненияТеста, ПослеВыполненияТестов - мысль хорошая. НачатьТранзакцию(), ЗафиксироватьТранзакцию(), ОтменитьТранзакцию() вставлять можно туда будет.
(10) По алгоритмам я расписал в справке.
Но кратко о том что это:

Есть таблица с тремя колонками: "Имя", "Тип"(Px,Qx,Fx), "Текст".
Есть функция: ВыполнитьКод(Имя, Параметры) - возвращающая массив Результаты

У функции три модели поведения в зависимости от типа (Px,Qx,Fx) текста, проименованного в колонке "Имя".

Функция по имени (переменная №1 переданная в функцию) отбирает строки таблицы и последовательно их выполняет.

Если тип Qx то выполняется запрос и в Результаты добавляется результат запроса (при этом Параметры пытаются передаться как "Параметры запроса")

Если тип Px то Выполняется Текст и ничего не добавляется.

Если тип Fx то Текст вычисляется а в массив добавляется результат вычислений.


(10) При записи отчет сохраняется вместе с тестом. Между тестами можно передавать данные через переменную ГлобальныеПараметры. И сравнивать соответственно. Что бы зафиксировать ошибку достаточно выполнить ДобавитьОшибку("Описание", "Подробное описание", Расшифровка).

Сохранить так же можно ЗначениеВФайл.

Или что-то более конкретное имеется ввиду?
13. Сергей (Che) Коцюра (CheBurator) 16.03.11 12:26
Поясните, плиз, неграмотному в тестировании - каким образом вообще происходит генерация эталонных данных и сравнение результата с эталоном?
14. Артур Аюханов (artbear) 16.03.11 15:22
(13) В сабже, похоже, этого в чистом виде нет.
А ведь это очень важная задача. в (11) я привел примеры использования.
(12) 1. ИМХО было бы очень удобно автоматически хранить ожидаемые данные теста в данных самого теста и при выполнении сверять ожидаемые данные и данные теста. Это можно сделать спец.параметров в данных теста.
В этом случае твоя обработка сможет решать сразу 2 задачи - и юнит-тестирование в чистом виде, и тестирование/сравнение с образцом.
2. По отмене транзакций ИМХО самый простой вариант - это добавить доп.параметр типа ИспользоватьТранзакцию, по умолчанию он включен.
Т.е. если он задан, тест выполняется в транзакции и затем транзакция отменяется. А специальные тесты могут убирать этот флаг и самим выполнять нужный вариант.
Но нужно подумать, что делать с вложенными тестами, т.к. вложенные транзакции не поддерживаются :(
15. Василий Казьмин (awk) 16.03.11 15:58
(14)

1. Эталоны. В чистом виде нет, так как задачу на конкретных примерах решить проще нежели реализовывать общий вариант покрывающий все частности.

Пример(не из головы):

Мне нужно проверить, что в результате импорта пользователю присылается письмо с ответом.
В текущем варианте это делается:

1. Создаем тест генерирующий входные данные.
2. Создаем тест который вызывает обработку импорта данных.
3. Создаем тест проверяющий почтовый ящик.

+ 0. тесты установки значений по умолчанию.

1.1 Хранить ожидаемые данные теста в данных самого теста - не вариант, а вот именованные двоичные данные - это идея. Их в любом тесте можно преобразовать в таблицу, структуру и т.д., а алгоритм преобразования занести в алгоритмы. Как наберется пара алгоритмов, можно внести в обработку. (Это мое мнение, готов обсудить, т.к. результат теста понятие очень размытое).


2. Я сначала хотел включить флаг: "Выполнять в транзакции", но не стал, так как посчитал, что проще добавить обработчики ПередЗаписью ПослеЗаписи, где можно если нужно поставить НачатьТранзакцию(); ОтменитьТранзакцию(); Есть мысль, флаг "Выполнять в транзакции" добавить к каждому тесту и верхний уровень перекроет нижний. Но надо подумать, пока решаю вопрос с "уровнем сообщений для вывода в отчет" + рефакторинг.
16. Артур Аюханов (artbear) 16.03.11 18:05
(15) 2. По транзакции - из моего опыта я знаю, что 95% тестов удобнее делать с автотранзакцией, и только оставшие 5% можно делать с собственной обработкой транзакции и чисткой данных.
Например, при тестирования серверного кода на 8.1 транзакции уже не помогут :)
Если заставить тестировщика КАЖДЫЙ раз прописывать условие ввода транзакций, это будет очень неудобно и пользователь будет часто забывать это делать :)
1. А как сделать тест, генерирующий данные? это и будет основная сложность.
НАМНОГО проще каким-то образом добавить к тесту эталон в любом виде - хоть таблица, хоть двоичные данные, и уже этот эталон сравнивать с результатом.
Опять же из своего опыта - мной юзается всего 2 вида тестов - юнит-тесты (чистые тесты с подготовкой данных, выполнением над ними неких действий, проверки и очистка данных) (юзаю SnowTest) и функциональные тесты(сравнение с эталоном) (юзаю свою сильно устаревшую систему FuncTest.v8 (есть в профиле) - наследника от FuncTest для 77)
У тебя юнит-тесты вполне можно организовать, а вот сравнение с эталоном пока ОЧЕНЬ НЕУДОБНО :( т.е. в реальной работе тестировщика использовать обработку будет трудновато :(
17. Василий Казьмин (awk) 16.03.11 18:59
(16) Тогда план развития, в порядке реализации:
1. Заголовки (3) третье замечание
2. Транзакции ??? Надо ответить на вопрос "Быть или не быть?": "Транзакция на тест" или "Транзакция на тесты".
3. Сравнение с эталоном.
3.1 Добавление двоичных данных в тест.
3.2 Прикрутить обработку "Сравнение данных" (она может сравнивать две таблицы и результат в скд выводить, а таблицы можно ввести вручную или из источника (SQL, 1C запрос, Запрос к внешней базе 1С, 1С Код));
4???
18. desty (lustin) 17.03.11 10:13
artbear пишет:

Для тестировщиков рекомендую посмотреть систему чистого юнит-тестирования SnowTest

http://www.1cpp.ru/forum/YaBB.pl?num=1267016427/0

fez в Рарусе ее активно юзает


ОФФ: вроде ж не в Рарусе, а в Яндексе.
19. Артур Аюханов (artbear) 17.03.11 17:21
(18) Упс, конечно, Яндекс :) Откуда взялся Рарус??
20. Артур Аюханов (artbear) 17.03.11 17:24
(17) 1. По заголовкам не понял. в (3) вроде ничего не говорится, только об ошибках
несложно ИМХО
2. Транзакции - преимущество имеют транзакции у группы тестов
чуть сложнее
3. Эталон обязательно нужен.
Самое сложное

ИМХО, решив 2 и 3, закроем большинство потребностей в тестировании !
21. Василий Казьмин (awk) 17.03.11 17:32
(20)
- В большинстве форм заголовки не совсем правильные.
Действительно - не сложно. Подправил, но пока не выложил.
2. Транзакции - преимущество имеют транзакции у группы тестов
чуть сложнее
Просто, так что в ближайшее время.

Третье да сложно, но есть наработки в отдельном отчете.
22. Доржи Цыденов (support) 18.03.11 08:16
Перспективный проект! Даешь юнит тесты для конфигураций.
23. Артур Аюханов (artbear) 18.03.11 09:02
(21) Как только добавишь сравнение с эталоном, я могу встроить в твою обработку готовый код/форму
1. для тестирования внешних печатных форм.
правда, придется менять конфу, иначе отловишь показ табличного документа :(
Но ИМХО это того стоит.

2. для тестирования подготовленных произвольных отчетов
В модуле отчета должны быть служебные методы, с помощью которых могут быть получены данные отчета.
Интерфейс у меня давно разработан и используется в моем Functest.v8

Очень удобно юзать при разработке и доработке отчетов и печатных форм.
24. Василий Казьмин (awk) 18.03.11 17:50
25. Артур Аюханов (artbear) 23.03.11 16:17
(24) Пока некогда смотреть, работы навалилось. В субботу посмотрю.
26. Роман Романов (romansun) 23.03.11 16:23
8.2 - чорт, чорт, чорт... )))

awk пишет:
К сожалению, сейчас спонсируется (оплачивается мне лично) только разработка на 8.2 найдется спонсор - буду писать под 8.1 и т.д.


Мда, даунгрэйд уже как-то нелогичен, наверное, будет. Но так хотелось бы...


А что по поводу стандартной 1С-ной тестировочной конфигурации? Её юзает народ, какие впечатления?
27. Роман Романов (romansun) 23.03.11 16:53
По теме:

Функция ПолучитьИмяФайла(ФайлЗначение) может пересечься с типовой глобальной функцией, в случае если на соответствующем общем модуле установлена галка "Глобальный".

В современных конфах 1С похоже сняло почти везде эту галку с общих модулей, а вот, к примеру, моя рабочая, бывшая в девичестве БП1.5, имеет на всех общих модулях установленный признак "Глобальный".

Не критично, но возможно имеет смысл переименовать функцию
28. Василий Казьмин (awk) 23.03.11 18:29
(27) Спасибо, Надо себе на заметку кинуть - рефакторинг (префиксы).
(26)
1. Ответ почему не 8.1 в комменте (12).
2. Да был опыт, но как-то не очень понравилась. Как проверка того, что изменения не внесли в старый функционал ошибки - отлично. Но создать произвольный эталон для сравнения - сложновато. Да и цена 35 000 (для простых смертных). 35 000 Стоит Test Complete 8, правда на 1С его сложно натравить, но если функционал сравнивать, то он в разы превосходит 1С Сценарное тестирование.
29. Роман Романов (romansun) 23.03.11 19:24
(28)

у нас есть сценарное тестирование, велосипедики на иконках там супер, ага :)

Таки да - сложно, сложно и сложно. Съедает очень много времени выделенного человека.
Чуть изменилась структура базы - тесты посыпались, изменилась форма элемента - тесты посыпались. Хорошо работает, когда ничего не меняется )). Но только зачем тогда тестировать?

Сравнение с эталоном помогает протестить всю цепочку. К примеру, рождение, жизнь и смерть основного средства. В картинках. Но набивание и отладка такого теста - ого-го по времени :(.

Но тестировать надо, поэтому смотрю вот какие есть еще варианты для 1С..
30. Василий Казьмин (awk) 23.03.11 22:03
(29) А какая версия? У меня была 1.2.3.4, но вроде как сейчас 2.х.х.х.
31. Алексей Федоров (afedorov) 24.03.11 11:21
(29) Если для 8.1, то можете попробовать мою обработку "Шаблонное тестирование", которую можно найти на этом сайте. Там есть сравнение с эталоном, и его просто создавать или изменять.
32. Роман Романов (romansun) 24.03.11 18:50
ага, спасибо, обязательно гляну.
35. Владимир Клименко (KliMich) 18.05.12 22:16
36. Андрей Куришко (boggonzikov) 01.08.12 11:30
Где посмотреть пример?.
В файлах "Пример теста", качается Тестирование.epf
37. Василий Казьмин (awk) 01.08.12 17:00
(36) boggonzikov, Раньше это был пример. Сейчас не знаю где взять.
38. Сергей Огородников (Serg O.) 05.12.16 12:52
в типах значений... почему то нет типа СписокЗначений
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа