7.6 KiB
Depanare si testare FLORA2ROA (headless, fara IDE)
Implementarea in acest proiect a sistemului comun de depanare/testare VFP. Metoda generala si
capcanele complete: D:\ROA\ROACONT\COMUN\docs\depanare_testare_vfp.md,
testare-ui-vfp.md, flux-editare-vfp-text.md, reguli_lucru.md.
Ce contine Teste\
Infrastructura (copiata din COMUN\utile\Teste, generica):
ui_harness.prg- proceduri de handshake intre testul VFP si orchestrator (HarnessLog,HarnessStep,HarnessReady,HarnessWaitContinue,HarnessDone).vfp_ui_harness.ps1- orchestrator: precompileaza, lanseaza vfp9, conduce testul pas cu pas pe semafoare si face o captura PNG dupa fiecare pas. Fereastra e mutata off-screen, deci nu fura focusul si se poate lucra in paralel._precompile.ps1- precompilare izolata a.fxp-ului testului (proces copil separat).
Specific FLORA2ROA:
test_init_env_auto.prg- initializare NEINTERACTIVA a mediului, echivalentul luimain.prgfaraDO FORM/READ EVENTS. Dupa apel sunt disponibilegoApp,goLog,goConn,goExecutor,gcAppPath. Conectarea la Oracle e OPTIONALA (primul parametru).test_helpers.prg-TestErrorHandler(ON ERROR care logheaza si continua, fara MESSAGEBOX) si aserturileTestAssert/TestAssertEqual/TestRezultat.mock_amessagebox.prg-amessageboxcare returneaza direct valoarea butonului, ca dialogurile modale sa nu blocheze rularea headless.verifica_sintaxa.ps1- compilare de verificare pentru toate.prg-urile, pe copii in TEMP.text_din_bin.ps1/bin_din_text.ps1- conversie.scx/.vcx<-> text (_textcache\).ruleaza_teste.ps1- ruleaza toata suita si da sumarul.test_frm_import_ui.prg- smoke: formularul real porneste, Init completeaza intervalul dinsettings.ini,Tracescrie inedtInfo.test_export_date.prg- functional:ExportDate()citeste XML-urile din interval si populeaza cursoarele (fara Oracle).test_cod_fiscal.prg- unitar: clasificarea partenerilor (persoana fizica / juridica) si curatarea CNP-urilor invalide (GetCodFiscalValidsi functiile ajutatoare dinmyutils.prg).test_cod_fiscal_real.prg- ruleaza aceeasi logica pe TOATE codurile dinEXEMPLE\hotelsi verifica invariantii: nicio persoana juridica nu ramane fara cod, niciun CNP valid nu se pierde. ScrieTeste\raport_cod_fiscal_real.csvcu decizia luata pentru fiecare partener.test_conectare_roa.prg- verifica drumul CU conectare la Oracle: fie se conecteaza si executa o interogare de proba, fie raporteaza esecul si iese controlat. NU e in suita implicita (depinde de reteaua/serverul Oracle).
Comenzi uzuale
# toata suita (sintaxa + teste UI cu capturi)
powershell -ExecutionPolicy Bypass -File Teste\ruleaza_teste.ps1
# doar verificarea de sintaxa, dupa orice editare de .prg
powershell -ExecutionPolicy Bypass -File Teste\verifica_sintaxa.ps1
# un singur test, cu capturi
powershell -ExecutionPolicy Bypass -File Teste\vfp_ui_harness.ps1 `
-TestPrg 'D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg' -Steps @('afisat','importat')
# un singur test, fara capturi (auto-continue la 30s pe pas)
& 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg" 20250601 20250630
# verificarea conexiunii la Oracle (datele din settings.ini)
& 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_conectare_roa.prg"
Rezultatele: Teste\<test>_log.txt (linii PASS:/FAIL: si REZULTAT:),
capturi in Teste\screenshots\, erori runtime in Teste\_erori_test.txt.
Editarea formularului pe text
powershell -ExecutionPolicy Bypass -File Teste\text_din_bin.ps1 # binar -> _textcache\*.sc2
# editezi _textcache\frm_import.sc2 BYTE-SAFE, in Windows-1252:
# $t = [IO.File]::ReadAllText($p, [Text.Encoding]::GetEncoding(1252))
# [IO.File]::WriteAllText($p, $t, [Text.Encoding]::GetEncoding(1252))
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile _textcache\frm_import.sc2 -DryRun
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile _textcache\frm_import.sc2
powershell -ExecutionPolicy Bypass -File Teste\recompileaza_binare.ps1 # OBLIGATORIU dupa write-back
Write-back-ul NU compileaza. FoxBin2Prg reface
.scx/.sctdin text, dar fara codul obiect, deci formularul ruleaza fara#INCLUDE "comun.h": constantele (CT_SUCCES,CT_INSUCCES) devin "Variable not found" abia in RUNTIME. Verificarea de sintaxa trece, testul pica.Teste\recompileaza_binare.ps1faceCOMPILE FORMsi repara asta.
Write-back-ul face fidelity check (bin -> text, comparat pe octeti) inainte de a atinge
binarul si refuza daca frm_import.scx e blocat de IDE sau de flora2roa.exe.
Un test nou in 5 pasi
SET SAFETY OFF+SET TALK OFFca PRIMA linie, apoiPUBLIC gcUILog, gcSyncDir.DO test_init_env_auto WITH .F.(sau.T.cand testul chiar are nevoie de Oracle), apoiSET PROCEDURE TO ui_harness ADDITIVEsimock_amessageboxULTIMUL.DO FORM (gcAppPath + 'frm_import') NAME goImportFrm NOSHOW,WindowType = 0,Show(). Modal (Show(1)) nu returneaza si blocheaza testul.- Pe fiecare pas: actiunea din fluxul REAL al utilizatorului (metoda pe care o apeleaza
butonul, nu popularea directa a cursoarelor), aserturi cu
TestAssert, apoiDO HarnessStep WITH <n>, '<eticheta>'. La finalDO HarnessDone WITH TestRezultat()siQUIT. - Inregistreaza testul in lista
$suitadinruleaza_teste.ps1.
Capcane confirmate in acest proiect
ErrorHandlerdinmain.prgdeschideMESSAGEBOXsi faceSET STEP ON: headless ar bloca procesul la nesfarsit. De aceeatest_init_env_auto.prginstaleazaTestErrorHandler.- Compilarile repetate de
vfp9din ACEEASI sesiune PowerShell esueaza tacut (procesul porneste dar nu executa).verifica_sintaxa.ps1compileaza toate fisierele intr-o singura rulare; harness-ul foloseste proces copil izolat pentru precompilare. Set Exclusive Ondinmain.prgnu se pastreaza in teste (mediul de test deschide cursoare partajate); daca un test are nevoie de comportamentul exact al aplicatiei, il seteaza el.- Testele nu ruleaza in paralel intre ele: harness-ul isi omoara instantele
vfp9proprii inainte de fiecare lansare (filtrat pe linia de comanda; instantele straine nu sunt atinse). settings.inidecide folderele de import. Testele functionale depind de continutul dinEXEMPLE\hotelsiEXEMPLE\restaurant; daca intervalul nu are fisiere, cursoarele raman goale.- Array-ul
-Stepsnu se leaga prinpowershell -File: parametrul se colapseaza si al doilea pas ajunge in-StepTimeoutSec("Cannot convert value 'trace' to type Int32"). Din alt script PowerShell invoca harness-ul cu&; dincmdlinia din exemplu (cu-File) merge pentru ca acolo@(...)e parsat de PowerShell, nu de cmd. - Dupa un
git cloneproaspat, binarele VFP NU sunt in repo: se regenereaza din text cuFoxBin2Prg.EXE "<fisier>.sc2" "" "" "" 1 0 1(sauTeste\text_din_bin.ps1in sens invers) inainte de a rula testele. Verificat: suita da PASS intr-o clona curata cu binarul regenerat. - Un test care se conecteaza la Oracle face
SQLSETPROP(0, 'DispLogin', 3)inainte de conectare: altfel, cu date de acces gresite, driverul ODBC deschide un dialog de login care blocheaza procesul headless la nesfarsit (simptom: proces viu, CPU 0%, log fara linii noi). CreeazaNote()siScrieNote()scriu in ROA si NU pot fi testate fara Oracle. Bifa "Nu scrie note contabile" (chkTest.Value = 1) opreste scrierea; testele o lasa activa.