Unittesting - Was bei vielen "Void"funktionen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
McEnroe
User
Beiträge: 5
Registriert: Montag 5. Februar 2007, 13:21

Ich habe gerade das unittest Modul für mich entdeckt. Ich finde den Ansatz des Unittesting toll. Deshalb habe ich mir gedacht, ein paar Test für meine Module und Anwendungen zu basteln. Das konkrete Modul soll Applikationen (bzw. ihre Quellen) aus SVN-Repositorys beziehen, configuriern (./configure; cmake) bauen und installieren. Dabei baut es auf eine Konfigurationsdatei auf aus der es URLs, Flags, Optionen usw. bezieht. Dabei sind viele Funktionen "void"-Funktionen (d.h. Funktionen ohne Rückgabewert wie zum Beispiel "doSvnUpdate()").

Das Problem ist schnell umschrieben: Wie kann ich so etwas Unittesten?
lunar

McEnroe hat geschrieben:Dabei sind viele Funktionen "void"-Funktionen (d.h. Funktionen ohne Rückgabewert wie zum Beispiel "doSvnUpdate()").
die aber doch hoffentlich im Fehlerfall Ausnahmen auslösen, ansonsten kannst du ...
Das Problem ist schnell umschrieben: Wie kann ich so etwas Unittesten?
... das nämlich nicht wirklich vernünftig testen.
McEnroe
User
Beiträge: 5
Registriert: Montag 5. Februar 2007, 13:21

lunar hat geschrieben:
McEnroe hat geschrieben:Dabei sind viele Funktionen "void"-Funktionen (d.h. Funktionen ohne Rückgabewert wie zum Beispiel "doSvnUpdate()").
die aber doch hoffentlich im Fehlerfall Ausnahmen auslösen, ansonsten kannst du ...
Das Problem ist schnell umschrieben: Wie kann ich so etwas Unittesten?
... das nämlich nicht wirklich vernünftig testen.
Nicht direkt. Sie returnen den Returncode der Anwendung die sie ausführen. Das könnte man noch testen. Das Problem ist eher, die Datenquelle. Ich kann nicht einfach ein SVN Repository zum Testen mitgeben.

Also: Was returnen die? -> Wie manage ich die Quelle, deren Daten verarbeitet werden?
Es nicht einfach Zahlen, oder Zeichenketten die verarbeitet werden, sonder komplexe Sachen, wie Repositorys, Verzeichnisstrukturen, oder Objektdateinen...
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

McEnroe hat geschrieben:Das Problem ist schnell umschrieben: Wie kann ich so etwas Unittesten?
Indem du den Zielzustand mit dem Sollzustand vergleichst.

bei funktionen, die was zurückgeben (und keine nebeneffekte haben) ist das trivial, wie du schon selbst bemerkt hast.

funktionen, die nichts zurückgeben, und hauptsächlich nebeneffekte haben, lassen sich etwas schwerer testen.

ein test für eine funktion createfile(filename), die None zurückgibt, und eine datei anlegt, könnte so aussehen

Code: Alles auswählen

import os
import unittest
class MyTestCase(unittest.TestCase):
  def test(self):
    filename = '/tmp/testfile'
    createfile(filename)
    assert os.path.isfile(filename)
wenn du feststellst, dass du viele funktionen hast, die sich nur schwer testen lassen, kann (muss aber nicht) dass ein hinweis darauf sein, dass du dein Design überdenken solltest.
Ein "Gutes Design(tm)" ist in der (oder zumindest meiner) Idealvorstellung modular, und lässt sich gut testen, weil man jedes Element für sich testen kann.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

keppla hat geschrieben:Ein "Gutes Design(tm)" ist in der (oder zumindest meiner) Idealvorstellung modular, und lässt sich gut testen, weil man jedes Element für sich testen kann.
Aber so bald du Dinge wie Datenbanken, RPCs oder noch schlimmer: "echte Geräte", testen musst, ist das aber nicht mehr so einfach möglich. Die Testumgebung wir dann locker so groß wie das eigentliche Modul. Und diese Testumgebung muss natürlich auch noch mal getestet werden, wenn du eine gute Abdeckung haben willst, da sonst die Tests selber überflüssig sind.

@McEnroe:
Bei einem Szenarie wie bei dir, bietet es sich an, Teile der Schnittstelle des Repositories nachzubilden und dann in die zu testende Instanz einzuschleusen. Das ist bei Python doch sehr einfach möglich und vereinfacht das Testen enorm (mit Java will ich sowas nicht probieren...). Dein eingebrachtes Objekt hast du dann vollständig unter Kontrolle und kannst Exceptions werfen und Rückgabewerte erzeugen wie du möchtest.[/code]
BlackJack

Für solche "Mock-Objects" gibt's auch Bibliotheken:

http://pmock.sourceforge.net/
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

EyDu hat geschrieben:
keppla hat geschrieben:Ein "Gutes Design(tm)" ist in der (oder zumindest meiner) Idealvorstellung modular, und lässt sich gut testen, weil man jedes Element für sich testen kann.
Aber so bald du Dinge wie Datenbanken, RPCs oder noch schlimmer: "echte Geräte", testen musst, ist das aber nicht mehr so einfach möglich.
Klar, dass die Realität manchmal anders aussieht, deshalb schrieb ich von Idealvorstellungen.
Allerdings kann man, wenn man sich eben hübsch um Modularität bemüht, dann einfach den "untestbaren" bereicht ungetestet lassen, aber den Rest testen.
Davon ab gibts mittlerweile auch Testtools für schwertestbare Dinge, wie Webseiten, etc, mit denen man teilweise recht brauchbare ergebnisse erziehlt.
Imho sollte man beim Testen immer dran denken, dass man nicht einen Beweis führt, sondern nur Alarmanlagen anbaut.
Ein fehlerfreier Testlauf heist nicht fehlerfrei, sondern nur "keine der früheren Fehler gefunden".
Antworten