Die zweite Gattung von Tests, die automatischen Funktionstests, lassen sich am besten durch eine bedingte Assemblierung erreichen. In meinem Projekt geht es um die Portierung einer Java-Klasse nach Assembler. Daher wäre es gut, die DLL-Funktionen von einem Java-Testprogramm aus aufrufen zu können, um sie mit der bereits bestehenden Java-Klasse zu vergleichen. Hierzu könnte man mit dem Java Native Interface aufrufbare Wrapper der zu testenden Funktionen schreiben. Damit diese Wrapper nur für Testzwecke assembliert werden, rufen wir den Assembler in der Kommandozeile mit einem /dFTEST Parameter auf und können dann mit der Direktive ifdef FTEST, wie es auch der C-Präprozessor kennt, die Java-Wrapper nur für die Funktionstest-DLL assemblieren. Bislang habe ich diese Art von Integrationstests jedoch in meinem Assemblerprojekt noch nicht benötigt. Denn die erwarteten Werte zu einer fixen komprimierten Ephemeridendatei wie j1950.dat sind ja apriori bekannt. Ich kann sie daher auch in Form von fixen Erwartungen als Direktwerte in meine Unit Tests mit aufnehmen und erspare mir den aufwendigen Umweg über ein Java-Testprogramm.
Für die Unit Tests selbst habe ich bei diesem meinem allerersten Assemblerprojekt noch keine Lust, ein Framework zu entwickeln. Ich beginne also adhoc mit einer do-Schleife, die der Reihe nach die Namen der Testroutinen einem Symbol testSub zuweist, die Routine aufruft und einen Returncode in EAX entgegennimmt. EAX = 0 bedeutet: Test bestanden, alles andere bedeutet einen Fehlschlag des Tests. Wenn neue Tests hinzukommen, füge ich den Namen der Routine in die Symbolliste ein und setze die Ausgabe im Testplanstring manuell hoch. Das ist gerade genug, um bei diesem ersten Assemblerprojekt mit Unit Tests arbeiten zu können. Bei Gelegenheit - spätestens beim nächsten Assemblerprojekt - werde ich diese Schleife verallgemeinern.
Die main-Prozedur des Unittestprogramms sieht zur Zeit so aus:
;----------------------------------------------------------------------
; main()-Prozedur für Konsolenaufruf
;----------------------------------------------------------------------
.data
testplan db "1..2",13,10,0
not_ok db "not "
ok db "ok ",0
cr_lf db 13,10,0
cmt db "# ",0
compare db " / ",0
.code
main proc
local lStatus:dword ; Zeiger auf "ok" oder "nicht ok"
print offset testplan
testCount = 0
for testsub, <test1, \
test2 \
>
testCount = testCount + 1
invoke testsub
mov ebx, offset ok
or eax, eax
je @F
mov ebx, offset not_ok
@@:
mov lStatus,ebx
print lStatus
print ustr$(testCount)
print offset cr_lf
endm
; tearDown
invoke freeAll
ret
main endp
Keine Kommentare :
Kommentar veröffentlichen