Unit-test Попытка №2
Проигнорирую предыдущие выводы и рассмотрю пример доработки системы НДС в тиражном продукте 1С:Бухгалтерия предприятие 3.0 и тестирование. В регистр накопления НДСРаздельныйУчет
добавим новое измерение и доработаем движения приход для документа Поступление товаров и услуг
.
Путем простейшего анализа получим, что приходное движение выполнятся в процедуре СформироватьДвиженияНДСРаздельныйУчетПоступлениеЦенностей
общего модуля УчетНДСРаздельный
.
Как можно видеть процедура примитивная и она оперирует готовыми структурами, которые ей передаются, как параметры.
Поэтому изменения вносим в функциюПодготовитьДанныеДвиженийНДСРаздельныйУчетПоступлениеЦенностей
, дополняем нужными данными таблицу значений, которую возвращает функция.
Далее разрабатываем автоматизированный unit-тест, который проверит корректность измененной функции. Код теста размещаем во внешней обработке или расширении. Действие теста - вызов тестируемой процедуры или функции. В данном случае возможны 2 варианта:
Вызов измененной функции ПодготовитьДанныеДвиженийНДСРаздельныйУчет...
Достоинства: вызов полностью изолирован - проверяем то, что изменили, не затрагивая другой код. Функция возвращает структуру, которую легко сравнить с эталоном.
Недостатки: данная функция не экспортная, т.е. она вспомогательная и определяет "внутреннее" поведение модуля. Чтобы ее вызвать придется добавлять в общий модуль УчетНДСРаздельный
свою экспортную функцию, к которой будет обращаться тест:
Функция Тест_ПодготовитьДанныеДвиженийНДСРаздельныйУчетПоступлениеЦенностей(ДанныеДвижений, Реквизиты) Экспорт Возврат ПодготовитьДанныеДвиженийНДСРаздельныйУчетПоступлениеЦенностей(ДанныеДвижений, Реквизиты); КонецФункции
Вызов процедуры СформироватьДвиженияНДСРаздельныйУчетПоступлениеЦенностей
Достоинства: процедура экспортная поэтому ее можно вызвать из кода теста.
Недостатки: один из параметров процедуры специальная коллекция Движения
, поэтому в код теста нужно добавить ее создание.
Проверка результата может быть выполнена в двух вариантах:
Вариант 1. через запись документа и чтение записей регистра накопления НДСРаздельныйУчет
Движения = Документ.Движения; УчетНДСРаздельный.СформироватьДвиженияНДСРаздельныйУчетПоступлениеЦенностей(ДанныеДвижений, Движения, Ложь); Документ.Записать();
Вариант 2. без записи документа, сравнить с эталоном набор записей регистра Движения.НДСРаздельныйУчет,
который сформировался после вызова процедуры СформироватьДвиженияНДС...
В любом случае чтобы автоматизировать этот тест нужно выполнить большой объем подготовительной работы:
- создать необходимые справочники и документы, участвующие в тесте
- сериализовать и сохранить коллекции, которые передаются как параметры в функцию или процедуру
ДанныеДвижений
иРеквизиты
- сохранить эталонный результат
Чтобы сделать все выше перечисленное нужен вспомогательный инструментарий, который позволит выполнять эти действия, не перегружая код теста.
Используя такой инструментарий, код теста будет достаточно простым:
- восстановить коллекции-параметры
- получить результат вызова тестируемого кода
- сравнить результат с эталоном
За кадром остаются такие важные параметры как повторяемость теста и запуск его в другой базе. Такой тест не совсем unit-тест он больше относится категории интеграционных тестов.