Momentan arbeite ich an einem Projekt, das (unter anderem) eine Tabelle basierend auf dem Inhalt eines Dateisystems erstellt und wiederum einige Metadatenänderungen an den gefundenen Dingen vornimmt. Die Frage ist: Wie sollen Tests dazu geschrieben oder eingerichtet werden? Gibt es eine einfache Möglichkeit, dies zu verhöhnen? Oder sollte ich eine "Sandbox" einrichten?
quelle
Was ist falsch daran, ein "Test" -Dateisystem zu haben?
Erstellen Sie eine Vorlagenordner- / Verzeichnisstruktur, die über genügend Inhalt verfügt, um Ihre Vorgänge zu testen.
Kopieren Sie diese anfängliche Struktur während der Einrichtung Ihres Einheitentests (es wird empfohlen, die Vorlage zu komprimieren und in Ihren Testbereich zu entpacken). Führen Sie Ihre Tests durch. Löschen Sie das Ganze beim Abreißen.
Das Problem beim Verspotten ist zum einen, dass Dateisysteme, Betriebssysteme und Datenbanken, die zu Ihrem Projekt gehören, nicht wirklich als externe Ressourcen eingestuft werden. Zum anderen ist das Verspotten von Systemaufrufen auf niedriger Ebene sowohl zeitaufwendig als auch fehleranfällig.
quelle
Dies ist die Art von Dingen, die Sie auf jeden Fall für den Integrationstest benötigen, da reale Dateisysteme alle möglichen seltsamen Verhaltensweisen aufweisen (wie die Art und Weise, in der Windows das Löschen einer Datei nicht zulässt, wenn ein Prozess, einschließlich des Löschers, diese geöffnet hat).
Der TDD-Ansatz besteht also darin , zuerst den Integrationstest zu schreiben (TDD kennt streng genommen keine unterschiedlichen Konzepte für "Unit-Test" und "Integrationstest"; es handelt sich lediglich um Tests). Sehr wahrscheinlich wird das ausreichen; so Job stoppen, getan, nach Hause gehen .
Wenn nicht, wird es einige interne Komplexität geben, die nicht einfach durch Anordnen von Dateien angemessen getestet werden kann. In diesem Fall nehmen Sie einfach diese Komplexität heraus, ordnen sie einer Klasse zu und schreiben Unit-Tests für diese Klasse . Sehr wahrscheinlich werden Sie feststellen, dass diese gemeinsame Klasse auch in den Fällen Datenbank, XML-Datei usw. verwendet werden kann.
In keinem Fall würden Sie den grundlegenden Kern des Codes, den Sie schreiben, herausnehmen und ihn "verspotten", um Tests zu schreiben, die bestehen, ob das zu testende Gerät falsch ist oder nicht.
quelle
'unit test' and 'integration test'; they are just tests.
ich denke realistisch, dies wird die beste Lösung für meinen Fall sein - ich muss wirklich die Dateisystembibliotheken testen, die ich für Randfälle verwende, und wie die Anwendung darauf reagieren sollte jene. Wenn ich auf eine andere Dateisystembibliothek umsteige, möchte ich nicht einige Mocks / Testcodes neu schreiben müssen, um mit der neuen Bibliothek zu arbeiten, aber eine Testordnerstruktur und Integrationstests würden das viel einfacher machen.Ich verstehe Ihre Frage als "eine gute / akzeptierte Möglichkeit, eine Klasse zu testen, die von Dateisystemoperationen abhängt". Ich gehe nicht davon aus, dass Sie das Dateisystem Ihres Betriebssystems testen möchten.
Um den Aufwand für 'Schnittstellen zu Ihren Dateisystemoperationen und deren "Verspottung"' so gering wie möglich zu halten, empfiehlt es sich, Java - Binärdatenströme oder Textleser (oder ein gleichwertiges Element in c # oder c #) zu verwenden die von Ihnen verwendete Programmiersprache), anstatt Dateien mit Dateinamen direkt in Ihrer von tdd entwickelten Klasse zu verwenden.
Beispiel:
Mit Java habe ich eine Klasse CsvReader implementiert
Zum Testen habe ich solche Speicherdaten verwendet
oder Testdaten in die Ressourcen einbetten
In der Produktion verwende ich das Dateisystem
Auf diese Weise ist mein CsvReader nicht vom Dateisystem abhängig, sondern von einer Abstraktion "Reader", in der es eine Implementierung für das Dateisystem gibt.
quelle
Erstellen Sie einen Wrapper für die Dateisystemvorgänge. Übergeben Sie in den Tests einen Mock, der dieselbe Schnittstelle wie der Wrapper implementiert. In der Produktion übergeben Sie den Wrapper.
quelle