Wie teste ich einen Dateireader?

19

Ich arbeite an einem Projekt mit einigen Dateiformaten. Einige Formate werden von .xsds angegeben, andere von der Dokumentation auf den jeweiligen Websites, und einige sind benutzerdefinierte interne Formate, für die keine Dokumentation vorhanden ist. Mwahahahaha.

Was ist das Problem?

Ich möchte meine Dateireader testen, bin mir aber nicht ganz sicher, wie ich das machen soll. Der Ablauf der Anwendung ist wie folgt:

file.___  ===> read by FileReader.java ===> which creates a Model object

Wo ist die FileReaderSchnittstelle

public interface FileReader {
    public Model read(String filename);
}

Die Modelhat eine Reihe von Attributen, die beim Lesen der Datei ausgefüllt werden. Es sieht ungefähr so ​​aus

public class Model {
    List<String> as;
    List<String> bs;
    boolean isAPain = true;
    // ...
}

Was habe ich versucht?

Meine einzige Idee war, Datei "Generatoren" für jedes Dateiformat zu erstellen. Bei diesen Generatoren handelt es sich im Grunde genommen um Builder, die einige Variablen (z. B. die Anzahl der zu generierenden Kommentare in einer Datei) aufnehmen und eine Beispieldatei ausgeben, die ich dann einlese und Modelmit den Variablen vergleiche, mit denen ich die Datei ursprünglich generiert habe.

Dies hat jedoch einige Probleme:

  • Die Dateien , die es erzeugt nicht aussehen wie echte Dateien. Der Generator ist in keiner Weise kontextbezogen.
  • Es ist schwer zu erkennen, ob der Generator für Flankenfälle generiert hat, da ich die Variablen manuell einstelle. Diese Methode ist kaum besser als ich, wenn ich ein Dutzend Beispieldateien erstelle.

Gibt es dafür bessere Möglichkeiten?

EDIT: Unit auf Integration umgestellt, da ich das eigentlich meine.

EDIT2: Hier ist ein Beispiel für die Randfälle, die ich erwähnt habe.

Jede Datei stellt ein Diagramm dar, das aus Eckpunkten und Kanten besteht. Diese Eckpunkte und Kanten können auf verschiedene Arten verbunden werden:

v1 -- e1 --> v2 <-- e2 -- v3

unterscheidet sich von

v1 -- e1 --> v2 -- e2 --> v3

, dass die Richtung der Kanten von Bedeutung ist. Ich bin mir nicht sicher, ob dies im Rahmen der Frage liegt, aber es ist schwierig, alle relevanten Kantenfälle zu erdenken, wenn ich die Anzahl der Scheitelpunkte und Kanten manuell einstelle und die Verbindungen nur zufällig generiere.

sdasdadas
quelle
1
Datengetriebenes Testen fällt mir ein. Können Sie konkrete Beispiele für Randfälle nennen (basierend auf den Randfällen, die möglicherweise in der tatsächlichen FileReaderImplementierung ausgelöst werden könnten )? Beispiel: Unter Berücksichtigung der in Bilddateiformaten gefundenen Randfälle sollte für jeden Tabelleneintrag, wenn die Zeilen- / Spaltenkombination von Eigenschaften unterstützt wird, mindestens ein Testfall (eine Datendatei) vorhanden sein, der diese Kombination abdeckt.
Rwong
@rwong Ich habe ein Beispiel hinzugefügt, bin mir aber nicht sicher, ob es Ihnen eine Idee gibt. Ich denke, mein Problem ist ein häufiges mit Randfällen, dh. Habe ich welche verpasst? Datengesteuertes Testen sieht jedoch interessant aus. Vielen Dank!
sdasdadas
7
Auch ich habe gerade bemerkt dies, aber meine Rand Fällen buchstäblich Rand Fällen.
sdasdadas
1
Warum nicht handwerkliche Testdateien erstellen und dann immer mit denselben Dateien ausführen?
Bobson
@ Bobson Das ist ein bisschen schlimmer als mit einem Generator. In diesem Fall kann es sein, dass ich Randfälle verpasse (wie ich es jetzt wahrscheinlich vermisse), aber ich kann auch Fehler in meine Eingabe einbringen. Und bei großen Dateien würde es eine Weile dauern, sie selbst zu erstellen.
sdasdadas

Antworten:

19

Lassen Sie uns zunächst über Ihre Ziele sprechen:

  • Sie möchten offensichtlich keine "Dateiformate" testen - Sie möchten Ihre verschiedenen FileReaderImplementierungen testen

  • Sie möchten durch automatische Tests so viele verschiedene Arten von Fehlern wie möglich finden

Um dieses Ziel vollständig zu erreichen, müssen Sie, meiner Meinung nach, verschiedene Strategien kombinieren:

  • Erstens echte Unit-Tests: Ihre FileReader Implementierungen bestehen aus vielen verschiedenen Teilen und Funktionen. Schreiben Sie kleine Tests, bei denen jeder einzeln getestet wird. Gestalten Sie Ihre Funktionen so, dass sie die Daten nicht unbedingt aus einer Datei lesen müssen. Diese Art von Tests wird Ihnen helfen, die meisten Ihrer Randfälle zu testen.
  • Zweitens, generierte Dateien: Das würde ich Integrationstests nennen. Mithilfe dieser Dateien können Sie von Punkt 1 abweichende Fehler aufspüren, z. B. Kombinationen bestimmter Parameter, Fehler beim Dateizugriff usw. Um gute Testfälle zu erstellen, ist es hilfreich, sich mit einigen klassischen Techniken wie dem Gruppieren von Testfällen vertraut zu machen Äquivalenzklassen oder Grenzwertprüfung. Holen Sie sich eine Kopie dieses Buches von Glenford Myers , um mehr darüber zu erfahren. Der Wikipedia-Artikel über Softwaretests ist ebenfalls eine gute Ressource.
  • Drittens sollten Sie versuchen, Daten aus der realen Welt abzurufen: Es kann schwierig sein, zu überprüfen, ob diese Dateien von Ihren FileReaders korrekt ausgewertet werden. Es kann sich jedoch lohnen, dies zu tun, da häufig Fehler gefunden werden, die von den ersten beiden Strategien nicht aufgedeckt wurden. Manche Leute würden solche Dinge auch "Integrationstests" nennen, andere bevorzugen "Akzeptanztests", aber in Wirklichkeit spielt der Begriff keine Rolle.

Meiner Meinung nach gibt es keinen "Shortcut" -Ansatz, mit dem Sie alle drei Strategien "zum Preis von einer" nutzen können. Wenn Sie Randfälle sowie Fehler in Standardfällen und in realen Fällen erkennen möchten, müssen Sie mindestens einige - wahrscheinlich auch große - Anstrengungen unternehmen. Glücklicherweise können alle diese Ansätze verwendet werden, um automatische, wiederholbare Tests zu erstellen.

Darüber hinaus sollten Sie sicherstellen, dass Ihre FileReaders beim Lesen dieser Daten keine Fehler maskieren - erstellen Sie integrierte Überprüfungen / Behauptungen, werfen Sie Ausnahmen, wenn intern etwas schief geht usw. Dadurch hat Ihr Testcode eine viel bessere Chance, Fehler zu erkennen Auch wenn Sie keine explizite Testdatei oder keinen Testfall für eine unerwartete Situation haben.

Doc Brown
quelle
Tolle Antwort, und ich bearbeite den Titel meiner Frage, um sie besser zu reflektieren. Vielen Dank!
sdasdadas