Показаны сообщения с ярлыком тестирование. Показать все сообщения
Показаны сообщения с ярлыком тестирование. Показать все сообщения

22 мая 2021 г.

Смена хостинга для нашего сайта

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

https:// версия сайта тоже доступна, но пока не сделана основной. Надо еще поискать по коду все ссылки на незащищенный протокол и поменять их.

Если заметите ошибки в работе сайта, будем признательны обратной связи на адрес support[at]gsbelarus.com.

14 дек. 2012 г.

RC экзешника с автоообновлением

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

Присутствующие в каталоге программы и его подкаталогах файлы с расширением .BAK можно удалить.

Автообновление (если оно не отключено) работает следующим образом:

  1. После старта программы с сайта gsbelarus.com получаем адрес сервера обновления (сейчас это gs.selfip.biz).
  2. Подключаемся к серверу обновления, сообщаем ему свою версию экзешника, получаем ответ: надо нам обновляться или нет.
  3. Если обновляться надо, то выкачиваем новые файлы, присваиваем им расширение .NEW, располагаем их рядом с существующими.
  4. Взаимодействие с веб серверами осуществляется в нити с низким приоритетом.
  5. Предупреждаем пользователя о необходимости перезапуска и стартуем фоновый процесс gedemin_upd.exe.
  6. gedemin_upd.exe ждет окончания работы gedemin.exe, после чего по списку из временного файла gedemin_upd.ini обновляет файлы платформы (для особо важных файлов существующая версия сохраняется с расширением .BAK).

    Если файл не удается обновить, то он просто пропускается. Беды большой нет -- обновится следующий раз.

  7. Список выполненных операций и/или ошибок записывается в лог операционной системы.
Обновление не будет работать, если программа запущена из расшаренной сетевой папки.

Включить/выключить автообновление можно на вкладке Обновление окна О программе... (вызывается из меню Справка Главного окна).

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

Антивирусное ПО и файрволл могут препятствовать обновлению файлов. Отключите их на время обновления или добавьте в исключения файлы gedemin.exe, gedemin_upd.exe и сайты gsbelarus.com, gs.selfip.biz.

Обновление до бета-версии

По-умолчанию, обновление происходит до текущей стабильной версии. Если вы хотите получать ежедневный бета-билд платформы (и знаете что делаете!), то заходим в файл gedemin.ini и в секции Web Client прописываем:

[Web Client]
...
Token = Beta
...

Для получения версии с отладочной информацией стоит прописать:

[Web Client]
...
Token = Debug
...

17 сент. 2012 г.

Multithreaded debugging

Справа Oracle VM VirtualBox в котором крутится WinXP 32bit. В отладчике — Гедымин в режиме HTTP сервера. Слева — основная система для разработки — Win7 64bit. В отладчике виден код HTTP клиента платформы Гедымин.

Используется библиотека интернет компонент Indy 9.

1 апр. 2012 г.

Специфика ORM модели платформы Гедымин

ORM Гедымина имеет ряд нестыковок. Известны они давно и очередной раз привлекли к себе внимание во время разработки автоматизированного теста (см. предыдущий пост). Ниже перечислены некоторые из них:
  • Не учитывается разница между истинным абстрактным базовым классом (например, TgdcBase), и базовым классом c конкретной ListTable, который служит фундаментом для иерархии наследованных классов (например, TgdcBaseContact).
  • Некоторые объекты могут использоваться только внутри кода других объектов с выполнением магических действий по программной настройке:
    1. Все наследники TgdcInvBaseRemains
    2. TgdcInvCard
    3. TgdcLink
    4. TgdcAcctDocument
    5. TgdcAcctEntryRegister
  • К списку выше можно добавить все объекты позиций документов, создать запись в которых можно только при настроенной связи мастер-дитэйл с шапкой или непосредственно указывая ИД головной записи. При этом связь надо настраивать вручную, так как объекты шапки и позиций автономны и ничего не знают друг о друге. Частично задача решена для документов и только с вовлечением интерфейса пользователя — платформа формирует экранную форму просмотра на основе информации о типе документа.
  • В ситуациях, когда бизнес-сущность хранится в нескольких таблицах, список последних нигде не задан явно. Мы можем полагаться на сформированный запрос или обращаться к метаданным. В последнем случае мы рискуем получить слишком большой список связанных таблиц, не все из которых являются частью нашего бизнес-класса. Например, окно Свойства объекта выдает такое множество связанных таблиц для документа Отпуск товара на сторону из стандартного пакета настроек:
    BN_BANKCATALOGUE, BN_BANKCATALOGUELINE, BN_BANKSTATEMENT, BN_BANKSTATEMENTLINE, BN_CURRCOMMISSION, BN_CHECKLIST, BN_CURRBUYCONTRACT, BN_CURRCOMMISSSELL, BN_CURRCONVCONTRACT, BN_CURRLISTALLOCATION, BN_CURRSELLCONTRACT, BN_DEMANDPAYMENT, CTL_INVOICE, CTL_RECEIPT, GD_TAXDESIGNDATE, GD_TAXRESULT, GD_CONTRACT, GD_DOCREALIZATION, INV_PRICE, INV_PRICELINE, USR$INV_ADDINFO, USR$BN_ACCMAKE, USR$BN_ACCMAKELINE, USR$BN_BILL, USR$BN_BILLLINE, USR$BN_BILLNDS, USR$BN_BILLNDSLINE, USR$BN_BLANKTRIP, USR$BN_BTRIPMONEY, USR$BN_BTRIPMONEYLINE, USR$BN_BUYCURR, USR$BN_CASHBOOK, USR$BN_CASHBOOKLINE, USR$BN_CASHDEPOSIT, USR$BN_CASHDEPOSITLINE, USR$BN_CASHREPORT, USR$BN_CASHREPORTLINE, USR$BN_CHANGECURR, USR$BN_COLLECT, USR$BN_COMMISS, USR$BN_COMMISSLINE, USR$BN_DATABTRIP, USR$BN_DATABTRIPLINE, USR$BN_DEMAND, USR$BN_INCOMECURR, USR$BN_INCOMECURRLINE, USR$BN_LISTDEM, USR$BN_LISTDEMLINE, USR$BN_NOTICE, USR$BN_NOTICELINE, USR$BN_ORDERBTRIP, USR$BN_ORDERBTRIPLINE, USR$BN_PAYMENT, USR$BN_SALECURR, USR$BN_SALECURRLINE, USR$BN_SHARECURR, USR$BN_SHARECURRLINE, USR$BN_TRANSFER, USR$BN_TTN, USR$BN_TTNLINE, USR$BNF_ACTS, USR$BNF_ACTSLINE, USR$BNF_CONTRACT, USR$BNF_CONTRACTLINE, USR$CHECKREGISTER, USR$CHECKREGISTERLINE, USR$CURR_PAYMENT, USR$FA_ACTNEW, USR$FA_ACTNEWLINE, USR$FA_AMORT, USR$FA_AMORTLINE, USR$FA_CHANGEPROP, USR$FA_CHANGEPROPLINE, USR$FA_COMPLECT, USR$FA_COMPLECTLINE, USR$FA_CONSERVATIONLINE, USR$FA_CONSERVATION, USR$FA_MOVEMENT, USR$FA_MOVEMENTLINE, USR$FA_REAPP_B, USR$FA_REAPP_BLINE, USR$FA_REAPP, USR$FA_REAPPLINE, USR$FA_REMONT, USR$FA_REMONTLINE, USR$FA_REPAIR, USR$FA_REPAIRLINE, USR$GS_ACCBALANCE, USR$GS_ACTWORK, USR$GS_ACTWORKLINE, USR$INCOME_ORD, USR$INCOME_ORDLINE, USR$INV_ACTWORK, USR$INV_ACTWORKLINE, USR$INV_ADDWBILL, USR$INV_ADDWBILLLINE, USR$INV_ATTORNEY, USR$INV_ATTORNEYLINE, USR$INV_BILL, USR$INV_BILLLINE, USR$INV_CARDPRMET, USR$INV_CARDPRMETLINE, USR$INV_CERT, USR$INV_CHANGEPERC, USR$INV_CHANGEPERCLINE, USR$INV_COMP, USR$INV_COMPLINE, USR$INV_CONTRACT, USR$INV_CONTRACTLINE, USR$INV_DECOMP, USR$INV_DECOMPLINE, USR$INV_GOODORDER, USR$INV_GOODORDERLINE, USR$INV_INVENT, USR$INV_INVENTLINE, USR$INV_INVMOVE, USR$INV_INVMOVELINE, USR$INV_NEWCOST, USR$INV_NEWCOSTLINE, USR$INV_OUTLAYS, USR$INV_PROCESSING, USR$INV_PROCESSINGLINE, USR$INV_PRODUCT, USR$INV_PRODUCTLINE, USR$INV_PRREC, USR$INV_PRRECLINE, USR$INV_REALCOMMIS, USR$INV_REALCOMMISLINE, USR$INV_RETAIL, USR$INV_RETAILLINE, USR$INV_RETCUST, USR$INV_RETCUSTLINE, USR$INV_RETPROV, USR$INV_RETPROVLINE, USR$INV_SELLBILL, USR$INV_SELLBILLLINE, USR$INV_SPEND, USR$INV_SPENDLINE, USR$INV_SPENDPREC, USR$INV_SPENDPRECLINE, USR$INV_TOTRADE, USR$INV_TOTRADELINE, USR$MOG_DEBTACC, USR$MOG_DEBTCONTR, USR$MOG_INBILLVAT, USR$MOG_INBILLVATLINE, USR$MOG_SERVICE, USR$REN_DIVSTATEMNLINE, USR$SKIDKI, USR$SKIDKILINE, USR$WG_ADDPAYBYPERIODLINE, USR$WG_ADDPAYBYPERIOD, USR$WG_AGREEMENTLONGLINE, USR$WG_AGREEMENT, USR$WG_AGREEMENTLINE, USR$WG_AGREEMENTLONG, USR$WG_ALIMONY, USR$WG_ALIMONYDEBT, USR$WG_ATTEST, USR$WG_AVGADDPAY, USR$WG_AVGADDPAYLINE, USR$WG_BANKCALC, USR$WG_BRIGADEORDERLINE, USR$WG_BRIGADEORDER, USR$WG_CHARGEREG, USR$WG_CHILDAID, USR$WG_CONTRACT, USR$WG_CONTRACTLINE, USR$WG_CORRECT, USR$WG_CORRECTLINE, USR$WG_FAMCHAG, USR$WG_HAZARDS, USR$WG_HAZARDSLINE, USR$WG_HOLIDAYWORK, USR$WG_HOLIDAYWORKLINE, USR$WG_INCTAXDEDUCTION, USR$WG_INCTAXOTHERPAYLINE, USR$WG_INCTAXOTHER, USR$WG_INCTAXOTHERPAY, USR$WG_INCTAXSECURITIES, USR$WG_INITINCOME, USR$WG_INITINCOMELINE, USR$WG_KINDDAY, USR$WG_KINDDAYLINE, USR$WG_LEAVEDOC, USR$WG_LEAVEDOCLINE, USR$WG_LEAVEPASS, USR$WG_LEAVESCHED, USR$WG_LEAVESCHEDLINE, USR$WG_LEAVESTOPDOC, USR$WG_MANUALINPUT, USR$WG_MANUALINPUTLINE, USR$WG_MOVEMENT, USR$WG_MOVEMENTLINE, USR$WG_MULTIORDER, USR$WG_MULTIORDERLINE, USR$WG_PARTDAY, USR$WG_PARTDAYLINE, USR$WG_PENALTYDOC, USR$WG_PERSONALORDERLINE, USR$WG_PERSONALORDER, USR$WG_PIECEWORK, USR$WG_PIECEWORKLINE, USR$WG_PROFDEVELOP, USR$WG_PU6, USR$WG_PU6LINE, USR$WG_RETRAINING, USR$WG_REWARDDOC, USR$WG_SALARYCALC, USR$WG_SALARYCALCLINE, USR$WG_SALARYPAY, USR$WG_SALARYPAYLINE, USR$WG_SCIENCEDEVELOP, USR$WG_SENCALC, USR$WG_SENCALCLINE, USR$WG_SETPAYMENT, USR$WG_SETPAYMENTLINE, USR$WG_SETSENBONUS, USR$WG_SICKLIST, USR$WG_SICKLISTJOURNAL, USR$WG_SICKLISTLINE, USR$WG_SINKDEBT, USR$WG_SINKDEBTLINE, USR$WG_STAFFLIST, USR$WG_STAFFLISTLINE, USR$WG_TAXATION, USR$WG_TBLCAL, USR$WG_TBLCALLINE, USR$WG_TIMEWORK, USR$WG_TIMEWORKLINE, USR$WG_TOTAL, USR$WG_TOTALLINE, USR$WG_VACATION, USR$WG_VACATIONLINE, USR$WG_WRITEOFF, USR$WG_WRITEOFFLINE, USR$WS_DISTANCE_LINE, USR$WS_FUEL_LINE, USR$WS_WAYSHEET
  • Как уже отмечалось выше, связь мастер-дитэйл обрабатывается платформой только для документов и только на уровне пользовательского интерфейса. Связь мастер-дитэйл-сабдитэйл не обрабатывается вообще никак.
  • Наследование подтипов невозможно.
  • Не лишней была бы возможность создать атрибут типа бизнес-класс. То, что сейчас решается созданием автономного объекта и ручным связыванием его с головной записью. Пример: дополнительная информация по товарно-транспортной накладной.
Список всех бизнес-классов платформы и пакета типовых настроек Комплексная автоматизация теперь выглядит так.

28 мар. 2012 г.

846

Восемсот сорок шесть бизнес-классов с подтипами на эталонной базе с загруженным комплектом типовых настроек. Вместе с отраслевыми решениями и частными наработками под конкретных клиентов общее количество превышает тысячу!

Только сейчас, на втором десятке лет существования проекта, мы приступили к автоматизированному тестированию бизнес-объектов. Задача первого теста:

  1. итерация через список всех классов с подтипами
  2. создание экземпляра класса с подтипом
  3. проверка последовательности действий Insert-Cancel и Edit-Post
  4. проверка создания и отображения диалогового окна
  5. проверка создания и отображения формы просмотра
  6. проверка текста запроса генерируемого методом CheckTheSameStatement
  7. добавление условия через ExtraConditions
  8. уничтожение экземпляра
Попутно выявилось, что GetSubTypeList возвращает не список подтипов, как это следует из названия, а список строк вида Читабельное название подтипа=Подтип. Очевидно, делалось когда-то для отображения списка подтипов в стандартном выпадающем списке, но с тех пор было забыто.

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

7 июн. 2010 г.

Тестирование подсистемы отчетов

При тестировании изменений в подсистеме отчетов мы постарались исключить фактор пропускной способности сети и производительности дисковой подсистемы. Использовался встроенный сервер Firebird 2.5. Данные генерировались с помощью хранимых процедур. Пример такой процедуры можно видеть ниже:
CREATE PROCEDURE tst_p_gen_str_data (i INTEGER)
  RETURNS (id INTEGER,
    s1 VARCHAR(60),
    s2 VARCHAR(60),
    s3 VARCHAR(60),
    s4 VARCHAR(60))
AS
BEGIN
  s1 = 'ABC dfg';
  s2 = '123 567 9874 10';
  s3 = 'qwertyuiop asdfghjl; xzcvnbvmn,m.';
  s4 = '';
  WHILE (i > 0) DO
  BEGIN
    id = :i;
    i = :i - 1;
  END
END
Тестировались следующие отчеты:
  1. Отчет по одному набору данных со строковыми полями.
  2. Отчет по одному набору данных с целочисленными полями.
  3. Отчет по двум наборам данных, связанных связью мастер-дитэйл. Наборы данных со строковыми полями.
Замеры выполнялись на втором построении отчета. Учитывалось время построения отчета и информация об использовании оперативной памяти, полученная с помощью программы Process Explorer.

Таблица с результатами находится здесь.

Вывод:
  • для отчетов мастер-дитэйл на двух датасетах разница незначительна — увеличение потребления памяти на 2% и ускорение на 6%.
  • для отчетов, основанных на одном наборе данных, достигается существенное ускорение в 35% при умеренном росте потребления памяти — от 9 до 16%.
Стоит заметить, что Fast Report 4 позволяет строить отчеты с группировкой (фактически, мастер-дитэйл)  с использованием одного набора данных.

25 мая 2010 г.

Тестирование объектов для работы с метаданными

Как выяснилось, Гедымин прекрасно переносит переподключение к БД прямо из кода программы:
IBLogin.LogOff;
IBLogin.Login(False, True);
// параметры метода Login управляют считыванием 
// информации о базе данных из реестра 
// и отображением окна ввода пароля
Что позволяет легко создать тесты для TgdcMetaData объектов. Начало уже положено. Тестируем создание и корректное удаление интервального дерева.

11 дек. 2009 г.

DUnit testing framework

Outlook of gedemin.exe compiled with DUNIT_TEST conditional symbol defined.

They are only first steps and only few tests exist, but more are coming.

6 окт. 2009 г.

Принимать внутрь

Так долго ходить вокруг да около, когда все так просто: просто закомпилировать DUnit Framework внутрь Гедымина и мы получаем возможность создавать тесты с доступом к базе, бизнес-объектам, макросам, отчетам...

Теперь остается вопрос с тестированием визуальных форм, окон. Необходимо придумать систему команд и реализовать эмуляцию движений и кликов мыши, нажатий на кнопки клавиатуры.

...и, конечно, писать, писать, и еще раз писать тесты.