Automatische Unit Tests

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

M0rgenstern

Betreff: Automatische Unit Tests

BeitragMo, Jul 16, 2012 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.
Ich wollte hier mal was reinstellen, was einige vielleicht interessant finden könnten:
Eine automatisierte Testumgebung für Unit Tests.

(Edit)
Kleine Erklärung: Scheinbar kennen andere Leute Unit Tests eher als Modultests.
Also im Prinzip geht es darum, zu prüfen, ob ein Programm sich so verhält wie man es erwartet. Dafür schreibt man dann Testfunktionen, die einfach die zu testenden Funktionen in dem Programm aufrufen und für vorgegebene Eingaben die entsprechenden Ausgaben überprüfen. Weicht eine Ausgabe von dem erwarteten Ergebnis ab, dann stimmt etwas im Programm nicht.
Und mein Modul stellt halt nun Funktionen zum Prüfen zur Verfügung und lässt die Testfunktionen vollautomatisch laufen.

Das ganze funktioniert folgendermaßen:
Es gibt eine Klasse, den "TUnitTestProvider", die alle Funktionen zum vergleichen von Werten und Objekten bereithält.
Mithilfe dieser Funktionen können in anderen Klassen Testmethoden geschrieben werden.
Diese Klassen müssen alle namentlich bei dem TUnitTestProvider registriert werden.
Der TUnitTestProvider ruft dann per reflection alle Testmethoden in den Klassen auf (gekennzeichnet durch ein Test__ am Anfang des Methodennamens).
Die Testergebnisse werden dann in eine (oder mehrere) Dateien geschrieben. Undzwar schön formatiert.

Hier ist ein Beispielcode dafür, wie Tests aussehen könnten:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Import siliziumbrain.unittestprovider

Type TMan Extends TObject
Field Name:String
Field Age:Int

Rem
bbdoc:Checks if two objects are equal.
End Rem

Method Equals:Byte(ptoOtherObject:TObject)
If(ptoOtherObject = Null) Then Return False
If(Not TMan(ptoOtherObject)) Then Return False
If(ptoOtherObject = Self) Then Return True

Local man:TMan = TMan(ptoOtherObject)

If(Name = man.Name) Then
If(Age = man.Age) Then
Return True
EndIf
EndIf

Return False
End Method

Method NewMan:TMan(psName:String, piAge:Int)
Name = psName
Age = piAge

Return Self
End Method

Rem
bbdoc:Copies the object.
End Rem

Method Copy:TMan()
Return New TMan.NewMan(Name, Age)
End Method

Rem
bbdoc:Returns the Object as a string.
End Rem

Method ToString:String()
Return("A man with the name " + Name + " has the age " + Age + " Instance: " + Super.ToString())
End Method
End Type

Type TManUnitTests
Method Test__CheckEquality(o:Object)
TUnitTestProvider.TestStart("TManUnitTests.Test__CheckEquality", "UnitTestsTest.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")
Local man1:TMan = New TMan.NewMan("M0rgenstern", 23)
Local man2:TMan = man1.Copy()

TUnitTestProvider.AssertNotNull(man1, "TManUnitTests.Test__CheckEquality", "UnitTestTests.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")

TUnitTestProvider.AssertNotNull(man2, "TManUnitTests.Test__CheckEquality", "UnitTestTests.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")

TUnitTestProvider.AssertTObjectAreEqual(man1, man2, "TManUnitTests.Test__CheckEquality", "UnitTestTests.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")
TUnitTestProvider.TestEnd("TManUnitTests.Test__CheckEquality", "UnitTestsTest.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")
End Method

Method Test__CheckUnEqual(o:Object)
TUnitTestProvider.TestStart("TManUnitTests.Test__CheckUnEqual", "UnitTestsTest.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")
Local man1:TMan = New TMan.NewMan("M0rgenstern", 22)
Local man2:TMan = New TMan.NewMan("Sam", 25)

Local man3:TMan = Null

TUnitTestProvider.AssertNotNull(man1, "TManUnitTests.Test__CheckUnEqual", "UnitTestTests.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")

TUnitTestProvider.AssertNotNull(man2, "TManUnitTests.Test__CheckUnEqual", "UnitTestTests.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")

TUnitTestProvider.AssertNotNull(man3, "TManUnitTests.Test__CheckUnEqual", "UnitTestTests.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")

TUnitTestProvider.AssertTObjectAreEqual(man1, man2, "TManUnitTests.Test__CheckUnEqual", "UnitTestTests.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")

TUnitTestProvider.AssertIntAreEqual(man1.Age, man2.Age, "TManUnitTests.Test__CheckUnEqual", "UnitTestTests", CurrentDir() + "/log.logs/UnitTestsLog.log")

TUnitTestProvider.AssertObjectAreEqual(man1.Name, man2.Name, "TManUnitTests.Test__CheckUnEqual", "UnitTestTests", CurrentDir() + "/log.logs/UnitTestsLog.log")
TUnitTestProvider.TestEnd("TManUnitTests.Test__CheckUnEqual", "UnitTestsTest.bmx", CurrentDir() + "/log.logs/UnitTestsLog.log")
End Method

End Type

'Tests starten...
Local list:TList = New TList
list.AddLast("TManUnitTests")
TUnitTestProvider.SetUpUnitTesting(list)
TUnitTestProvider.StartUnitTesting(CurrentDir() + "/log.logs/UnitTestsLog.log")


Die Testergebnisse sehen dann so aus:
Code: [AUSKLAPPEN]
[UnitTests] ***************************** Methods in Type 'TManUnitTests' are tested. *****************************     (15 Jul 2012 - 23:58:39)

[UnitTests] Calling Test Method: Test__CheckEquality     (15 Jul 2012 - 23:58:39)
[UnitTests] ---------------------------- Test 'TManUnitTests.Test__CheckEquality' starts. ----------------------------     (15 Jul 2012 - 23:58:39)
[UnitTests] ____________________ Test 'TManUnitTests.Test__CheckEquality' ended. ____________________     (15 Jul 2012 - 23:58:39)

[UnitTests] Calling Test Method: Test__CheckUnEqual     (15 Jul 2012 - 23:58:39)
[UnitTests] ---------------------------- Test 'TManUnitTests.Test__CheckUnEqual' starts. ----------------------------     (15 Jul 2012 - 23:58:39)
[UnitTests] An Error of the level __Loglevel: Debugging__ occured in the file: UnitTestTests.bmx.
     * It says: An Exception of the Type 'TestFailException' has occurred at 15 Jul 2012 - 23:58:39.
     -- Itself says: A Unit Test failed.
     -- The extern input says: Object is null although it is not supposed to be. Test failed in : TManUnitTests.Test__CheckUnEqual
     -- Exception ID: 1.
     -- The following object was used: No Object used.
[UnitTests] An Error of the level __Loglevel: Debugging__ occured in the file: UnitTestTests.bmx.
     * It says: An Exception of the Type 'TestFailException' has occurred at 15 Jul 2012 - 23:58:39.
     -- Itself says: A Unit Test failed.
     -- The extern input says: TObjects are not equal. Expected was: A man with the name M0rgenstern has the age 22 Instance: 00BC4D78 but it was: A man with the name Sam has the age 25 Instance: 00BC4D58. Test failed in : TManUnitTests.Test__CheckUnEqual
     -- Exception ID: 2.
     -- The following object was used: No Object used.
[UnitTests] An Error of the level __Loglevel: Debugging__ occured in the file: UnitTestTests.
     * It says: An Exception of the Type 'TestFailException' has occurred at 15 Jul 2012 - 23:58:39.
     -- Itself says: A Unit Test failed.
     -- The extern input says: Integers are not equal. Expected was: 22 but it was: 25. Test failed in : TManUnitTests.Test__CheckUnEqual
     -- Exception ID: 3.
     -- The following object was used: No Object used.
[UnitTests] An Error of the level __Loglevel: Debugging__ occured in the file: UnitTestTests.
     * It says: An Exception of the Type 'TestFailException' has occurred at 15 Jul 2012 - 23:58:39.
     -- Itself says: A Unit Test failed.
     -- The extern input says: Objects are not equal. Expected was: M0rgenstern but it was: Sam. Test failed in : TManUnitTests.Test__CheckUnEqual
     -- Exception ID: 4.
     -- The following object was used: No Object used.
[UnitTests] ____________________ Test 'TManUnitTests.Test__CheckUnEqual' ended. ____________________     (15 Jul 2012 - 23:58:39)

[UnitTests] ######################################################################################################     (15 Jul 2012 - 23:58:39)



Die benötigte Modulsammlung findet ihr unter folgendem Link:
www.siliziumbrain.de/downloads...te.mod.zip

Voraussetzung dafür, dass das ganze läuft: Threaded Build muss angeschaltet sein.

Alles ist komplett (in englisch) kommentiert und sollte leicht verständlich sein. Bei Fragen oder Problemen stehe ich gerne zur Verfügung.

Über eure Meinung wäre ich sehr froh.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group