Testgetriebene Entwicklung mit Access

Start im Testrunner

Nach erfolgreichem Kompiliervorgang starten Sie nun den Test im Testrunner (wenn Sie vergessen zu kompilieren, erscheint eine entsprechende Meldung). Natürlich scheitert auch dieser Test, weil die Funktion FastLookup noch keinen Wert zurückgibt. Passen Sie nun die Funktion so an, dass der Test auf möglichst einfache Art bestanden wird. Dazu lassen Sie einfach die herkömmliche DLookup-Anweisung arbeiten. Ergänzen Sie die FastLookup-Funktion also durch folgendeZeile:'

FastLookup = DLookup(strField, strTable, strCriteria)

Der Test liefert einen grünen Balken, also legen Sie eine weitere Assertion an, die prüft, ob die Funktion für eine Abfrage, die keinen Datensatz zurückliefert, den Wert Null zurückgibt.

objTestcase.Assert "Nicht vorhandener Datensatz", Is-
Null(FastLookup("[Personal-Nr]", "Personal", "1=2"))

Dieser Test ist auf Anhieb erfolgreich: Auch das ist möglich und dient entsprechend als zusätzliche Absicherung.

Es gibt sicher noch eine Menge anderer Tests zum Sicherstellen der Funktionalität – je genauer Sie hier arbeiten, desto besser. Für Demonstrationszwecke sollen diese beiden Annahmen ausreichen; kümmern Sie sich nun um das eigentliche Problem: Es sollte ja ein Ersatz für die DLookup-Funktion gebaut werden, und keine Wrapper-Funktion.

Public Function FastLookup(strField As String, strTable As String, strCriteria As String) As Variant
Dim strSQL As String
On Error Resume Next
strSQL = "SELECT [" & strField & "] FROM [" & strTable & "]"
If Len(strCriteria) > 0 Then
strSQL = strSQL & " WHERE " & strCriteria
End If
FastLookup = DBEngine(0)(0).OpenRecordset(strSQL, dbOpenForwardOnly)(0)
End Function

Also stellen Sie Ihre eigene DLookup-Funktion zusammen, die wie in Listing 4 aussehen könnte. Kompilieren Sie das Projekt und starten Sie erneut den Test. Die erste Assertion ist richtig, aber die Funktion gibt nicht den Wert Null zurück, wenn sie keinen Datensatz findet. Das müssen Sie noch ändern, indem Sie folgenden Dreizeiler am Ende der Funktion einbauen:

If FastLookup = "" Then
FastLookup = Null
End If

Nun läuft der Test ohne Fehler durch – Fertig! Sie können die Funktion nun jederzeit verändern und per Mausklick prüfen, ob sie noch richtigfunktioniert. Wenn Sie die Funktionalität ändern möchten, müssen Sie natürlich vorher die Tests anpassen – und nicht umgekehrt. Was bei diesem kleinen Beispiel nach verhältnismäßig viel Aufwand aussieht, relativiert sich bei umfangreicheren Projekten. Zwar hat man immer ein ähnliches Verhältnis zwischen Testcode und Produktivcode, aber der Aufwand bei späterenÄnderungen oder beim Refactoring des Codes wird wesentlich geringer, zumindest wenn Sie bis dato nach jeder geänderten Zeile Code die komplette Anwendung auf eventuelle Randeffekte geprüft haben.