Frage Wo kann die erwartete Ausgabe eines Tests gespeichert werden?


Schreiben eines Tests Ich erwarte, dass die getestete Methode bestimmte Ausgaben zurückgibt. Normalerweise überprüfe ich, dass ich für eine bestimmte Datenbankoperation eine bestimmte Ausgabe bekomme. Meine Praxis war normalerweise das Schreiben eines Arrays als eine schnelle Karten- / Eigenschaftendatei im Test selbst. Diese Lösung ist schnell und nicht anfällig für Laufzeitänderungen einer externen Datei, von der die erwarteten Ergebnisse geladen werden.

Eine Lösung besteht darin, die Daten in eine Java-Quelldatei zu stellen, so dass ich den Test weniger aufblähe und trotzdem einen kompilierten Test bekomme. Wie wäre es damit?

Oder ist es Laden der erwarteten Ergebnisse als Ressourcen ein besserer Ansatz? Eine .properties Datei ist nicht gut genug, da ich nur einen Wert pro Schlüssel haben kann. Ist commons-config der Weg, den man gehen sollte?

Ich würde eine einfache Lösung bevorzugen, wo ich die Eigenschaften pro Schlüssel nenne, also könnte ich für jeden Eintrag eine haben doc-length und numFound Eigenschaftswert (klingt wie die Elemente eines xml-Knotens)?

Wie gehst du vor?


5
2018-05-18 18:47


Ursprung


Antworten:


Sie müssen sich daran erinnern, solche Tests durchzuführen. Nach dem Schreiben mehrerer Web-Services-Tests mit Spring-WS-Testunterstützung muss ich zugeben, dass das Speichern von Anfragen (Test-Setup) und erwarteter Antworten in externen XML-Dateien keine so gute Idee war. Jedes Anfrage-Antwort-Paar hatte das gleiche Präfix wie der Test, also war alles automatisiert und sehr sauber. Dennoch wird das Refactoring und die Diagnose von Testfehlern schmerzhaft. Nach einiger Zeit erkannte ich, dass das Einbetten von XML im Testfall als String, obwohl hässlich, viel einfacher zu verwalten ist.

In Ihrem Fall nehme ich an, dass Sie eine Datenbankabfrage aufrufen und Sie erhalten eine Liste von Karten als Antwort. Was ist mit dem Schreiben von etwas nettem DSL, um Aussagen über diese Strukturen zu machen? Tatsächlich, FEST-Zusicherung ist ziemlich gut dafür.

Nehmen wir an, Sie testen die folgende Abfrage (ich weiß, dass es eine übermäßige Vereinfachung ist):

List<Map<String, Object>> rs = db.query("SELECT id, name FROM Users");

dann kannst du einfach schreiben:

assertThat(rs).hasSize(1);
assertThat(rs.get(0))
  .hasSize(2)
  .includes(
    entry("id", 7),
    entry("name", "John")
  )
);

Natürlich kann und sollte es weiter vereinfacht werden, um Ihren Bedürfnissen besser gerecht zu werden. Ist es nicht einfacher, ein komplettes Testszenario auf einem Bildschirm zu haben, anstatt von einer Datei zur anderen zu springen?

Oder vielleicht sollten Sie es versuchen Fitnesse (Scheint so, als würden Sie nicht mehr Unit-Tests durchführen, also sollte das Framework für Akzeptanztests in Ordnung sein), wo Tests in Wiki-ähnlichen Dokumenten, einschließlich Tabellen, gespeichert werden?


3
2018-05-18 19:11



Ja, die Verwendung von Ressourcen für erwartete Ergebnisse (und auch Setup-Daten) funktioniert gut und ist ziemlich üblich.

XML kann ein nützliches Format für Sie sein - hierarchisch zu sein kann sicherlich helfen (ein Element pro Testmethode). Es hängt von der genauen Situation ab, aber es ist definitiv eine Option. Alternativ könnte JSON für Sie einfacher sein. Worin sind Sie mit Serialisierungs-APIs wohl?


2
2018-05-18 18:55



Wenn Sie angeben, dass Sie normalerweise testen, dass eine bestimmte DB-Operation die erwartete Ausgabe zurückgibt, sollten Sie sich die Verwendung von DBUnit:

 // Load expected data from an XML dataset
    IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(new File("expectedDataSet.xml"));
    ITable expectedTable = expectedDataSet.getTable("TABLE_NAME");

    // Assert actual database table match expected table
    Assertion.assertEquals(expectedTable, actualTable);

DBUnit behandelt den Zustand einer Tabelle, nachdem eine Operation abgeschlossen wurde, und bestätigt, dass die Daten in der Tabelle mit einer erwarteten übereinstimmen DataSet. Das gebräuchlichste Format für die DataSet dass Sie den tatsächlichen Tabellenzustand mit dem wahrscheinlich vergleichen, verwenden Sie ein XmlDataSet, wo die erwarteten Daten aus einer XML-Datei geladen werden, aber es gibt auch andere Unterklassen.

Wenn Sie bereits Tests auf diese Weise durchführen, klingt es vielleicht so, als ob Sie bereits die gleiche Logik geschrieben haben - aber DBUnit kann Ihnen zusätzliche Funktionen geben, die Sie noch nicht kostenlos implementiert haben.


2
2018-05-18 19:11