Seite 1 von 1

Testen von optionalen Argumenten

BeitragVerfasst: Mi 17. Nov 2010, 13:51
von Christoph Jüngling
Ich frage mich gerade, wie man beim Testen mit optionalen Argumenten sinnvoll umgehen sollte. Streng genommen müsste man ja auch das Fehlen eines solchen Parameters im Aufruf testen, denn das ist ja eine mögliche Situation. Lustig wird es, wenn es mehrere solcher Parameter sind, dann steigt die Anzahl der Kombinationen schnell an, wofür gerade für die automatisierte Erstellung von Testroutinen eine große Hilfe wäre.

(Vielleicht passt das Thema auch nicht unbedingt in diesen Thread, dann verschiebt es einfach.)
/edit (Josef): ... wurde verschoben. ;)

BeitragVerfasst: Do 18. Nov 2010, 22:47
von Josef Pötzl
Hallo!

Meinst du "optionale Argumente" im Sinne von Empty bei Variant-Datentyp oder mit optionalen Werten.

Code: Alles auswählen
public sub MachWas(byval xyz as Variant)

vs.
Code: Alles auswählen
public sub MachWas(byval xyz as string = "abc")


Bei der letzten Variante könnte man den Test eigentlich mit den Standardwerten durchführen ... obwohl das genau genommen kein sicherer Test ist, da dann nicht auffällt, falls der Standardwert in der Funktion-Deklaration geändert wurde. => Beim Testen immer die Standardwerte weg lassen.

Aber anders gefragt: ergibt die Nutzung von unterschiedlichen Parametern nicht auch unterschiedliche Testszenarien, für die es sich sogar lohnt, einen eigenen Test zu schreiben?
(Anm.: Mir fällt kein Beispiel ein, wo ich je nach Bedarf unterschiedliche optionale Parameter nutze.)

mfg
Josef

Re:

BeitragVerfasst: Sa 12. Mär 2011, 15:17
von Christoph Jüngling
VBA unterstützt ja das Schlüsselwort "optional":
Code: Alles auswählen
Public Sub Prozedurname(Optional ByVal variable As Typ = Startwert)
Public Sub Prozedurname(Optional ByVal variable As Variant)


Im ersten Fall gebe ich dir Recht, denn dann ist der Parameter ja immer vorhanden, zur Not mit seinem Standardwert. Der zweite Fall erfordert unter Umständen ein IsMissing() im Code, ist daher generell aufwändiger und erfordert daher einen separaten Test.

In gewisser Weise sind optionale Parameter in VBA mit dem Überladen von Funktionen zu vergleichen, allerdings wie gesagt mit erheblich freieren Kombinationsmöglichkeiten. Vielleicht sollte man gar nicht alles ausnutzen, was VB/VBA erlauben.

Re: Testen von optionalen Argumenten

BeitragVerfasst: Sa 12. Mär 2011, 15:54
von Josef Pötzl
Optional Parameter zum Auslassen von "Standardwerten" nutze ich gerne. Ich würde aber optionale Parameter nicht verwenden, um unterschiedliche Varianten auszuführen.

Beispiel:
Code: Alles auswählen
Public Function ExecuteQueryDefByName(ByVal QueryName As String, _
                             Optional ByVal QueryParamDefs As Variant) As Long
    dim qdf as dao.querydef
    set qdf = me.currentdb.Querydefs(QueryName)
    ExecuteQueryDefByName = ExecuteQueryDef(qdf, QueryParamDefs )
End Function

Public Function ExecuteQueryDef(ByVal qdf As DAO.QueryDef, _
                       Optional ByVal QdfParamDefs As Variant) As Long
...
End Function


Ich würde die Prozedur keinesfalls so gestalten:
Code: Alles auswählen
Public Function ExecuteQueryDef(Optional ByVal QueryName As String, _
                                Optional ByVal qdf As DAO.QueryDef = nothing, _
                                Optional ByVal QueryParamDefs As Variant) As Long
    if qdf is nothing then
        set qdf = me.currentdb.Querydefs(QueryName)
    end if
    ...
End Function


Ich würde den Aufruf auch nicht so gestalten:
Code: Alles auswählen
Public Function ExecuteQueryDef(ByVal QueryDefOrName As Variant, _
                       Optional ByVal QueryParamDefs As Variant) As Long
    dim qdf as dao.querydef
    if IsObject(QueryDefOrName)
       set qdf = QueryDefOrName
    else
        set qdf = me.currentdb.Querydefs(QueryName)
    end if
    ...
End Function


Allerdings könnte ich mir so etwas vorstellen:
Code: Alles auswählen
Public Function ExecuteQueryDef(ByVal QueryName As String, _
                       Optional ByVal QueryParamDefs As Variant) As Long
    dim qdf as dao.querydef
    set qdf = me.currentdb.Querydefs(QueryName)
    ExecuteQueryDefByName = ExecuteQueryDef(qdf, QueryParamDefs )
End Function

Public Function ExecuteQueryDef(ByVal qdf As DAO.QueryDef, _
                       Optional ByVal QdfParamDefs As Variant) As Long
   ...
End Function

.. nur das funktioniert in VB6/VBA nicht. ;)
=> Unterschiedliche Prozedurnamen werden erforderlich.

mfg
Josef