Проектирование и разработка системы обработки данных, получаемых ФГУП "Почта России" от ОАО "Ростелеком"
Описание формата и структуры входных и выходных файлов. Выбор языка программирования и Perl модуля для генерации документов в формате pdf. Валидация почтового адреса. Процесс создания алгоритма обработки данных. Структура штрихкодового идентификатора.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 04.11.2015 |
Размер файла | 1,6 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
2. Считается сумма символов, расположенных в четных позициях числа.
3. Суммируются результаты пунктов 1 и 2.
4. Вычисляется минимальное число, которое необходимо прибавить к результату из пункта 3, чтобы получить сумму, кратную 10. Получившееся число и будет контрольным разрядом. (Например, после выполнения пункта 3, получилось число 27, значит контрольный разряд 3). Если результат в пункте 3 кратен 10, то контрольное число 0.
Коды ШПИ будем хранить в отдельной таблице в базе данных. Необходимо разработать также программу для генерации кодов ШПИ по введенному пользователем диапазону, проверки контрольной цифры, и внесения диапазона кодов ШПИ в базу данных.
Входные данные:
· Xml файл с данными клиентов, упакованный в архив формата zip.
· Таблица в БД с кодами ШПИ.
· Таблица в БД, хранящая соответствие почтового индекса региону
Выходные данные:
· AFP файл, содержащий почтовые отправления для печати
· ZIP архив с электронными списками для прогрузки в ПО «Партионная Почта»
· XML файл, содержащий id клиента и присвоенный ему ШПИ. Файл ежедневно направляется клиенту
· Акт приема-передачи данных для передачи печатных файлов на производство
Списки для прогрузки в ПО Партионная Почта будут автоматически рассылаться из программы по e-mail. Готовые файлы печати должны также автоматически загружаться на ФТП сервер компании, после чего должно приходить письмо-уведомление начальнику цеха и системным администраторам о готовности файлов к печати, также содержащее акт приема-передачи. Акт приема-передачи должен содержать в табличном виде все файлы для печати, количество страниц в каждом файле, количество отправлений, размер отправлений и тип печати (односторонняя/двухсторонняя).
4.2 Многопоточная обработка данных в Perl
Для Perl есть несколько вариантов реализации многопоточной обработки данных. Рассмотрим основные способы.
4.2.1 Fork
Для создания потомков процесса Perl использует системный вызов fork. Обычно он используется совместно с exec. Функция exec выполняет команду, переданную ей в аргументах, и завершает свою работу после выполнения. Вызов fork возвращает undef (неопределенное значение) в случае неудачи, иначе в родительском процессе он возвращает ненулевое значение, а в процессе-потомке нуль. При вызове функции fork создается процесс-потомок, который копирует все данные от родительского процесса. Новый процесс получает своё собственное адресное пространство и начинает существовать независимо от родителя. Такое ветвление процессов - широко распространённая практика в многозадачных средах, способных выполнять сразу несколько потоков команд. Но ветвление - не единственный способ воспользоваться преимуществами многопоточности.
4.2.2 Threads
Другой подход - создание нитей (threads). При стандартном fork-подходе одно отдельное адресное пространство обрабатывается одним потоком команд. Но нет никаких принципиальных ограничений на количество потоков команд, работающих в одном адресном пространстве, поэтому потоки и принято называть нитями. Нити позволяют операционной системе выполнять программу сразу на нескольких процессорах или продолжать выполнение одной нити, пока другая ожидает ввода/вывода, сетевого соединения или других событий. Подобные возможности доступны и при fork-ветвлении, но нити дают некоторое дополнительное преимущество перед ветвлением. Во-первых, при переключении между нитями системе не приходится менять контекст задачи. Во-вторых, передача данных между нитями происходит гораздо проще, чем между отдельными процессами, благодаря общей памяти.
Поддержка нитей в программе включается при подключении модуля threads командой use threads. Для успешного подключения threads, требуется, чтобы Perl был собран с поддержкой многопоточности, иначе интерпертатор выведет сообщение об ошибке.
При использовании threads часто происходят утечки памяти, отработавшие процессы не освобождают память, причем отловить эти утечки часто очень трудно. Также использование threads требует больше памяти, чем fork.
4.2.3 Специализированные модули для параллельного выполнения процессов
В CPAN есть несколько модулей, предназначенных для параллельного выполнения процессов. Все они в той или иной степени являются надстройками над fork или threads и позволяют несущественно облегчить работу по распараллеливанию процессов.
Но есть отдельный модуль под названием AnyEvent::Fork. В описании модуля сказано, что работа с потоками через этот модуль, быстрее, чем запуск fork+exec. Также модуль позволяет автоматически отслеживать завершившиеся процессы, имеет возможность передачи параметров в выполняемые потоки. В модуле есть функция, определяющая количество процессоров в системе.
Для параллельного выполнения процессов в данном проекте используем модуль AnyEvent::Fork.
4.3 Описание основных модулей системы
4.3.1 Модуль F103
Модуль предназначен для создания бумажных и электронных списков по форме 103. Бумажный список - это список в формате pdf, который прикрепляется в конце каждого печатного файла. Модуль написан с применением объектно-ориентированного подхода. Глобальные переменные, значения которых используются по умолчанию, перечислены в таблице 10.
Таблица 1010 - Глобальные переменные модуля F103
Переменная |
Значение |
Описание |
|
$RPO_CAT |
'Заказное письмо' |
Категория отправления |
|
$WEIGHT |
0.02 |
Вес отправления |
|
$PRICE_REGISTERED_LETTER |
35.00 |
Цена отправления |
|
$xsl_f103 |
'/home/vrag/perl/Modules/f103.xsl' |
Путь к файлу, содержащему xsl схему |
|
$temp_dir |
'/var/tmp/rostelecom' |
Временная папка для хранения файлов |
Для создания объекта класса F103, вызывается конструктор (функция new). Параметры, принимаемые конструктором, перечислены в таблице 11.
Таблица 1111 - Параметры конструктора модуля F103
Аргумент |
Обязательный/Значение по умолчанию |
Описание |
|
-lists_num |
Обязательный |
Номер списка |
|
-sender |
Обязательный |
Наименование клиента |
|
-ops |
Необязательный/«» |
Наименование отделения почтовой связи, осуществляющего приемку отправлений |
|
-dir |
Обязательный |
Директория, в которую будет сохранен файл |
|
-price |
Необязательный/значение переменной $PRICE_REGISTERED_LETTER |
Цена отправления |
|
-weight |
Необязательный/ |
Вес отправления, по умолчанию вес отправления до 3-х вложений |
|
-rpo_cat |
Необязательный/«Заказное письмо» |
Категория почтового отправления |
Пример вызова конструктора:
$F103 = F103::new (-sender => 'ОАО Ростелеком', -list_num => 2, -ops => 'ОПС 140961 МР АСЦ',);
В случае успешного выполнения возвращается 1, в случае неудачи 0.
Создание бумажного списка
Метод: generate_f103
Функция получает на вход массив хэшей с данными и трансформирует его в XML файл. Функция также производит подсчет общего количетсва стоимости отправлений, общий вес, производит перевод сумм в текстовое представление (сумма прописью). Pdf файл создается XSLT процессором Apache Fop, данные берутся из XML файла (генерируемый функцией generate_f103), а схема трансформации данных из XSL файла.
XSLT (Extensible Stylesheet Language for Transformations, расширяемый язык стилей для преобразований) официально рекомендован комитетом W3C (World Wide Web Consortium). Он представляет гибкие, мощные средства для преобразования XML-документов в другие форматы, например в документ HTML, другой документ XML, файл PDF (Portable Document Format) [18].
Схема генерации файла с использованием XSLT процессора выбрана из-за того, что в PDF модулях для Perl нет возможности генерации в файлах pdf таблиц с динамическими данными, т.е. модули предоставляют возможность вывода текста в pdf по определенным координатам, а возможность вывода текста в определенную ячейку таблицы отсутсвует. На языке XSLT 1.0 была написана схема генерации данных f103.xsl. Модуль на Perl создает xml файл с данными формы 103, который вместе с xsl схемой подаётся на вход Apache FOP. Apache FOP производит трансформацию данных согласно схеме xsl и на выходе создает pdf файл.
Общая блок-схема алгоритма представлена на рисунке 4.
Параметры вызова функции перечислены в таблице 12.
Таблица 1212 - Параметры вызова функции generate_f103
Аргумент |
Обязательный/Значение по умолчанию |
Описание |
|
-dir |
Обязательный |
Директория, в которую будет сохранен файл |
|
-data |
Обязательный |
Ссылка на массив хэшей с данными об отправлениях. Ключи хэша: barcode zip name address |
Возвращаемое значение: Массив (Полный путь к сгенерированному файлу, статус).
Действие при ошибке: Вывод сообщения об ошибке и возврат 0.
Пример вызова функции:
$f103 - >generate_f103 (-dir => $TEMP_DIR, -data => $DATA);
Создание электронного списка
Рисунок 44 - Схема работы функции generate_f103
Метод: generate_ini
Функция осуществляет создание 2-х файлов:
· txt файл, который содержит в каждой строке информацию об одном отправлении (ШПИ, почтовый индекс, вес, цена, адрес получателя);
· ini файл, содержащий итоговую информацию обо всех отправлениях, перечисленных в txt файле (суммарный вес отправлений, суммарная цена, ИНН отправителя, дата отправки и т.д..)
Оба файла помещаются в архив формата zip с удалением исходных файлов. Схема работы функции показана на рисунке 5.
Параметры вызова функции перечислены в таблице 13.
Возвращаемое значение: Массив (Полный путь к сгенерированному файлу, статус).
Действие при ошибке: Вывод сообщения об ошибке и возврат 0.
Рисунок 55 - Схема работы функции generate_ini
Таблица 1313 - Параметры вызова функции generate_ini
Аргумент |
Обязательный/Значение по умолчанию |
Описание |
|
-inn |
Обязательный |
ИНН клиента |
|
-dir |
Обязательный |
Директория, в которую будет сохранен файл |
|
-data |
Обязательный |
Ссылка на массив хэшей с данными об отправлениях. Ключи хэша: barcode zip area city weight price |
Пример вызова функции:
$f103->generate_ini_new (-inn => $inn, -dir => $OUTPUT_DIR, -data => $DATA);
4.3.2 Модуль AddressInfo
Модуль предназначен для валидации почтового адреса и разбора его на составляющие части. Модуль написан в ООП стиле и содержит конструктор (фунция new) и несколько функций для доступа к данным. Для валидации данных необходимо создать объект класса AddressInfo, вызовом конструктора, в параметрах конструктора передается адрес, который необходимо провалидировать. Пример создания объекта
my $addr = AddressInfo::new ('Адрес для валидации');
В случае успешного выполнения, функция вернет 1 и присвоит ссылку на объект класса AddressInfo переменной $addr. В случае ошибки, функция возвращает 0. Для получения информации об адресе, необходимо вызвать метод get_info. Все методы класса AddressInfo перечислены в таблице 14.
Таблица 1414 - Методы класса AddressInfo
Название метода |
Параметры |
Возвращаемое значение |
Описание |
|
new |
address - адрес для валидации |
$self - ссылка на объект класса AddressInfo |
Конструктор класса |
|
get_info |
- |
1 - в случае успешного выполнения 0 - в случае ошибки |
Метод получения информации об адресе |
|
status |
- |
1 - в случае успешной валидации адреса 0 - при невозможности восстановить адрес |
Метод, возвращающий статус валидации адреса |
|
source_address |
- |
Адрес до валидации |
Метод, возвращающий исходный адрес, до валидации |
|
post_index |
- |
Почтовый индекс после валидации, 0 - при ошибке валидации |
Метод, возвращающий только почтовый индекс, если его удалось получить, иначе возвращает 0 |
|
post_index_write |
post_index - почтовый индекс |
- |
Метод, записывающий почтовый индекс, переданный в параметрах вызова, в свойства объекта. Private метод для использования внутри класса. |
|
post_address |
- |
Строка, содержащая почтовый адрес после валидации, 0 - при ошибке валидации |
Метод, возвращающий почтовый адрес в форме, соответствующей требованиям почтовых правил |
|
address_hash |
- |
Сссылка на хэш, содержащий почтовый адрес после валидации, 0 - при ошибке валидации |
Метод, возвращающий разобранный на составляющие части адрес в виде хэша (ключи: region, area, city, street) |
|
error |
- |
Сообщение об ошибке, 0 - в случае отсутствия ошибок |
Метод, возвращающий сообщение об ошибке, если она произошла, иначе возвращает 0 |
Основным методом класса является метод get_info, остальные методы, являются методами-акцессорами, т.е. предоставляют доступ к свойствам класса и не выполняют никаких функций. Поэтому описывать будем только алгоритм метода get_info
Метод get_info
При вызове данного метода, на сервер валидации адресов отправляется запрос с адресом, который требуется проверить. В ответ сервис возвращает 2 переменных статуса (код правильности адреса и код полноты адреса). Если код правильности адреса равен GOOD UNDEF_05 UNDEF_06, а код полноты VALIDATED NOT_VALIDATED_HAS_UNPARSED_PARTS NOT_VALIDATED_HAS_ASSUMPTION NOT_VALIDATED_HAS_
NO_KLADR_RECORD, то адрес считается валидированным. Метод заносит в хэш основные поля адреса, возвращенные сервером и возвращает 1. В случае если адрес не удалось валидировать, метод возвращает 0. Блок-схема метода представлена на рисунке 6.
Рисунок 66 - Структурная схема метода get_info
4.3.3 Модуль ScpUpload
Модуль предназначен для загрузки одного файла на сервер с доступом по протоколу ssh. Модуль содержит глобальную переменную $SERVER (адрес сервера, на который производится загрузка), которая имеет значение по умолчанию '62.176.2.49'. Модуль содержит единственную функцию scp_upload. Параметры вызова функции перечислены в таблице 15.
Таблица 1515 - Параметры вызова функции scp_upload
Аргумент |
Обязательный/Значение по умолчанию |
Описание |
|
-fname |
Обязательный |
Полный путь к файлу на локальном ПК, который требуется загрузить на сервер |
|
-rdir |
Обязательный |
Папка на удаленном сервере, в которую производится загрузка. Папка должна быть создана заранее, при отсутствии папки на сервере, выводится ошибка |
|
-server |
Необязательный/$SERVER |
Адрес сервера куда производится загрузка файлов |
|
-subdir |
Необязательный |
Поддиректория, в которую требуется осуществить загрузку. При ее отсутствии, создается на сервере |
Структурная схема функции scp_upload представлена на рисунке 7.
Рисунок 77 - Структурная схема функции scp_upload
4.3.4 Модуль APP
Модуль предназначен для создания акта приема-передачи в формате Microsoft Excel 2003 (.xls). Модуль содержит 2 функции, видимые снаружи: create_app, send_app.
Функция create_app
Функция предназначена для непосредственного создания Акта приема-перадачи в виде файла в формате xls. В функцию передается массив хэшей с данными, где один элемент массива содержит одну строку в таблице Акта приема-передачи. Для создания файла в формате Microsoft Excel 2003, функция использует модуль Spreadsheet::WriteExcel 2.40.
В случае успешного выполнения функция возвращает полный путь к созданному файлу, в случае ошибки - 0. Параметры вызова функции перечислены в таблице 16.
Таблица 1616 - Параметры вызова функции create_app
Аргумент |
Обязательный/ Значение по умолчанию |
Описание |
|
-dataref |
Обязательный |
Ссылка на массив хешей с данными для акта приема-передачи. Ключи хэша filename - имя файла в таблице type - формат страницы (необязательный) sheets_count - количество листов sends_count - количество отправлений |
|
-dir |
Необязательный/ Текущая директория |
Полный путь к папке для записи файла |
|
-company |
Необязательный/'' |
Название клиента-отправителя писем |
|
-region |
Необязательный/no |
Флаг, указывающий, надо ли указать название региона в имени файла. Номер региона берется из папки, переданной в аргументе -dir |
|
-short_ company_name |
Необязательный/'' |
Краткое название компании, указывается в имени файла, содержащего АПП |
|
-type |
Необязательный/'А4 «Симплекс»' |
Тип бумаги. Если в хэше, в данных (аргумент -dataref) передан параметр type, то используется он в качестве формата страницы |
|
-num |
Необязательный/ Номер дня в году |
Номер акта приема-передачи. Используется в имени файла и в теле акта |
Структурная схема функции create_app представлена на рисунке 8.
Рисунок 88 - Структурная схема функции create_app
Функция send_app
Функция позволяет отправить акт приема-передачи по e-mail. Функция представляет собой упрощенный интерфейс к модулю SendMail. Параметры вызова функции представлены в таблице 17.
Таблица 1717 - Параметры вызова функции send_app
Аргумент |
Обязательный/ Значение по умолчанию |
Описание |
|
-mail_rcpt |
Обязательный |
Получатель письма, несколько получателей разделяются символом ';' |
|
-subj |
Обязательный |
Тема письма |
|
-msg |
Обязательный |
Тело письма |
|
-app_fname |
Обязательный |
Путь к файлу, который требуется вложить в письмо |
В случае успешного выполнения, функция возвращает 1, иначе - 0. Так как алгоритм простой, блок-схему можно не показывать.
4.3.5 Модуль SendMail
Модуль предназначен для отправки письма по электронной почте, с вложением файла или без вложений. Последняя рабочая версия модуля: 1.10. Модуль написан с применением объектно-ориентированного подхода и состоит из конструктора и метода send. Также модуль содержит несколько вспомогательных функций, которые недоступны снаружи и предназначены для работы основной функции send. Учетные данные, использующиеся для подключения к серверу хранятся в глобальных переменных, которые перечислены в таблице 18.
Таблица 1818 - Глобальные переменные модуля SendMail
Имя переменной |
Значение по умолчанию |
|
$SERVER |
'10.132.0.40' |
|
$MAILBOX |
'p.andryushin@cgppost.ru' |
|
$MAIL_LOGIN |
'pavel.andryushin' |
|
$MAIL_PWD |
'***********' |
Переопределить параметры по умолчанию можно с помощью функции set_param:
SendMail::send_param (-server => '8.8.8.5', -mailbox => 'new@mail.ru', -login => 'admin', -password => 'admin');
Для создания объекта класса SendMail необходимо вызвать конструктор new и передать в него свойства объекта. Пример создания объекта
my $mail = SendMail::new (-email => 'receipt@mail.com', -subj => «Тема письма», -body => «Сообщение», -attachment => [array_ref]); где
· -email Получатель пиьма
· -subj Тема письма
· -body Тело письма
· -attachment Ссылка на массив, содержащий пути к файлам, которые требуется прикрепить к письму.
Для выполнения отправки письма, необходимо вызвать метод send
$mail -> send();
Метод send
Вызов данного метода производит отправку письма. При удачном выполнении, метод возвращает 1. При возникновении ошибки, метод возвращает 0 и записывает сообщение об ошибке в переменную класса. Получить сообщение об ошибке можно вызовом метода error
$mail->error();
Для отправки письма через электронную почту, модуль использует протокол SMTP, как наиболее просто реализуемый. Общение с сервером происходит через модуль IO::Socket, который позволяет открывать подключение к удаленному серверу и осуществлять прием и передачу данных на/с сервера.
Структурная схема метода send представлена на рисунке 9.
Рисунок 99 - Структурная схема метода send
4.3.6 Модуль Pdf2Afp
Модуль предназначен для конвертирования из формата pdf или формата xsl-fo в формат afp. Для конвертирования модуль использует внешнюю программу cpmill. Есть версия утилиты cpmill под Linux и под Windows. Для Linux утилиты cpmill лицензирован только входной формат pdf, поэтому для конвертации из формата xsl-fo необходимо использовать Windows версию утилиты cpmill. Windows версия утилиты запускается через утилиту wine (эмуляция Windows программ в Linux системах). Модуль содержит одну основную функцию, доступную снаружи - pdf2afp.
Функция pdf2afp
В функцию необходимо передать 4 параметра в таком порядке:
1. Путь к pdf файлу
2. Путь к afp файлу
3. Название formdefinition для afp файла
4. Тип утилиты (wine или linux)
Если в функцию передано другое количество параметров, функция выведет сообщение об ошибке.
Структурная схема функции представлена на рисунке 10.
Рисунок 1010 - Структурная схема функции pdf2afp
Функция возвращает 1 при успешном завершении, 0 при ошибке. Пример вызова функции:
pdf2afp ('/home/test/test.pdf', '/home/test/test.afp', 'F1N20010', 'wine');
Модуль PDF_Features
Модуль содержит в себе основные функции для работы с pdf файлами, такие как:
· collect - представляет возможность собрать несколько pdf документов в один файл
· draw_address вывод адресного блока на документе pdf
· draw_barcode вывод кода ШПИ по стандартам Почты России на документе pdf
Функция draw_address использует для вывода адресной информации 3 шрифта в формате TrueType (Times New Roman, Times New Roman Bold, Arial Bold). Шрифты располагаются в папке «/opt/perl/fonts», полный путь к ним задан в глобальных переменных модуля ($times_font_file, $times_b_font_file, $arialb_font_file).
Функция collect
Функция собирает несколько документов в формате pdf в один. Выходной файл задается параметром -fname, список файлов, которые требуется объеденить передаются параметром -array или параметром -pdf_dir. Также можно задать параметр -unlink, тогда, после сборки файлов в один, исходные документы будут удалены. Все параметры перечислены в таб. 19.
Таблица 1919 - Параметры функции collect
Аргумент |
Обязательный/ Значение по умолчанию |
Описание |
|
-fname |
Обязательный |
Полный путь к файлу, в который будут собраны исходные документы |
|
-array |
Обязательный |
Ссылка на массив, содержащая пути к исходным файлам, которые надо объединить |
|
-pdf_dir |
Путь к папке, содержащей файлы pdf. При указании данного параметра, в качестве исходных документов будут выбраны все файлы с расширением .pdf в папке -pdf_dir |
||
-unlink |
Необязательный/0 |
Если принимает любое значение, кроме 0, то после объединения, исходные документы будут удалены |
Пример вызова функции collect
collect (-fname => 'collect.pdf', -array => $pdf_array, -unlink => 1);
Структурная схема функции представлена на рисунке 11.
Рисунок 1111 - Структурная схема функции collect
Функция draw_address_block
Функция позволяет вывести на объект класса PDF::API2 адресный блок по стандартам Почты России. Координаты расположения адресного блока могут задаваться в параметрах вызова функции. Адресное поле выводится шрифтом Times New Roman, размером 10пт. Индекс выводится шрифтом Arial Bold 13 кегля. Если адресное поле или поле отправителя не умещаются на одной строке, то они разбиваются на несколько строк с помощью функции splits, разбиение строки на подстроки производится по символам (' ', ',', '.'). По умолчанию адресный блок выводится в координатах для листа формата А4, складываемого Z-фальцем, отправляемого в конверте С65. Внешний вид адресного блока, получаемого при помощи функции draw_address_block, представлен на рисунке 12.
Рисунок 1212 - Адресный блок, получаемый функцией draw_address_block
Параметры вызова функции draw_address перечислены в таблице 20.
Таблица 2020 - Аргументы вызова функции draw_address
Аргумент |
Обязательный/ Значение по умолчанию |
Описание |
|
-page |
Обязательный |
Объект страницы класса PDF::API2 |
|
|
Обязательный |
Объект документа класса PDF::API2 |
|
-x |
Необязательный /125mm |
Значение координаты х для размещения адресного блока |
|
-y |
Необязательный /239.3mm |
Значение координаты y для размещения адресного блока |
|
-fio |
Необязательный /'' |
Поле адресования «Кому» |
|
-address |
Обязательный |
Поле адреса «Куда» |
|
-post_index |
Обязательный |
Поле индекса |
Структурная схема функции представлена на рисунке 13.
Рисунок 1313 - Структурная схема функции draw_address_block
Пример вызова функции:
draw_address_block (
-pdf => $pdf,
-page => $page,
-fio => $data->{fio},
-address => $data->{address},
'-x'=> $x,
'-y'=> $y,
-post_index => $data->{post_index},
);
Функция draw_barcode
Функция осуществляет вывод на документ pdf ШПИ кода по стандартам Почты России. Сверху над штрих-кодом выводится надпись «Почта России», справа - буквы «З/П», что означает заказное письмо. Снизу, под штрих-кодом выводится цифровое представление штрих-кода, при этом штрих-код разбивается на группы \d{6} \d{2} \d{5} \d{1}. Пять цифр в штрих-коде, представляющих собой номер по порядку, выделяются полужирным начертанием шрифта. Внешний вид штрих-кода, получаемого функцией draw_barcode представлен на рисунке 14.
Рисунок 1414 - Штрих-код, генерируемый функцией draw_barcode
Штрих-код должен содержать строго 14 цифр, в функции выполняется проверка переданного значения на соответствие данному требованию, если переданное значение имеет другое количество цифр или содержит буквы или другие символы, то функция выводит сообщение об ошибке и возвращает значение 0.
Параметры вызова функции draw_barcode перечислены в таблице 21.
Таблица 2121 - Параметры вызова функции draw_barcode
Аргумент |
Обязательный/Значение по умолчанию |
Описание |
|
-page |
Обязательный |
Объект страницы класса PDF::API2 |
|
|
Обязательный |
Объект документа класса PDF::API2 |
|
-x |
Необязательный /115mm |
Значение координаты х для размещения адресного блока |
|
-y |
Необязательный /245mm |
Значение координаты y для размещения адресного блока |
|
-shpi |
Обязательный |
Числовое представление штрих-кода отправления |
Структурная схема функции представлена на рисунке 15.
Рисунок 1515 - Структурная схема функции draw_barcode
Пример вызова функции draw_barcode:
draw_barcode (
-pdf=> $pdf,
-page=> $page,
'-x' => $x - 10/mm,
'-y'=> $y + 5.7/mm,
-shpi=> $data->{shpi},
) ;
4.3.7 Модуль Rostelecom
Модуль содержит основные функции для обработки отправлений только для клиента ОАО «Ростелеком». Модуль написан в объектно-ориентированном стиле и содержит конструктор (метод new) и несколько методов для обработки данных. В случае возникновения ошибки методы записывают сообщение об ошибке в объект класса, и возвращают значение 0. После каждого выполнения метода необходимо проверять возвращаемое значение и, если оно равно 0, вызвать метод error() для получения сообщения об ошибке. При успешном выполнении, методы возвращают 1.
В глобальных переменных модуля хранится информация для подключения к базе данных, а также путь к шрифтам в формате True Type (.ttf), которые используются для нанесения персонализации на макеты. Для переопределения хранящегося в глобальных переменных значения, в модуле есть функция set_param. Значения глобальных переменных и параметры вызова функции set_param представлены в таблице 22.
Таблица 2222 - Значения глобальных переменных и параметры вызова функции set_param
Глобальная переменная |
Значение по умолчанию |
Параметр функции set_param для переопределения значения |
Описание переменной |
|
$DB->{login} |
'rostelecom' |
-db_login |
Имя пользователя БД |
|
$DB->{password} |
'4574yr4yreyre' |
-db_password |
Пароль от БД |
|
$DB->{host} |
'127.0.0.1' |
-db_host |
Адрес сервера БД |
|
$DB->{name} |
'rostelecom' |
-db_name |
Имя БД |
|
$TEMP_DIR |
'/var/tmp/rostelecom' |
-temp_dir |
Путь к временной папке для хранения временныхфайлов во время работы программы |
|
$FONT_FILE |
'/opt/perl/font/Times_New_Roman.ttf' |
-font_file |
Путь к шрифту Times New Roman |
|
$FONT_B_FILE |
'/opt/perl/font/Times_New_Roman_bold.ttf' |
-font_b_file |
Путь к шрифту Times New Roman Bold |
|
$ARIAL_FONT_FILE |
'/opt/perl/font/ARICYR.ttf' |
-arial_font_file |
Путь к шрифту Arial |
|
$ARIAL_FONT_B_FILE |
'/opt/perl/font/ARICYRB.ttf' |
-arial_font_b_file |
Путь к шрифту Arial Bold |
Методы модуля Rostelecom и их описание представлены ниже.
Конструктор
В качестве конструктора используется метод new. Конструктор создает объект класса Rostelecom. В случае успешного выполнения, конструктор возвращает ссылку на объект класса Rostelecom, в случае ошибки, в стандартный поток ошибок (STDERR) выводится сообщение об ошибке и возвращается значение 0. Параметры конструктора перечислены в таб. 23.
Таблица 2323 - Параметры вызова конструктора класса Rostelecom
Аргумент |
Обязательный/Значение по умолчанию |
Описание |
|
-output_dir |
Обязательный |
Полный путь к папке, в которую будут складываться выходные файлы |
|
-template |
Обязательный |
Полный путь к файлу - макету отправления (в формате pdf). При передачи параметра, конструктор проверяет существование файла и доступ к нему. Если файл не существует, выводится сообщение об ошибке. |
|
-cpus |
Необязательный /4 |
Количество потоков для обработки данных |
|
-company |
Необязательный /'ОАО «Ростелеком»' |
Название компании |
|
-inn |
7707049388 |
ИНН клиента |
|
-short_ company_name |
Необязательный /'RTK' |
Короткое название компании латинскими буквами (импользуется в имени файла АПП) |
|
-write_log |
Необязательный |
Путь к файлу для ведения журнала |
|
-write_error |
Необязательный |
Путь к файлу для записи ошибок в работе модуля |
Конструктор, при создании объекта, также производит подключение к БД и сохраняет ссылку на подключение в объекте класса Rostelecom. Ссылка на подключение используется во всех функциях, где в объекте класса производится обращение к БД. Пример вызова конструктора:
Rostelecom->new (-output_dir => $OUTPUT_DIR, -template => $TEMPLATE, -company => $company, -inn => 77777, -short_company_name => 'RTK_test');
Функция db_connect
Функция осуществляет подключение к БД MySQL при помощи модуля DBI, устанавливает кодировку UTF-8 для всех обращений к БД и возвращает ссылку на подключение. Данные для подключения к БД, такие как: сервер БД, имя пользователя, пароль, имя БД; функция берет из глобальной ссылки на хэш $DB.
Метод read_data
Метод принимает на вход файл в формате XML, производит его чтение и разбор, и сохраняет считанные данные в ообъекте класса Rostelecom. Чтение данных из файла XML производится при помощи модуля XML::Simple, свободно доступного на CPAN. В модуле XML::Simple есть функция XMLin, которая возвращает переменную во внутреннем представлении perl, при этом элементы записываются как ссылки на хэш, значения элементов - как значения хэшей, а повторяющиеся элементы записываются как ссылки на массив. Например, XML файл с такой структурой
<Letter>
<Client Name='John'>
<Data>34</Data>
</Client>
<Client Name='Piter'>
<Data>46</Data>
</Client>
</Letter>
Будет приобразован к такому виду
\ {
Client [
[0] {
Data 34,
Name "John"
},
[1] {
Data 46,
Name "Piter"
}
]
}
В методе read_data также производится определение региона для каждого клиента при помощи функции define_region, описание которой приводится ниже.
Функция define_region производит запрос к двум таблицам из БД (region, post_index_region) и получает название региона по заданному почтовому индексу. Если такой почтовый индекс отсутствует в БД, то возвращается регион по умолчанию 'MOSCOW'. Структурная схема функции define_region представлена на рисунке 16.
Рисунок 1616 - Структурная схема функции define_region
Также в методе read_data производится проверка корректности считанных данных при помощи функции correct_data, и валидиция адреса при помощи функции check_address.
Функция check_address проводит проверку адреса при помощи модуля AddressInfo, описание которого приводилось выше.
Функция correct_data.
Функция принимает на вход одну считанную запись клиента и проверяет наличие в ней необходимых полей, а также длину поля code. Поле code должно содержать ровно 16 цифр. Если в переданных данных нет всех необходимых полей или поле code содержит неверное количество символов,в объект класса Rostelecom записывается сообщение об ошибке и возвращается значение 0. Структурная схема функции correct_data представлена на рис. 17.
При возникновении ошибки, метод записывает ошибку в объект при помощи метода error() и возвращает значение 0. На рисунке 18 представлена схема работы метода read_data.
Рисунок 1717 - Структурная схема функции correct_data
Метод не принимает параметры на вход. Пример вызова метода $rtk->read_data() or die $rtk->error;
Метод define_shpi
Метод выделяет каждому клиенту ШПИ. Метод работает с таблицей shpi в БД. Перед присвоением ШПИ каждому клиенту, в методе проверяется, есть ли в БД необходимое количество ШПИ кодов в текущем месяце при помощи функции get_shpi_count.
В функцию get_shpi_count передается ссылка на покдлючение к БД и регион, для которого требуется получить количество доступных ШПИ. Функция возвращает количество доступных ШПИ. Пример вызова функции: my $shpi_count = get_shpi_count ($dbh, $region);
Рисунок 1818 - Схема работы метода read_data
Структурная схема функции get_shpi_count показана на рисунке 19.
Если в БД количество ШПИ меньше, чем требуется для формирования отправлений, то функция возвращает 0 и сохраняет сообщение об ошибке при помощи метода error(). После присвоения ШПИ кодов клиентам, эти значения удаляются из БД. На рисунке 20 представлена схема работы метода define_shpi.
Рисунок 1919 - Структурная схема функции get_shpi_count
Метод define_shpi не принимает параметры на вход. Пример вызова метода
$rtk->define_shpi() or die $rtk->error;
Метод create_pdf
Метод create_pdf производит создание pdf файлов по каждому региону.
В качестве входных данных метод принимает 2 параметра:
-spool_size - размер спула (максимальное количество записей в одном файле);
-ops - ссылка на хэш, содержащая названия ОПС (отделений почтовой связи) для каждого региона. Имеет вид $ops->{'MOSCOW'} = '140961 МР АСЦ'.
Рисунок 2020 - Схема работы метода define_shpi
Продолжение рисунка 20 - Схема работы метода define_shpi
Функция сначала создает файлы во временную папку $TEMP_DIR, когда количество временных файлов будет равно размеру spool_size или больше нет данных в регионе, производится создание формы 103 в формате pdf, и все временные файлы и форма 103 собираются в один файл (при помощи функции collect модуля PDF_Features). Создание временных файлов производится асинхронно в несколько, количество потоков указывается в параметрах конструктора (параметр -cpus). Создание одного временно файла осуществляется функцией create1_pdf, которая выполняется в многопоточном режиме.
Функция create1_pdf создает pdf файл из шаблона отправления, переданного в параметре -template с именем -fname. Параметры вызова функции create1_pdf представлены в таблице 24.
Таблица 2424 - Параметры вызова функции create1_pdf
Аргумент |
Обязательный/Значение по умолчанию |
Описание |
|
-fname |
Обязательный |
Полный путь к создаваемому pdf файлу |
|
-shpi |
Обязательный |
Код ШПИ отправления |
|
-name |
Обязательный |
Имя получателя (Фамилия Имя Отчество) |
|
-code |
Обязательный |
Код активации |
|
-address |
Обязательный |
Адрес получателя |
|
-post_index |
Обязательный |
Почтовый индекс получателя |
|
-service_str |
Обязательный |
Сервисная информация (название файла, номер отправления в файле) |
|
-post_index |
Обязательный |
Почтовый индекс |
|
-template |
Обязательный |
Полный путь к макету в формате pdf |
Функция create1_pdf наносит адресный блок и ШПИ код на отправление при помощи функций draw_address_block и draw_barcode из модуля PDF_Features. Описание этих функций приводилось ранее и, ввиду простоты алгоритма create1_pdf его структурная схема не приводится.
Имя общего файла имеет вид
ymmddnum.pdf,
где
y - последняя цифра года
mm - номер месяца
dd - номер дня
num - порядковый номер файла в регионе
Файлы помещаются в директорию вида
$output_dir/$region/$formatted_date,
где
$output_dir - путь к директории, переданной в конструкторе
$region - название региона, к которому относится данный файл
$fomatted_date - текущая дата в формате yyyymmdd
Структурная схема функции create_pdf представлена на рисунке 21.
Метод generate_rtk_xml
При помощи данного метода в программе создается xml для отправки клиенту. Программа принимает один параметр:
-num - это номер xml файла
Файл сохраняется в папке
$output_dir/XML,
где $output_dir - путь к директории, заданный в конструкторе класса Rostelecom.
Рисунок 2121 - Структурная схема функции create_pdf
Продолжение рисунка 21 - Структурная схема функции create_pdf
Имя выходного файла имеет вид:
yyyymmddnum.xml,
где
yyyy - год создания файла
mm - месяц создания файла
dd - день создания файла
num - номер файла, передаваемый в параметрах метода
Пример файла, генерируемого методом generate_rtk_xml показан на рисунке 22.
Рисунок 2222 - Содержимое XML файла для отправки клиенту
Создание xml файла производится модулем XML::Simple, этот модуль переводит данные из внутреннего представления perl (хэш массивов) в формат xml. Алгоритм работы метода простой, поэтому структурная схема его работы не приводится.
Метод переносит id клиента и присвоенный ему ШПИ код в базу данных, в таблицу client_id. На каждого клиента выполняется один запрос INSERT в БД. Поле id клиента в таблице client_id является первичным ключюм, при вставке строки, значение поля id которой уже есть в базе, производится обновление всех полей, кроме id клиента. Алгоритм работы метода простой, поэтому структурная схема его работы не приводится.
Класс Rostelecom содержит также ряд методов, которые являются интерфейсами к уже описанным модулям. Эти методы, принимаемые параметры и их назначение перечислены в таблице 25.
Таблица 2525 - Методы-интерфейсы класса Rostelecom
Метод |
Параметры |
Описание |
|
app |
-num |
Предназначен для генерации акта приема-передачи, в параметрах передается номер акта. Создание акта производится модулем App. |
|
send_app |
-rcpt ссылка на хэш получателей письма |
Отправляет акт приема передачи по почте. Список получателей для каждого региона передается в виде хэша, в параметре -rcpt. |
|
send_f103 |
-rcpt ссылка на хэш получателей письма |
Отправляет форму 103 по почте. Список получателей для каждого региона передается в виде хэша, в параметре -rcpt. |
|
afp |
-cpus количество потоков при преобразовании |
Производит конвертацию pdf файлов в afp, посредством модуля Pdf2Afp/ |
|
notice |
message сообщение |
Производит отправку сообщение на jabber, клиентам, подписанным на рассылку в БД, в таблице notice/ |
|
upload |
-dir папка для загрузки файлов на фтп сервере |
Производит загрузку готовых файлов на фтп сервер. |
4.4 Описание структуры базы данных
Согласно предварительной схемы работы, в базе данных будут храниться доступные ШПИ коды для каждого региона, соответствие id клиента и присвоенного ему ШПИ отправления, список получателей уведомлений об ошибках посредством протокола XMPP (Extensible Messaging and Presence Protocol -- расширяемый протокол обмена сообщениями и информацией о присутствии [19]), соответствие индекса и кода региона. В качестве СУБД в программе используется MySQL. Для Ростелекома была создана отдельная база данных - rostelecom, и заведен пользователь rostelecom, с возможностью доступа только к этой базе данных.
Рассмотрим существующие таблицы базы данных системы, а также их назначение.
· Таблица region. Содержит соответствие id региона и названия региона
· Таблица shpi. Содержит ШПИ коды и id региона, к которому относится данный ШПИ
· Таблица client_id. Содержит ID клиентов, присвоенные им ШПИ, имя исходного файла, дату генерации отправления
· Таблица notice. Содержит jabber id, по которым требуется рассылать уведомления об ошибках, а также поле enable, позволяющее отключать клиента от рассылки без удаления записи из БД.
· Таблица post_index_region. Содержит соответствие почтового индекс и id региона.
Описание всех полей таблиц БД rostelecom приведено в табл. 26-30.
Таблица 2626 - Описание полей таблицы shpi
Название поля |
Тип |
Описание |
Параметры поля |
|
shpi |
bigint(20) |
Код ШПИ |
Индексированный, первичный ключ |
|
region_id |
tinyint(4) |
Id региона, к которому относится код ШПИ |
Таблица 2727 - Описание полей таблицы region
Название поля |
Тип |
Описание |
Параметры поля |
|
id |
tinyint(4) |
Id региона |
Индексированный, первичный ключ |
|
region |
varchar(20) |
Текстовое название региона |
Таблица 2828 - Описание полей таблицы client_id
Название поля |
Тип |
Описание |
Параметры поля |
|
id |
bigint(20) |
Id клиента (поле USERID) из исходного xml файла |
Индексированный, первичный ключ |
|
shpi |
bigint(14) |
Код ШПИ |
||
fname |
varchar(50) |
Имя исходного файла, в котором была запись с данным клиентом |
||
dat |
datetime |
Дата и время формирования отправления |
||
out_fname |
varchar(500) |
Полный путь к файлу с письмом |
Таблица 2929 - Описание полей таблицы post_index_region
Название поля |
Тип |
Описание |
Параметры поля |
|
post_index |
bigint(6) |
Почтовый индекс |
Индексированный, первичный ключ |
|
region_id |
tinyint(4) |
Id региона, к которому относится код почтовый индекс |
Таблица 3030 - Описание полей таблицы notice
Название поля |
Тип |
Описание |
Параметры поля |
|
jabber_id |
varchar(200) |
Jabber_id получателя уведомлений |
Индексированный, первичный ключ |
|
enable |
boolean |
Флаг, указывающий включение рассылки на данный id |
На рисунке 23 представлена общая схема таблиц и связей в БД.
Рисунок 2323 - Схема таблиц и связей БД Rostelecom
4.5 Запускающая программа
В системе конвертации данных была написана запускающая программа - convert_rostelecom.pl. В ней производится скачивание файлов с фтп сервера, проверка дублирующего запуска программы и производится создание объекта класса Rostelecom и обращение ко всем методам.
Функция check_remote_files
Для загрузки данных с ФТП сервера была написана функция check_remote_files. Параметры функции перечислены в таблице 31.
Таблица 3131 - Параметры вызова функции check_remote_files
Аргумент |
Обязательный/ Необязательный |
Описание |
|
-server |
Обязательный |
Адрес ФТП сервера |
|
-remote_dir |
Обязательный |
Полный путь к папке на ФТП сервере |
|
-dest_dir |
Обязательный |
Путь к папке на локальном ПК |
|
-ext |
Обязательный |
Расширение файла для загрузки |
Функция производит подключение к ФТП серверу по протоколу SFTP, делает просмотр всех файлов с расширением -ext в папке -remote_dir и запоминает размер файлов. Через 30 секунд производится снова просмотр папки, если размер файлов не изменился и не было добавлено в папку новых файлов, то производится загрузка файлов с ФТП сервера в папку -dest_dir. Алгоритм работы функции check_remote_files представлен на рисунке 24.
Запрет запуска нескольких копий программы одновременно
Невозможность запуска нескольких копий программы одновременно производится с помощью модуля File::Flock::Tiny. Модулю передается имя текстового файла, в котором он сохраняет pid запущенного процесса. При повторном запуске процесса, модуль проверяет, запущен ли процесс с pid, указанным в текстовом файле. Если такой процесс уже запущен, то на экран выводится сообщение «Rostelecom already running» и производится завершение работы программы.
Рисунок 2424- Структурная схема функции check_remote_files
4.6 Обновление базы кодов ШПИ
Коды ШПИ приходят в филиал ЦГП в виде диапазона, который содержит 13 цифр кода из 14-ти. Последний, контрольный разряд кода необходимо высчитывать по алгоритму, описанному ранее. Для генерации кодов ШПИ из диапазона была написана отдельная программа - add_shpi.pl. Программа просит пользователя ввести диапазон и выбрать регион, для которого производится генерация кодов. Программа проверяет, чтобы правый диапазон был больше левого, проверят конечность диапазона, количество символов, наличие разделителя. При правильном вводе дипазона и выборе региона, программа генерирует коды по заданном диапазону, высчитывает контрольный разряд для каждого кода, вносит ШПИ коды в таблицу shpi в БД Rostelecom и выводит на экран количество сгенерированных записей.
Структурная схема программы представлена на рисунке 32.
Рисунок 2525- Структурная схема программы add_shpi
Интерфейс системы
Система спроектирована на работу в фоновом режиме в виде демона. Все настройки системы находятся в файле «config.ini». В конфигурационном файле задаются адрес ФТП сервера, полное название компании, список получателей акта приема-передачи и т.д. Более подробно поля конфигурационного файла были описаны в разделе Конфигурационный файл. Скриншот содержимого файла представлен на рисунке 26.
Рисунок 2626 - Конфигурационный файл config.ini
Есть два варианта запуска системы:
· Автоматически, по расписанию.
· В ручном режиме
При ручном запуске системы требуется отправить на выполнение файл convert_rostelecom.pl, например, прописав в терминале полный путь к исполняемому файлу и нажав Enter. Пример ручного запуска программы показан на рисунке 27.
Рисунок 2727 - Ручной запуск системы
При отсутствии файлов для обработки, на ФТП сервере, система выведет сообщение, что файлов нет, и завершит работу. Загрузим файлы для обработки на ФТП сервер и снова произведем запуск системы. Подадим на вход файл RTKMOS1503210000.zip. Экран запуска системы представлен на рисунке 28.
Рисунок 2828 - Запуск системы обработки
На экран выводится сообщение о том, что файлы данных найдены на ФТП и запуск произведен («Rostelecom converting process started»). На экран выводятся номера созданных временных файлов. Номера выводятся не по порядку, т.к. создание временных файлов производится в асинхронном многопоточном режиме.
По окончании выполнения работы, система выгружает файлы на ФТП сервер. Папка ФТП сервера, куда производится выгрузка, показана на рисунке 29.
Рисунок 2929 - Содержимое папки для выгрузки файлов на ФТП сервер
Система рассылает на e-mail акт приема-передачи данных и электронные списки.
Система производит запись журнала работы программы в log файл. Пример записей из log файла представлен на рисунке 30.
Рисунок 3030 - Пример записей в log файле
При возникновении ошибки, сообщение об ошибке записывается в error_file и отправляется на jabber_id всем, подписанным на рассылку сотрудникам. Пример сообщения об ошибке из jabber клиента представлен на рисунке 31.
Рисунок 3131 - Сообщения об ошибках в jabber клиенте на телефоне
В автоматическом режиме, запуск системы настраивается по планировщику crontab. В нем устанавливается, с какой периодичностью, и в какие дни необходимо производить запуск системы.
Для обновления базы кодов ШПИ есть программа add_shpi.pl, написанная, также как и основная часть программы, на Perl. Для добавления нового диапазона ШПИ в базу данных, необходимо провести запуск этой программы командой ./add_shpi, находясь в папке с программой, или по полному пути к файлу. Экран работы программы представлен на рисунке 25.
Рисунок 3232 - Экран работы программы add_shpi
5. Примеры работы системы
Для автоматического запуска системы, назначим ее выполнение по планировщику crontab. Запуск будем осуществлять в мультиплексоре screen. Периодичность запуска поставим 10 минут. На рисунке 44 представлен вид файла crontab с настроенным запуском по расписанию, с периодичностью запуска - 10 минут.
Рисунок 3333 - Содержимое crontab
Положим исходный файл с данными от 20.05.2015 в папку на ФТП. Имя файла RTKMOS1505200000.zip. Содержимое папки показано на рис. 34.
Рисунок 3434 - Папка RTK_in на фтп сервере
Через несколько минут файл удаляется с ФТП сервера, это означает, что система забрала файл для обработки. На сервере можно ввести команду screen -ls, которая отобразит запущенный процесс с именем rostelecom. На рисунке 35 видно, что процессу присвоен pid (Process IDentifier - идентификатор процесса многозадачной операционной системы[20]) с номером 20758.
Также можно зайти в сам процесс и посмотреть процесс выполнения командой screen -r 20758.
Рисунок 3535 - Вывод команды screen -ls
Через некоторое время на почту приходит два письма:
· Письмо операторам ОПС с просьбой о прогрузке электронных списков в ПО Партионная почта (Рисунок 36).
· Письмо с актом приема-передачи данных операторам АСЦ (Рисунок 37).
Рисунок 3636 - Письмо с электронными списками Ростелеком
Рисунок 3737 - Письмо с актом приема-передачи Ростелеком
В папку 172.24.161.186/ftp-shared/CGPSPB/RTK_out/ (путь к папке и адрес ФТП сервера задаются в config файле) выгружаются файлы для печати (рисунок 29) и XML файл для клиента (рисунок 39).
Рисунок 3838 - Содержимое папки RTK_out/MOSCOW на ФТП сервере
Рисунок 3939 - Содержимое папки RTK_out/XML на ФТП сервере
Просмотрим содержимое файла в формате afp, для этого используем ПО ISYSPapirus, распространяемое бесплатно. (Рисунок 40).
Рисунок 4040 - Вид печатного файла в формате AFP
Персональные данные на скриншоте, соответственно, закрашены. Работа программы завершена, все данные успешно обработаны.
файл программирование почтовый валидация
6. Тестирование
Тестирование может проводиться как в ручном, так и в автоматическом режиме. В ручном режиме, тестировщик вводит различные данные с ошибками, используя интерфейс программы, и смотрит на поведение программы. В автоматическом режиме тестировщик создает серию тестов к своей программе, которые отправляют некие данные в программу и проверяют ее поведение. Автоматические тесты, будучи единожды написаны, могут проводит тестирование программы в течение ее всего жизненного цикла. При изменении/добавлении функционала программы будет легко проверить, не изменилось ли поведение и функциональность старых компонентов программы.
Для тестирования поведения программы в различных условиях (неверный формат файла, неверные данные, недоступность сервера и т.д…), была написана программа автоматического тестирования - rtk_test.pl. Для написания тестов, был использован модуль Test::More, который позволяет запускать функции на выполнение, сравнивать полученный результат с ожидаемым результатом и выводить отчет о проведенных тестах. Создав один раз тесты для программы, можно вносить изменения в код, не боясь испортить основной функционал программы. Всегда можно быстро запустить тесты на выполнение и убедиться, что все модули работают так, как от них ожидает программист. В программе тестирования был написан 21 тест, все тесты перечислены в таблице 32.
Таблица 3232 - Описание тестов программы
Номер теста |
Описание теста |
|
1. |
Подключение модуля Rostelecom |
|
2. |
Создание объекта класса Rostelecom |
|
3. |
Ошибка при создании объекта класса Rostelecom, проверка сообщения об ошибке |
|
4. |
Чтение файла с неправильной структурой |
|
5. |
Проверка сообщения об ошибке при чтении файла с неверной структурой |
|
6. |
Чтение файла с неверным кодом активации |
|
7. |
Проверка сообщения об ошибке при чтении файла с неверным кодом активации |
|
8. |
Тест метода read_data |
|
9. |
Тест метода define_shpi |
|
10. |
Тест метода create_pdf_files |
|
11. |
Ошибка при создании файла pdf методом create_pdf, проверка возвращаемого значения |
|
12. |
Ошибка при создании файла pdf методом create_pdf, тестирование сообщения об ошибке |
|
13. |
Тест метода generate_rtk_xml |
|
14. |
Тест внесения информации в БД |
|
15. |
Тест создания акта приема-передачи |
|
16. |
Тест наличия файла акта приема-передачи на диске |
|
17. |
Тест отправки акта приема-передачи по электронной почте |
|
18. |
Тест отправки электронных списков по электронной почте |
|
19. |
Тест конвертации pdf файлов в afp |
|
20. |
Тест наличия файлов afp на диске |
|
21. |
Тест загрузки файлов на ФТП сервер |
Ниже представлен отчет о тестировании
1..21
ok 1 - use Rostelecom;
ok 2 - An object of class 'Rostelecom' isa 'Rostelecom'
ok 3 - Test for fail rtk create obj
ok 4 - Test for read bad file 1
ok 5 - Test for bad message 1
ok 6 - Test for read bad file 2
ok 7 - Test for bad message 2
ok 8 - Test for read data /opt/perl/rostelecom_new/tests/input/20150217000001.xml
Fname: 20150217000001.xml Reads ok 21. Reads bad 0
ok 9 - Test for define shpi
ok 10 - Test for create pdf files
ok 11 - Test for fail1 create_pdf
ok 12 - Test for fail_message1
ok 13 - Test for generate_rtk_xml
ok 14 - Test for add info_to_bd
ok 15 - Test for create APP
ok 16 - Test for exists APP file
ok 17 - Test for send APP
ok 18 - Test for send f103
Starting converting pdf2afp /opt/perl/rostelecom_new/tests/output/MOSCOW/20150522/5052201.pdf
Converting Z:/opt/perl/rostelecom_new/tests/output/MOSCOW/20150522/5052201.pdf OK. 115 pages 0.000 sec
ok 19 - Test for convert pdf to afp
ok 20 - Test for exists afp file 1
Upload /opt/perl/rostelecom_new/tests/output/MOSCOW/20150522/5052201.afp
ok 21 - Test for upload files to ftp server
7. Замер производительности
Для оценки скорости работы отдельных функций и программы в целом, были проведены замер времени выполнения при помощи модуля Devel::Timer. В программе расставляются контрольные точки, в которых будет измеряться время выполнения. По окончании работы программы, выводится отчет с указанием контрольных точек и времени их выполнения в секундах и в процентном соотношении от общего времени выполнения программы.
Подобные документы
Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.
курсовая работа [81,7 K], добавлен 18.08.2014Проектирование структуры базы данных. Технология обработки данных. Порядок установки и запуска программы. Описание объектов приложения и структура данных. Ввод и изменение исходных данных. Получение выходных документов и тестирование программы.
отчет по практике [2,3 M], добавлен 22.07.2012Сущность языка программирования, идентификатора, структуры данных. Хранение информации, алгоритмы их обработки и особенности запоминающих устройств. Классификация структур данных и алгоритмов. Операции над структурами данных и технология программирования.
контрольная работа [19,6 K], добавлен 11.12.2011Обоснование выбора языка программирования. Анализ входных и выходных документов. Логическая структура базы данных. Разработка алгоритма работы программы. Написание программного кода. Тестирование программного продукта. Стоимость программного продукта.
дипломная работа [1008,9 K], добавлен 13.10.2013Создание программы в среде LabVIEW 7.1 для аудиометра – прибора для исследования чувствительности слуха. Определение входных и выходных данных системы, алгоритма обработки данных. Схемы и диаграммы, необходимые для разработки программного продукта.
курсовая работа [2,6 M], добавлен 03.04.2012Основные свойства информационно-справочной системы для обработки результатов сдачи сессии, ее функциональное назначение и логическая структура. Выбор языка и среды программирования. Описание алгоритмов сортировки и поиска, входных и выходных данных.
курсовая работа [742,8 K], добавлен 23.01.2014Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и выбор структур данных для ее хранения, разработка основных алгоритмов. Проектирование интерфейса пользователя. Выбор стратегии тестирования и разработка тестов.
курсовая работа [332,3 K], добавлен 09.12.2014Разработка программы обработки типизированных файлов с кодом на языке Object Pascal, с использованием компонентов Delphi для ввода и вывода данных. Разработка экранных форм и алгоритма программы. Описание программных модулей и инструкция оператору.
курсовая работа [1,5 M], добавлен 08.02.2011Проектирование структуры и архитектуры программного продукта. Реализация программы конвертера файлов баз данных. Описание пользовательского интерфейса. Выбор порядка конвертации dbf файлов. Создание и исполнение шаблонов. Расчет себестоимости продукта.
дипломная работа [2,2 M], добавлен 21.06.2013Создание программы для обработки и хранения информации о пациентах, сделанных им назначениях и их выписке из больницы. Описание структуры и определение формы представления входных и выходных данных. Разработка системы средствами C++ и Builder 6.0.
курсовая работа [552,0 K], добавлен 19.02.2013