Тестер: частые вопросы




Принцип обмена данными из 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='\

24 Comments

  1. olegtymko

    Огонь! Надо будет попробовать вашу систему тестирования.

    Reply
  2. karpik666

    Подскажите тестер только для управляемых форм или для обычных тоже подойдет?

    Reply
  3. ivanov660

    Подскажите:

    — Запуск через командную строку еще не реализовали?

    — И выгрузку результатов выполнения в один из форматов отчетов XML JUnit, Allure или другой?

    Reply
  4. grumagargler

    (2) только для управляемых

    Reply
  5. grumagargler

    (3) Запуск тестера с передачей ключей был изначально, но вероятно я не понял ваш вопрос.

    Тесты, скрипты для CI и отчетность, всё внутри тестера, делать внешнюю задач пока не поступало.

    Reply
  6. acsent

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

    Типо как в xUnitFor1C

    Reply
  7. grumagargler

    (6)

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

    Причин много, вот некоторые из них:

    — скорость написания-запуска, в одном окне на втором мониторе

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

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

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

    Reply
  8. Fragster

    Отличный инструмент, действительно удобно. Жду развития плагина для vscode (почти всегда неправильно работает intellisense по элементам управления :))

    При использовании возник вопрос:

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

    ОписаниеСтроки = Новый Соответствие();
    ОписаниеСтроки.Вставить(«Колонка 1», «Представление 1»); // возможно ли тут использовать не представление, а значение?
    ОписаниеСтроки.Вставить(«Колонка 1», «Представление 2»); // возможно ли тут использовать не представление, а значение?
    Список = Получить(«!ТабличнаяЧасть»);
    Если Не Список.ПерейтиКСтроке(ОписаниеСтроки) Тогда
    ВызватьИсключение «Строка не найдена»;
    КонецЕсли;
    
    Проверить ( «!ТабличнаяЧастьПоле», ОжидаемоеЗначение); // тут ошибка 18: Неподходящий тип элемента управления для вызванного действия. 

    Показать

    Reply
  9. Fragster

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

    Проверить(«!ТабличнаяЧасть / !ТабличнаяЧастьПоле», 19500); // для текущей строки

    Проверить(«!ТабличнаяЧасть / !ТабличнаяЧастьПоле [3]», 19500); // для строки по номеру

    Reply
  10. grumagargler

    (9) День добрый! Спасибо за отзыв!

    Для проверки, вы еще можете передать родителя в виде третьего параметра:

    таблица = Получить ( «!Товары» );

    Проверить(«!ТабличнаяЧастьПоле», 19500, товары);

    Развитие плагина идет, но пока интелисенс работаем в основном на подброс названия поля по типу, согласно открытого в текущий момент тестового приложения.

    Приглашаю вас в чат, там я смогу более оперативно отвечать на вопросы.

    Reply
  11. Fragster

    Еще прошу добавить в ЧаВо — для проверки шаблона таблицы, открывающейся в новом окне табличного документа — в качестве имени поля надо передавать пустую строку (на странице элементов формы отображается <Поле>)

    Нажать(«!ФормаПечатьРасчета»);
    Здесь();
    ПроверитьШаблон ( «» );
    Reply
  12. user670203_terskovaoa

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

    Reply
  13. grumagargler

    (12) Добрый день. Для этого можно воспользоваться методом Дождаться () с передачей заголовка нужного окна. Метод вернет ложь, если такого окна найти не удается, и в этом случае вы можете инициировать открытие нужного документа/формы обработки. Если останутся вопросы — приходите в чат поддержки на https://gitter.im/tester1c/Lobby

    Reply
  14. user670203_terskovaoa

    Спасибо. Это не форма и не документ, это получается кнопка на форме «Открыть смену» и «Закрыть смену»

    Reply
  15. sCHTASS

    Не совсем по теме, но может кто даст ответ.

    Нужно написать проверку попытки пользователя записать пустой документ — документ не должен записываться в этом случае. Код теста обернул в Попытка-Исключение, чтобы анализировать ошибку. Но все равно тест падает с ошибкой. Что тут можно сделать?

    Reply
  16. grumagargler

    (15) Я боюсь не понял ваш случай, но попробую привести пару соображений.

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

    Здесь ();
    Нажать ( «#ФормаПровестиИЗакрыть» );
    попытка
    ПроверитьОшибки ();
    исключение
    Стоп ( «Ошибка проведения документа!» );
    конецпопытки;

    Кроме этого, в конце выполнения теста, тестер сам проверят есть ошибки или нет. Чтобы это отключить — в коде теста напишите:

    СтандартнаяОбработка = ложь;
    Reply
  17. sCHTASS

    (16) Мне нужно проверить, чтобы пустой документ нельзя записать. Я его создаю и пытаюсь записать через кнопку «Записать». При выполнении метода Нажать() валиться тест с ошибкой.

    Reply
  18. grumagargler

    (17) код выше, по идее и решает эту задачу. Вместо #ФормаПровестиИЗакрыть напишите #ФормаЗаписать. Платформа попробует записать документ. Если ошибки будут — вы попадете в исключение, если ошибок не будет, тогда код продолжит своё выполнение. Вот пример:

    Здесь ();
    Нажать ( «#ФормаЗаписать» );
    попытка
    ПроверитьОшибки ();
    ошибокНебыло = истина;
    исключение
    ошибокНебыло = ложь;
    конецпопытки;
    если ( ошибокНебыло ) тогда
    Стоп ( «Запись пустого документ должна была быть с ошибкой!» );
    конецесли;
    Сообщить («Ошибки были показаты, всё хорошо»);
    СтандартнаяОбработка = ложь; // чтобы тестер не выдал ошибку, он же не знает, что наличие ошибки — не ошибка
    

    Показать

    Reply
  19. sCHTASS

    Спасибо. То что надо.

    Reply
  20. FreeArcher

    Подскажите, как посчитать и итог, например, по колонке Сумма в таблице

    таблица = Получить ( «!Товары» );

    А дальше я не разобрался?

    Reply
  21. grumagargler

    (20) см. в справке на сайте test1c.com раздел Как подсчитать итог по колонке таблицы?

    Reply
  22. FreeArcher

    (21) Увидел, спасибо.

    А есть где полный перечень методов у объектов тестера?

    Наверняка кроме список.ПерейтиКПервойСтроке () есть ещё что-нибудь и примеры не все описывают.

    Напрягает не понимание что из себя представляет полученный объект…

    Reply
  23. grumagargler

    (22) методы и свойства тестируемых объектов описаны в синтаксис-помощнике, в конфигураторе. Методы самого тестера, на сайте test1c.com

    Reply
  24. FreeArcher

    (23) Нашел.

    Reply

Leave a Comment

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