xDrivenDevelopment / xUnitFor1C

Unit testing tools for 1C:Enterprise 8 platform (http://v8.1c.ru)
Apache License 2.0
345 stars 126 forks source link

Нормализация вывода текста при падении утверждений #444

Open simargle opened 9 years ago

simargle commented 9 years ago

Итоговое описание сформулировано в https://github.com/xDrivenDevelopment/xUnitFor1C/issues/444#issuecomment-78027579

Ранее было: Было бы удобно иметь метод, который позволит выполнить сравнение двух версий объекта типа "ДвоичныеДанные".

Пример из практики - в конфигурации осуществляется автоматическая конвертация приложенных изображений из растрового формата без сжатия в формат со сжатием (bmp -> png). Требуется сделать следующее:

  1. Добавить в обработку тестирования два двоичных макета (один - с исходным изображением, второй - с конвертированным).
  2. Осуществить программную запись изображения в базу.
  3. Сравнить двоичные данные эталонного изображения из макета , с данными, хранящимися в базе.

Для себя решили этот вопрос, создав собственную функцию ПроверитьРавенствоДвоичныхДанных, которая создает по сравниваемым двоичным данным два файла и потом сравнивает их с помощью инструмента СравнениеФайлов. Но это решение подходит только для толстого клиента. Во всех остальных случаях, как вариант, можно использовать преобразование в base64, получение хэша от двух значений и последующее их сравнение (в версии 8.3 появилась нативная функция сравнения, для более старых версий можно использовать самописную функцию взятия хэша, например http://infostart.ru/public/100845/).

pumbaEO commented 9 years ago

Хм, а почему бы просто не производить сравнение base64 строки?

simargle commented 9 years ago

pumbaEO, Пробовал такой подход, но на большом размере данных (от 0.5 Мб) проверка с помощью процедуры ПроверитьРавенство браузера тестов просто зависала. Причем такая ситуация наблюдается только тогда, когда base64-представления двоичных данных не равны. Я предположил, что это было вызвано большим размером строки (возможно есть проблемы с выводом в отчет о тестировании такой строки; в общем-то она там и не нужна, вряд ли кто-то будет это сравнивать).

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

simargle commented 9 years ago

Сейчас искусственно воспроизвел подобную ситуацию - действительно проблема возникает, именно при использовании метода ПроверитьРавенство по причине длительного вывода информации в макет. Т.е. если сначала руками сравнить две base64-строки, а потом результат сравнения передать методу ПроверитьИстину, то такая операция будет выполнена значительно быстрее.

Но по моему мнению было бы удобно, чтобы для такой операции была отдельная процедура-обертка.

artbear commented 9 years ago

Семантика использования нового метода остается той же, что у ПроверитьРавенство А чем реализация нового метода будет отличаться от ПроверитьРавенство? только тем, что будет обрезаться строке base64 для нормализации вывода в отчет ? Особого смысла в новой функции не вижу.

Возможно, есть смысл добавить ограничение при выводе в отчет для всех утверждений?

simargle commented 9 years ago

Если говорить про реализацию, то это может быть отдельный метод ПроверитьРавенствоДвоичныхДанных (по аналогии с существующими методами проверки - ПроверитьРавенствоФайлов и т.д.). Соответственно детали сравнения были бы инкапсулированы внутри этого метода проверки (например, преобразование в base64 и дальнейшее сравнение полученных значений, либо какой-то другой метод).

Принципиально устроит и использование существующего метода ПроверитьРавенство, но в настоящий момент это невозможно по причине, которую я описал ранее. Идею про ограничение вывода в отчет не совсем понял. Речь идет о запрете вывода в отчет строки более определенной длины?

artbear commented 9 years ago

запрете вывода в отчет строки более определенной длины

Да

ПроверитьРавенствоДвоичныхДанных

Давай поанализируем. Предлагай сигнатуру метода и примеры вызова.

simargle commented 9 years ago

Как вариант - ПроверитьРавенствоДвоичныхДанных ([ДвоичныеДанные], [[ДвоичныеДанные]]). В качестве примера использования приведу скриншот реального теста (описание тестового случая я приводил в первом комментарии). binarycompareexample

artbear commented 9 years ago

И реализацию приложи, пожалуйста. Но уже в виде текста :) для base64

simargle commented 9 years ago

Их две у меня :)

  1. В настоящий момент сравнение происходит с помощью сохранения двоичных данных в файл и последующего использования инструмента СравнениеФайлов. Реализация такая (сорри, если форматирование поедет - еще не разбирался как здесь оформлять):
Процедура ПроверитьРавенствоДвоичныхДанных(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт

    #Если Клиент Тогда
    ИмяФайла1 = ПолучитьИмяВременногоФайла();
    ИмяФайла2 = ПолучитьИмяВременногоФайла();

    ДвоичныеДанные1.Записать(ИмяФайла1);
    ДвоичныеДанные2.Записать(ИмяФайла2);

    СравнениеФайлов = Новый СравнениеФайлов;
    СравнениеФайлов.ПервыйФайл      = ИмяФайла1;
    СравнениеФайлов.ВторойФайл      = ИмяФайла2;
    СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.Двоичное;

    ПроверитьИстину(
        СравнениеФайлов.Сравнить(),
        "Файлы должны быть равны"
    );

    УдалитьФайлы(ИмяФайла1);
    УдалитьФайлы(ИмяФайла2);
    #КонецЕсли

КонецПроцедуры
  1. Метод через чистый base64 более прозаичный (прототип):
Процедура ПроверитьРавенствоДвоичныхДанных(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт

    РезультатСравнения = (Base64Строка(ДвоичныеДанные1) = Base64Строка(ДвоичныеДанные1));

    Проверить(РезультатСравнения, "двоичные данные отличаются");

КонецПроцедуры
artbear commented 9 years ago

Исправил тебе форматирование. проверь.

artbear commented 9 years ago

А если подобный код встроить в ПроверитьРавенство ? например, если оба значения из ПроверитьРавенство имеют тип ДвоичныеДанные, то выполнять преобразование в base64, сравнивать полученные строки и выдать ответ. Правда, это неявное поведение, а я его очень не люблю

simargle commented 9 years ago

По форматированию - отлично, спасибо.

В части метода ПроверитьРавенство. Это можно рассматривать с одной стороны как неявное поведение, а с другой - как своеобразный полиморфизм. Как бы то ни было - меня бы устроил любой из этих вариантов.

EvilBeaver commented 9 years ago

Двоичные данные не обязательно преобразовывать к base64, чтобы сравнить. Они могут сравниваться напрямую:

Если ДвоичныеДанные1 = ДвоичныеДанные2 Тогда

simargle commented 9 years ago

Не знал о такой возможности, спасибо.

simargle commented 9 years ago

Может быть тогда действительно имеет смысл вернуться к варианту с нормализацией вывода отчета в табличный документ (ограничение на длину строки при выводе)? Это позволит использовать существующий метод ПроверитьРавенство. Сейчас останавливает то, что данный метод зависает на продолжительное время при выводе в макет представления двоичных данных.

artbear commented 9 years ago

Ага, я также об этом думаю.

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

artbear commented 9 years ago

Предлагаю название задачи поменять на "Нормализация вывода текста при падении утверждений". @simargle Поменяешь? или я сам могу поменять