Тема сценарного тестирования уже давно раскрыта, а осознание необходимости использования TDD и BDD в той или иной мере есть почти в каждой компании. Исключением не стала и наша небольшая группа разработчиков на 1С. Однако, от момента понимания необходимости, до реального использования технологии, проходит время, и на этом пути неокрепшие умы как, например, автор этой статьи, начинают задумываться об эффективности всей этой затеи. Если вам интересно как группка смышленых ребят внедрила в своей работе что-то похожее на сценарное тестирование – добро пожаловать.

Предыстория


На рынке существуют очень мощные и развитые средства тестирования пользовательского интерфейса. Есть специальные языки описания сценариев, масса документации и методологий. Другими словами, «Есть проблема? Есть решение!».

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

Итак, дано: территориально распределенная группа разработчиков на 1С до 10 человек, в среднем, до 5 активных проектов, в основном разработка кастомных решений без использования типовых продуктов 1С.

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

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

Подняв старые записи, был в очередной раз составлен список требований к потенциальному программному продукту:

  • Решение должно быть облачным
  • База тестов для всех разработок должна быть единой
  • Должен быть контроль доступа к приложениям (у каждого программиста свой пул разработок)
  • Разработка тестов и их выполнение должно быть в одной IDE
  • Сценарии должны программироваться, а не записываться действиями пользователя
  • Желательно, чтобы язык программирования тестов был похож на язык 1С
  • Запуск тестов должен производиться по одной кнопке, без предварительных манипуляций, компиляций, сборок, выгрузок, загрузок и прочего
  • В процессе написания теста должна быть возможность анализа структуры окон и реквизитов тестируемого приложения в терминах модели управляемого интерфейса 1С, и это должно быть в той программе, где разрабатывается и сам тест. Должна быть возможность получения свойств полей тестируемого приложения, при проходе по дереву контролов в базе тестирования — тестируемое приложение должно отзываться и показывать где этот контрол.
  • Для тестирования бизнес-логики не должна использоваться эталонная база
  • Для отработки теста, не должна быть заготовленная специально база, все тесты должны уметь работать и создавать всё что нужно сами

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

Прошло, наверное, еще полгода, и наконец я принял решение начать в вяло-факультативном режиме разработку очередного велосипеда-тестировщика (дальше — тестер), и вот, что из этого получилось.

Как это выглядит


В итоге родилось приложение на базе 1С, в котором пишутся и выполняются сценарные тесты для решений на базе 1С. Ежедневное использование примерно такое: тестер открыт у программиста на втором мониторе весь рабочий день. В базе учета проектов менеджер указывает обязательный набор тестов, которыми должен быть покрыт проект.

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

Когда пишутся тесты


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

Пример теста


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

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

image

image


Сверху – разрабатываемое приложение, снизу – тестер, в режиме работы тонкого клиента, база тестов в облаке. Код, который вы видите, написан на языке 1С. Код сценария взаимодействует с запущенным клиентским приложением через обертки методов тестируемого приложения 1С, например, вот как выглядит метод Choose (…);

image

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

Перейду к более интересным сценариям.

Взаимосвязь тестов


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

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

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

Вот пример как тест создания Assembling готовится к поступлению:

image

(цены, сумы и кол-ва задаются в виде строк, чтобы избежать проблем ложного срабатывания проверки теста в случае его запуска в другой локали, где разделитель триад и дробной части, например, могут отличаться)

В процессе выполнения этого теста, будет выполнен ряд других тестов, которые создадут всё необходимое для возможности протестировать Assembling как таковой. Вот примерно, что получится в результате в базе:

image

image

Тестирование бизнес логики


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

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

Вот пример отчета по движениям документа в тестируемом приложении:

image


Вот как эти движения будет проверять тестер:

image


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

Типовые проверки


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

Контроль ошибок


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

image


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

Вот пример реализации такой проверки в одном из тестов:

image

image


Анализ дерева элементов


Тестер умеет считывать визуальные объекты тестируемого приложения. Это удобно, а иногда и просто необходимо для написания сценария, особенно для многоязычных решений, где названия кнопок зависят от языка пользователя, и приходится использовать внутренний идентификатор для отработки интерфейса (если конечно не стоит задача проверки синтаксиса надписей на кнопках). Вот пример, как тестер представляет считанные данные:

image


Заключение


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

  • Тестер легко устанавливается и настраивается
  • Он изначально многопользовательский (пользователи создаются также в тестере, в подсистеме администрирования)
  • Не требует специальных знаний для написания тестов
  • Позволяет реализовывать сложные сценарии бизнес логики
  • Позволяет в одной базе держать тысячи тестов по разным проектам и «переиспользовать» их. Например, можно создать общий для всех проектов тест поиска документа в списке по номеру. Или если клиентская база реализована на основе какой-то типового решения, для которого уже есть тесты, можно проверять клиентскую базу вызывая все родительские тесты, плюс тесты, специально разработанные под клиента

И конечно, многое еще не реализовано:

  • Нет расписания запуска тестов
  • Нет продвинутой системы анализа, графиков и отчетов по результатом тестирования
  • Не реализованы никакие автоматически рассылки и уведомления, о том, что сломалось, кто сломал и почему
  • Нет связи с репозиториями, и версионности тестов

Тестер открытый и бесплатный, запускать желательно начиная 8.3.8, но и на 8.3.7 тоже работать будет, если включить режим совместимости. Внутри есть небольшая справка (подкачивается из инета), обёртки методов есть и на русском языке, dt-шник можно скачать отсюда. Там есть пару примеров для бухгалтерии корп 3.0.

Удачных вам тестов друзья и спасибо за внимание!
Поделиться с друзьями
-->

Комментарии (22)


  1. FSerg
    15.08.2016 23:50

    Буду смотреть!
    На первый взгляд стиль изложения у вас сильно лучше, чем у проекта xUnitFor1C.


    1. grumegargler
      15.08.2016 23:55
      +1

      спасибо! буду рад, если штука понравится, задавайте вопросы если что.
      p.s. парни из xUnitFor1C тоже большое дело делают, но у них чуть подход другой.


  1. Serginio1
    16.08.2016 10:23

    В 1С invariantCulure для чисел. То есть в любой локали то есть 8000.93 будет 8000.93 в любой локали.
    За статью спасибо, посмотрю.


  1. Serginio1
    16.08.2016 10:45

    А вот для строкового представления в InvariantCulure лучше использовать XMLСтрока


    1. grumegargler
      16.08.2016 16:21

      простите, я не понял два сообщения выше. Вся работа с числами происходит на стороне клиента, и представлена менеджеру тестирования в виде строк, таким образом, если нужно проверить что Цена 5 * Кол-во 20 будет равно 100, в зависимости от места запуска клиентского приложения, результат может быть «100.00» или «100,00». Тоже касается и присвоения полям значений.
      XMLString () на тонком клиенте недоступен.


      1. Serginio1
        16.08.2016 16:39

        Я про
        >> (цены, сумы и кол-ва задаются в виде строк, чтобы избежать проблем ложного срабатывания проверки теста в случае его запуска в другой локали, где разделитель триад и дробной части, например, могут отличаться)

        Ну товар.Цена=89,32 выдаст ошибку на любой локали. Другое дело строковое представление числа.
        Можно задавать единую локаль
        Формат(Значение,«Л=en_US»)


        1. grumegargler
          16.08.2016 16:51

          приложение двуязычное, задать строго формат нельзя.


          1. Serginio1
            16.08.2016 17:04

            Например на C# я задаю для ToString InvariantCulture
            Для таких как я можно дать ссылочку на ИТС Пример автоматизированного тестирования


  1. Serginio1
    16.08.2016 11:31

    Да уж тяжело переходить с русского на английский. Меня тут ругали за руслиш, но чистый английйский на 1С это тяжело. Обработки ->DataProcessors итд


    1. grumegargler
      16.08.2016 16:29

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


  1. Serginio1
    16.08.2016 12:51

    Отстал от жизни
    test = Type ( «TestedClientApplicationWindow» );

    Показывает, что общий модуль. Но его найти не могу


    1. grumegargler
      16.08.2016 16:25

      test = Type ( "TestedClientApplicationWindow" );
      

      таким образом определяется, доступен ли менеджер тестирования, другими словами, запущен ли тестер с флагом /TESTMANAGER


      1. Serginio1
        16.08.2016 16:41

        Это я понимаю. Я не понимаю откуда берется TestedClientApplicationWindow с типом Общий модуль?
        Я понял суть, но мне интересна и конкретика!


        1. grumegargler
          16.08.2016 16:50

          есть просто такой общий клиентский модуль Test, его дизайнер и показывает, конечно, переопределить общий модуль программно нельзя, но и данное присвоение сделано только для try/except


          1. Serginio1
            16.08.2016 16:56

            Понял. Действительно отстал от жизни
            ТестируемоеОкноКлиентскогоПриложения (TestedClientApplicationWindow)


  1. AMaxKaluga
    16.08.2016 16:15

    Супер, обязательно развернём посмотрим у себя!

    PS: Ребята спасибо, что забили гвоздь тем, кто постоянно писал «кровь из глаз при виде русского языка в коде».


    1. FSerg
      16.08.2016 16:20

      Вот я тоже подумал, что для хабара — англоязычный вариант конфы и кода — отличный (хоть и не специальный) троллинг :)


  1. EvilBeaver
    17.08.2016 17:48

    grumegargler, полюбопытствую, проект vanessa-behavior видели?


    1. alexey-lustin
      17.08.2016 18:49

      Конечно знает — еще бы не знать. Уже даже потролили друг-друга если мне не изменяет память.


      Формально — это конечно не BDD, а больше в сторону Silenium. Но с другой стороны "Поведение проверяется, а значит как бы BDD"


      НО:


      • Gherkin нас заставляет соответствовать духу BDD — когда функционала нет, а проверка поведения уже готова. "Behavior First — все же помнят ?"

      Этот инструмент же больше подойдет Ване Берездецкому — который исповедует принцип что, проверки пишутся перед сдачей работ заказчику ;-).


      НО — как говорил один наш товарищ "Больше инструментов — открытых и разных"


      © "тестов нет"


      1. grumegargler
        17.08.2016 19:00

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


        1. alexey-lustin
          17.08.2016 19:17

          Я больше про общение в рамках партнеской конференции 1С. Про наш фокус вы уже наверное в курсе http://infostart.ru/special/bdd/ ;-)


          А так да — веселье продолжается. Основная цель же сократить баги в продуктиве, особенно регрессионные.
          xUnit и Behavior — чуть шире инструментарий, поэтому… всё отлично.


          Поздравляю с почином кстати на Хабре.


  1. grumegargler
    17.08.2016 18:04

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