Handmatige testen (IT)Handmatige QA Engineer

Tijdens de verificatie van een **COBOL**-naar-**Java** batchjob migratie verwerken van hoog-volume financiële transacties, welke gedetailleerde handmatige testmethodologie zou je toepassen om bitgewijs identieke output tussen legacy- en moderne systemen te garanderen, terwijl subtiele fouten in floating-point afronding en anomalieën in de springleap jaarverwerking van **Julian date** worden gedetecteerd?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord op de vraag

Om de pariteit tussen een legacy COBOL batchproces en de Java vervangende uitvoer te verifiëren, moet een handmatige tester beide systemen tegen identieke inputdatasets uitvoeren en een veld-voor-veld reconcilicatie uitvoeren. De methodologie omvat gestratificeerde monsters van records - met prioriteit voor hoogwaarde transacties, grensdata (bijv. 29 februari, jaarrimpelingen) en floating-point randgevallen - in plaats van een uitputtende vergelijking. Testers moeten uitvoer exporteren naar neutrale formaten (zoals CSV) en diff-tools gebruiken, terwijl ze kritisch financieel relevante velden handmatig inspecteren op afrondingsverschillen. Bijzondere aandacht moet worden besteed aan Julian date conversies en packed decimal (COMP-3) rekenkundige gedrag vs. IEEE 754 floating-point implementaties. Tot slot dienen checksum validatie en hashvergelijkingen van hele uitvoerbestanden als een rooktest voordat de gedetailleerde veldanalyse begint.

Situatie uit het leven

Bij een multinationale bank was ik verantwoordelijk voor het valideren van de migratie van een nachtelijke rente-opbouw batchjob van een IBM Mainframe COBOL systeem naar een Spring Boot microservice die draait op Linux. Het legacy-systeem had decennia lang miljarden aan transacties verwerkt met behulp van COMP-3 packed decimal aritmetiek en Julian date (YYDDD) formaten, terwijl de nieuwe Java applicatie gebruik maakte van BigDecimal en standaard Gregoriaanse kalenders. Het kernprobleem was het waarborgen van bitgewijs identieke output; zelfs een enkele cent afwijking over miljoenen rekeningen zou een kritische financiële fout zijn, en subtiele verschillen in afrondingswijzen of springleap jaarberekeningen zouden kunnen leiden tot materiële variaties.

Een overweging was een brute-force bestandvergelijking van alle uitvoerrecords. Deze benadering bood uitputtende dekking en absolute zekerheid dat elke byte overeenkwam. De voordelen werden echter overschaduwd door ernstige nadelen: de dataset bevatte meer dan vijftig miljoen records, waardoor handmatige vergelijking voor mensen onmogelijk was binnen het nachtbatchvenster, en de enorme hoeveelheid ruis van verwachte metadata-verschillen (zoals tijdstempels) zou daadwerkelijke gegevensfouten verhullen.

Een andere optie was eenvoudige willekeurige steekproevering van een vast percentage van de records, zeg één procent. Hoewel dit een statistisch significante overview bood en snel te uitvoeren was, waren de nadelen onaanvaardbaar voor financiële auditing: willekeurige steekproeven konden gemakkelijk hoge-impact uitschieters missen, zoals een specifiek rekeningtype met unieke afrondingsregels of transacties die plaatsvonden op 29 februari 2024, wat historisch gezien bugs in de Julian dagconversielogica veroorzaakte.

De gekozen oplossing was een gestratificeerde steekproef strategie gecombineerd met geautomatiseerde diff-scripts voor handmatige validatie. We categoriseerden records op basis van risiconiveaus: Niveau 1 omvatte alle rekeningen met saldo's boven de één miljoen dollar en alle transacties op datums bevinden (einde van de maand, einde van het jaar, springleap dagen), terwijl Niveau 2 willekeurige monsters uit verschillende producttypes bestreek. Deze benadering werd gekozen omdat het de behoefte aan absolute zekerheid over high-risk transacties balancerde met de praktische beperkingen van de handmatige testtijd.

Voor Niveau 1 voerden we 100% veldniveau handmatige reconcilatie uit met behulp van Beyond Compare en aangepaste Python scripts om deltas te benadrukken, terwijl we voor Niveau 2 aggregaat checksums controleerden en individuele velden spot-checkten. Het resultaat was de ontdekking van een kritische fout waarbij COBOL tussenberekeningen afkortte tot vijf decimalen, terwijl de standaard BigDecimal deling van Java de schaal onvoorspelbaar behield, wat resulteerde in een afwijking van $0.01 op rekeningen met hoge rente. Zodra deze was geïdentificeerd, pasten we de afrondingsmodus van Java aan naar HALF_UP met expliciete schaal, waardoor perfecte pariteit werd bereikt.

Wat kandidaten vaak missen

Hoe detecteer je coderingscorruptie bij het valideren van vast-breedte bestanden die zijn gemigreerd van EBCDIC naar ASCII?

Veel testers inspecteren gegevens visueel in teksteditors, waarbij ze missen dat COBOL mainframes vaak de EBCDIC codepagina CP037 gebruiken, terwijl Java systemen UTF-8 gebruiken. Speciale tekens zoals valuta-symbolen (€, £) of accenten op klantnamen kunnen verkeerd worden toegewezen. Om dit te verifiëren, moet je bestanden openen in een hex-editor om byte-niveau representaties te vergelijken, ervoor te zorgen dat achterliggende spaties in COBOL (vaak hex 40) niet worden verward met null-terminators in Java (hex 00), en dat packed decimal (COMP-3) velden correct worden uitgepakt zonder teken-bit corruptie.

Waarom kunnen twee mathematisch equivalente berekeningen verschillende resultaten opleveren in COBOL versus Java, zelfs wanneer beide "decimale" types gebruiken?

Kandidaten veronderstellen vaak dat BigDecimal identiek gedrag garandeert aan de packed decimal van COBOL. Echter, COBOL voert base-10 rekeningen uit met vaste nauwkeurigheid bepaald door de PIC clausule (bijv. PIC 9(9)V99), en snijdt tussenresultaten af bij elke operationele stap volgens zakelijke regels. Java's BigDecimal, behoudt standaard arbitraire precisie, tenzij je expliciet een MathContext en RoundingMode instelt. De oplossing is om de truncatielogica van COBOL te repliceren door bewerkingen te koppelen met expliciete setScale() aanroepen en de legacy-afrondingsmodus (vaak HALF_UP of HALF_EVEN) bij elke tussentijdse stap, niet alleen het eindresultaat, te evenaren.

Hoe valideer je temporele nauwkeurigheid wanneer het legacy-systeem de Zomertijd (DST) negeert, terwijl de nieuwe Java applicatie gebruik maakt van UTC of lokale tijd met DST-gevoeligheid?

Dit wordt vaak gemist omdat testers tijdstempels op oppervlakkige wijze vergelijken. Als de legacy COBOL job het hele jaar door draait op EST (Eastern Standard Time), terwijl de Java service America/New_York gebruikt (dat overstapt naar EDT), zullen transacties die plaatsvinden tussen 2:00 AM en 3:00 AM op de tweede zondag in maart een uur offset hebben. Om dit op te lossen, moeten testers beide tijdstempels converteren naar een canoniek formaat (bijv. UTC epoch milliseconden) tijdens handmatige validatie, verifiëren dat "einde van de dag" batch cutoff parameters (vaak "23:59:59") consistent worden geïnterpreteerd, en ervoor zorgen dat de grenslogiek van de datum (bijv. "laatste werkdag van de maand") niet verschuift door het ontbrekende uur in de lente of het extra uur in de herfst.