Написание простой обработки через тестирование




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

39 Comments

  1. Evil Beaver
    кто-то уже применяет эти подходы (раз кто-то написал xddTestRunner)

    Мы применяем и наблюдаем положительный эффект.

    Reply
  2. Xershi

    Эта работа с тестами нужна чтобы выявить косяки разработки?

    Reply
  3. Alien_job

    (1) Evil Beaver, А как вы тестируете отчеты (табличные документы)? Если я рисую табличный документ заранее то он отличается от уже признаком «макет» и отсутствием имен полей. В конце концов я пришел к тому что сначала добиваюсь правильного внешнего вида отчета, сохраняю его в файл и загружаю файл в макет. В результате малейшее изменение требований (изменить формат даты в заголовке) приведет к падению всех тестов.

    Reply
  4. artbear

    Молодец, что юзаешь наш продукт xUnitFor1C.спасибо за статью.

    Только почему не указываешь прямую ссылку на проект?

    И почему мало о нем знаешь? 🙂

    есть сообщество, есть пользователи, есть разработчики, в тч и я, который фактически productOwner продукта.

    есть много многолетнего опыта в тестировании для 1С

    Reply
  5. Alien_job

    (2) Xershi, работа с тестами конечно занимает время — но это время окупается сразу за счет отладки (при таком подходе отладка не нужна). Плюс на выходе получается код покрытый тестами, который проще сопровождать.

    Reply
  6. Alien_job

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

    Reply
  7. artbear

    (6) По тестированию и ТДД есть мое старое выступление с Инфостарт 2012 — статья http://infostart.ru/public/326820

    Также есть видео-обучение от Алексея Лустина и Евгения Павлюка http://infostart.ru/public/328695/

    Также есть мое выступление с Инфостарт 2013 — где я рассказываю про xUnitFor1C

    Примеры есть в самом репозитарии.

    Конечно, я соглашусь, что информации маловато и нужно больше популяризовать.

    Reply
  8. artbear

    (0) На мисте я периодически отвечаю на темы по тестированию

    Например, http://www.forum.mista.ru/topic.php?id=730184 или http://www.forum.mista.ru/topic.php?id=710900

    (6) Что такое «сквозной пример использования» ?

    Еще какие вопросы есть?

    Пиши вопросы по тестированию.

    Готов ответить.

    Можно в личку hangouts «aartbear@gmail.com» или skype «aartbear»

    Reply
  9. awk

    (5) Дешево, быстро, качественно — выбирай любые два.

    Reply
  10. Alien_job

    (8) artbear, возможно после просмотра видео вопросов станет меньше. Сквозной пример — статья в которой демонстрируется написание обработки через тестирование. С использованием всех возможностей xUnitFor1C и с освещением типовых задач тестирования (модули, формы, отчеты, обмены, …).

    Reply
  11. ZhokhovM

    (6) я тоже не нашел примеров. У меня свои наработки: Универсальное тестирование конфигурации (обычные и управляемые формы). Часть 1. Скоро выйдет в свет новая часть.

    Reply
  12. Alien_job

    (11) ZhokhovM, из описания не понятно можно ли вашей обработкой тестировать внешние обработки. У xUnitFor1C есть тесты_ОткрытиеФормКонфигурации.epf — формирует тесты на открытие всех форм и если в конфигурации есть синтаксические ошибки то часть тестов упадет. Правда на УПП 1.3 в лоб использовать её у меня не получилось — многие формы «не предназначены для открытия» =)

    Примеры «нашлись» https://github.com/xDrivenDevelopment/xUnitFor1C/tree/develop/Tests/CommonA­pp .

    Reply
  13. pumbaE

    (12) после первого запуска вы можете прописать себе исключения форм, которые не могут работать просто так.

    Reply
  14. ZhokhovM

    (12) я исключаю формы или предупреждения с помощью cmdow, а так моя публикация проверяет формы: получает объекты форм и открывает форму. А ошибки я копирую из окошка «Информация для технической поддержки», т.к. там показывают полные ошибки чем ошибки в ЖР.

    Reply
  15. artbear

    (10) 1. К сожалению, Это слишком общая формулировка примера. описание будет слишком длинным и специализированным к конкретной конфигурации и задаче, и наверняка будет много лишних деталей, неинтересных читателям.

    2. можно тестировать не отдельно модули, формы, отчеты, обмена, а делать тесты в целом под задачу. часто это бывает проще и эффективнее. Это разделение на юнит-тесты и на приемочные тесты.

    Reply
  16. artbear

    (11) Ты там схитрил и удалил старые и полезные комментарии 🙁

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

    Фактически ты проверяешь не только конфигурацию (т.е. работу разработчика), но и конкретную ИБ и конкретные данные, что не всегда хорошо.

    У тебя в разных ИБ с одной конфигурацией будут выдаваться разные ошибки, что вредно для тестирования, т..к тесты везде должны вести себя одинаково.

    были и еще замечания, но ты их потер 🙁

    Reply
  17. ZhokhovM

    (16) artbear, нет, там были ошибки в редактировании публикации после отказа заключения договора с отделом продаж, поэтому я её удалил и перенес всю информацию на новую, меня просто не устраивал стартмани 1$m.

    Reply
  18. Pr-Mex

    (8) artbear, люди хотят больше реальных примеров.

    Помнишь тему, чтобы сделать примером разработки через тестирование на типовых конфах?

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

    Наша команда разрабатывает конфу, которой уже 7 лет. И только недавно перешли на разработку через тесты. По полной столкнулись с проблемами рефакторинга, легаси кода и т.д.

    Итого — бояться тут нечего. Всё решаемо. Билд сервер крутится, отчет о прохождении тестов приходит.

    Reply
  19. ZhokhovM

    (16) artbear, пока я изучу тесты и реализаций Тесты_ОткрытиеФормКонфигурации.epf и возможно у себя переделаю.

    Reply
  20. magnetto72

    Большое спасибо за статью, позволяющую быстро понять как освоить технику и инструмент.

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

    Можно ли где-то посмотреть пример тестирования кода проведения документов?

    Подскажите существует ли форум где можно задавать вопросы, обсуждать приемы использования xUnitFor1C?

    Reply
  21. Alien_job

    (20) gorokhov.vladislav, полагаю нужно после проведения получить коллекцию движений документа и сравнить её с эталоном.

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

    почему бы не инфостарт?

    пример тестирования

    https://github.com/xDrivenDevelopment/xUnitFor1C/tree/develop/Tests/CommonA­­pp , других нет

    Reply
  22. magnetto72

    (21)

    Спасибо за ответ. Я не могу понять как создать/зафиксировать эталон движений, где он должен сохраниться.

    При тестировании отчета формирую его, создаю макет «Эталон», копирую в него табличный документ, получаю эталон с правильным результатами.

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

    А как зафиксировать эталон для движений в xUnitFor1C?

    Reply
  23. Alien_job

    (22) magnetto72,

    у «Генерация макета на базе реальных данных для xUnitFor1C» есть «СоздатьМакетДанныхНаОснованииЗапроса». Думаю можно выбрать запросом движения документа, создать макет, сохранить его как эталон. В тесте создавать макет на основании запроса и сверять с эталоном.

    Reply
  24. artbear

    (20) gorokhov.vladislav,

    По xUnitFor1C предложение и обсуждение удобнее всего вести в одном из 2 вариантах:

    1. Можно на Инфостарте в комментах к моей статье http://infostart.ru/public/326820/ (Методики и механизмы разработки/тестирования в 1С)

    или

    2. Можно на Гитхабе https://github.com/xDrivenDevelopment/xUnitFor1C/issues

    Reply
  25. artbear

    (22) Ответил в комментах к моей статье.

    Reply
  26. strizhhh

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

    Reply
  27. leemuar

    (26) Задача такая есть. Подключитесь, помогите с этим

    Reply
  28. ivanov660

    (26) Соглашусь с коллегой.

    У нас появилась задача интеграции в наш механизм тестирования юнит тестов автора. Вот с написанием и особенно отладкой тестов что-то не совсем заладилось.

    Простой тест 2+2<>4 написали без проблем, а вот реальный тест проверки формирования по входным документам набора выходных документов пока тяжко.

    Reply
  29. strizhhh

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

    Reply
  30. artbear

    (29) Не совсем так.

    С документацией всегда сложно, разработчики ее не любят делать 🙂

    Тут процесс итерационный, документация набирается постепенно.

    пробовали на Вики проекта xUnitFor1C заходить, там накоплено много информации

    Вики xUnitFor1C

    Reply
  31. strizhhh

    (30) Лично я заходил и некоторая информация мне оттуда помогла, бесспорно. Но там много устаревшей и не актуальной информации. Да и утверждение моё о документации было связано с порогом вхождения: я два дня потратил чтобы найти, вычленить нужную мне часть, отбросить лишнее (устаревшее и нерабочее) и прийти к выводу, что времени только на понятие и практику применения ушло в десятки раз больше, чем на другие инструменты. Конечно, я не отрицаю того факта, что я просто тупой.

    Не хватает также демонстрации реальной (боевой) практики применения инструмента на реальных проектах. Что закрыло бы много вопросов, как мне кажется.

    Reply
  32. for_sale

    (7)

    Добрый день!

    За проект большое спасибо, идея замечательная, реализация (наверное) тоже.

    Один огромный минус — читал Ваши материалы и тут, и на Гитхабе — очень сумбурно, не понятно, где входы, где выходы, с чего начать. Поэтому автору большое спасибо за доступное объяснение.

    У меня вопрос — правильно ли я понимаю, что данный проект реализует только тест кода? И никаких возможностей тестировать интерфейс (открыл форму, выбрал значение, щёлкнул по кнопке), кроме коллекции глюков от 1С под названием Автотестирование, нет?

    Reply
  33. Alien_job

    (32) Есть, раньше называлась vanessa-behavior

    Насколько я понимаю, актуальная версия разрабатывается тут https://github.com/silverbulleters/add

    Простой способ её получить:

    — установить onescript

    — выполнить в консоли opm install add

    В каталоге библиотеки будет файл bddRunner.epf, его открыть в 1С в режиме предприятия, в нем открыть справку.

    Reply
  34. artbear

    (33) (32) Да, проверка поведения системы для управляемого приложения есть в https://github.com/silverbulleters/add

    очень развитые возможности по тестированию интерфейса.

    Reply
  35. artbear

    (31) Мы бы не развивали продукты, которые не используются.

    Продукты как раз и развиваются, т.к. это нужно как нам, так и нашим пользователям/организациям/клиентам.

    По практике применения — у нас большинство примеров как раз основано на реальном применении.

    Из последних — посмотри описание доклада Глеба Стального (ПервыйБит) для Инфостарт 2018 https://event.infostart.ru/2018/agenda/

    Его команда активно запустила набор инженерных практик.

    Тема «Как запустить 1С:ERP 2 на тысячу пользователей и не написать ни одной страницы ТЗ?»

    В рамках доклада расскажу о процессе и результатах перехода 3 scrum-команд на использование современных инженерных практик (разработка через поведение, ночные сборки, непрерывный анализ качества кода) на проектах 1С.

    — Почему мы всегда готовим EPC-диаграммы, и как они помогают нам проектировать не только систему, но и все интеграции (да, мы на проектах, как правило, используем RabbitMQ);

    — Как мы разрабатываем фичи (BDD), как структурируем, чтобы сохранить читаемость на больших проектах (когда BDD-сценарии занимают 10 тысяч строк) и как мы смогли отказаться от постановок задач в других форматах (кроме задач по обмену, там xsd);

    — Зачем гит консультанту;

    Рассмотрю полный цикл работ на примерах конкретных проектов. Также покажу какие инструменты и как мы используем (Slack, Zoom, Jira, Confluence, JSD, Bitbucket, Vanessa Behavior, Jenkins, SonarQube, Allure и т.п.)

    Reply
  36. artbear

    (31)

    Не хватает также демонстрации реальной (боевой) практики применения инструмента на реальных проектах. Что закрыло бы много вопросов, как мне кажется.

    Расскажи, какой именно демонстрации тебе не хватает.

    Каких примеров не хватает?

    Как я уже писал, хорошей документации всегда не хватает.

    Мы открыты любым предложениям по улучшению наших бесплатных и открытых продуктов

    Reply
  37. strizhhh

    (37) Между сообщениями год. TDD и CI активно используются в промышленных форматах. 🙂

    Reply
  38. artbear

    (38) Твое сообщение пропущено, т.к. оно не находится в официальных каналах общения 🙁

    и его тупо не заметили.

    как раз при промышленных масштабах нет времени изучать все источники, хватает и официальных.

    Reply
  39. flashdancer

    Спасибо огромное за такое пояснение!!! Все понятно и одновременно ничего лишнего!

    Мне очень помогло!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *