Тестировалось на платформе 8.3.15.1830
После очередного обновления нетиповой бухгалтерии захотелось проверить, что в результате обновления не пострадали механизмы проведения документов. А именно: нужно было убедиться в том, что а) документы проводятся в принципе; б) движения (бух.проводки, записи регистров) документов после перепроведения в новой конфигурации остаются такими же, как и в старой.
Для этого был нарисован файл тестов для xUnitFor1C, который отбирает по 10 документов каждого вида за последний год, перепроводит их, и сравнивает движения по всем регистрам до и после перепроведения. Количество отбираемых документов и настройки периода можно изменить в процедуре ЗаполнитьНаборТестов() - см.структуру ПараметрыОтбораДокументов.
Проект на гитхабе: https://github.com/q-i/tests_for_xUnitFor1C
Рацпредложения приветствуются.
Исходный код модуля обработки файла тестов (лицензия Apache 2.0 для совместимости с проектом xUnitFor1C):
Перем КонтекстЯдра;
Перем Утверждения;
Перем УтвержденияПроверкаТаблиц;
//{ основная процедура для юнит-тестирования xUnitFor1C
Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
КонтекстЯдра = КонтекстЯдраПараметр;
Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения");
УтвержденияПроверкаТаблиц = КонтекстЯдра.Плагин("УтвержденияПроверкаТаблиц");
КонецПроцедуры
Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт
КонтекстЯдра = КонтекстЯдраПараметр;
// за последний год
КонецПериода = ТекущаяДатаСеанса();
НачалоПериода = ДобавитьМесяц(КонецПериода, -12);
ПараметрыОтбораДокументов = Новый Структура;
ПараметрыОтбораДокументов.Вставить("НачалоПериода", НачалоПериода);
ПараметрыОтбораДокументов.Вставить("КонецПериода", КонецПериода);
ПараметрыОтбораДокументов.Вставить("КоличествоДокументов", 10);
Для Каждого МетаОбъект Из Метаданные.Документы Цикл
Если МетаОбъект.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить
И ПравоДоступа("Проведение", МетаОбъект) Тогда
ДобавитьТестыДляДокумента(НаборТестов, МетаОбъект, ПараметрыОтбораДокументов);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьТестыДляДокумента(НаборТестов, МетаОбъект, ПараметрыОтбораДокументов)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Ссылка,
| Представление
|ИЗ
| Документ." + МетаОбъект.Имя + "
|ГДЕ
| Проведен
| И Дата МЕЖДУ &НачалоПериода И &КонецПериода
|
|УПОРЯДОЧИТЬ ПО
| МоментВремени Убыв";
Запрос.УстановитьПараметр("НачалоПериода", ПараметрыОтбораДокументов.НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", ПараметрыОтбораДокументов.КонецПериода);
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"ВЫБРАТЬ ПЕРВЫЕ 1",
"ВЫБРАТЬ ПЕРВЫЕ " + Формат(ПараметрыОтбораДокументов.КоличествоДокументов, "ЧГ=")
);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
НаборТестов.НачатьГруппу("Документ." + МетаОбъект.Имя);
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ПараметрыТеста = НаборТестов.ПараметрыТеста(Выборка.Ссылка);
ПредставлениеТеста = Выборка.Представление;
НаборТестов.Добавить("Тест_ПровестиДокумент", ПараметрыТеста, ПредставлениеТеста);
КонецЦикла;
КонецПроцедуры
Функция ПолучитьДвиженияДокумента(ДокументОбъект)
Если 1=2 Тогда
ДокументОбъект = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
КонецЕсли;
Результат = Новый Соответствие;
Для Каждого Движение Из ДокументОбъект.Движения Цикл
ТипДвижения = ТипЗнч(Движение);
Движение.Прочитать();
ТаблицаДвижения = Движение.Выгрузить();
Результат.Вставить(ТипДвижения, ТаблицаДвижения);
КонецЦикла;
Возврат Результат;
КонецФункции
//}
//{ Блок юнит-тестов
Процедура ПередЗапускомТеста() Экспорт
НачатьТранзакцию();
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПроцедуры
Процедура Тест_ПровестиДокумент(ДокументСсылка) Экспорт
Если 1=2 Тогда
ДокументСсылка = Документы.СчетНаОплатуПокупателю.ПустаяСсылка();
КонецЕсли;
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДвиженияДо = ПолучитьДвиженияДокумента(ДокументОбъект);
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ДвиженияПосле = ПолучитьДвиженияДокумента(ДокументОбъект);
Для Каждого КлючИЗначение Из ДвиженияДо Цикл
ТипДвижения = КлючИЗначение.Ключ;
ТаблицаДвиженияДо = КлючИЗначение.Значение;
ТаблицаДвиженияПосле = ДвиженияПосле.Получить(ТипДвижения);
УтвержденияПроверкаТаблиц.ПроверитьРавенствоТаблиц(ТаблицаДвиженияДо, ТаблицаДвиженияПосле, "Отличаются движения по регистру " + ТипДвижения);
КонецЦикла;
КонецПроцедуры
//}