Frage

Ich habe eine Klasse, die eine 2 XML-Dateien und erstellt eine Textdatei verarbeitet.

Ich möchte eine Reihe von Einheit / Integrationstests schreiben, die einzeln passieren können oder für diese Klasse fehlschlagen, die Folgendes tun:

  1. für Eingang A und B, erzeugt die Ausgabe.
  2. Vergleichen Sie den Inhalt der erzeugten Datei zu dem erwarteten Ausgang Inhalt
  3. Wenn die tatsächlichen Inhalte von den erwarteten abweichen Inhalte, fehlschlagen und einige nützlich Informationen über die Unterschiede anzuzeigen.

Im Folgenden ist der Prototyp für die Klasse zusammen mit meinem ersten Stich an Unit-Tests.

Gibt es ein Muster, das ich für diese Art von Tests verwenden sollte, oder tue Menschen neigen dazu, Myriaden von TestX () Funktionen zu schreiben?

Gibt es eine bessere Art und Weise Text-Datei Unterschiede von NUnit zu entlocken? Soll ich einen Text-Datei diff-Algorithmus einzubetten?


class ReportGenerator
{
    string Generate(string inputPathA, string inputPathB)
    {
        //do stuff
    }
}

[TextFixture]
public class ReportGeneratorTests
{
     static Diff(string pathToExpectedResult, string pathToActualResult)
     {
         using (StreamReader rs1 = File.OpenText(pathToExpectedResult))
         {
             using (StreamReader rs2 = File.OpenText(pathToActualResult))
             {
                 string actualContents = rs2.ReadToEnd();
                 string expectedContents = rs1.ReadToEnd();                  

                 //this works, but the output could be a LOT more useful.
                 Assert.AreEqual(expectedContents, actualContents);
             }
         }
     }

     static TestGenerate(string pathToInputA, string pathToInputB, string pathToExpectedResult)
     {
          ReportGenerator obj = new ReportGenerator();
          string pathToResult = obj.Generate(pathToInputA, pathToInputB);
          Diff(pathToExpectedResult, pathToResult);
     }

     [Test]
     public void TestX()
     {
          TestGenerate("x1.xml", "x2.xml", "x-expected.txt");
     }

     [Test]
     public void TestY()
     {
          TestGenerate("y1.xml", "y2.xml", "y-expected.txt");
     }

     //etc...
}

Update

Ich bin nicht daran interessiert, die diff-Funktionalität zu testen. Ich möchte nur, es benutzen besser lesbar Fehler zu produzieren.

War es hilfreich?

Lösung

Wie für die mehrere Tests mit verschiedenen Daten, verwenden Sie die NUnit RowTest Erweiterung:

using NUnit.Framework.Extensions;

[RowTest]
[Row("x1.xml", "x2.xml", "x-expected.xml")]
[Row("y1.xml", "y2.xml", "y-expected.xml")]
public void TestGenerate(string pathToInputA, string pathToInputB, string pathToExpectedResult)
 {
      ReportGenerator obj = new ReportGenerator();
      string pathToResult = obj.Generate(pathToInputA, pathToInputB);
      Diff(pathToExpectedResult, pathToResult);
 }

Andere Tipps

Sie fragen wahrscheinlich für die Prüfung gegen die „Gold“ Daten. Ich weiß nicht, ob es spezifischer Begriff für diese Art von Tests ist akzeptiert Weltweit, aber das ist, wie wir es tun.

Erstellen Basisvorrichtung Klasse. Es hat im Grunde „Leere dotext (string filename)“, die bestimmte Datei in den Speicher geladen wird, führen abstrakte Transformationsmethode „string-Transformation (string text)“, dann fileName.gold aus dem gleichen Ort gelesen und transformiert Text mit dem vergleichen, was erwartet wurde, . Wenn der Inhalt anders ist, wirft es Ausnahme. Ausnahme ausgelöst enthält Zeilennummer der ersten Differenz sowie Text von erwarteten und tatsächlichen Linie. Als Text stabil ist, ist dies in der Regel genug Informationen, das Problem sofort zu erkennen. Achten Sie darauf, Linien mit markieren „Erwartet:“ und „Actual“, oder Sie werden für immer zu raten, welche das ist, wenn sie bei Testergebnissen suchen.

Dann werden Sie spezifische Prüfvorrichtungen haben, wo Sie Methode implementieren Transformation, die richtige Arbeit erledigt, und dann Tests haben, die wie folgt aussehen:

[Test] public void TestX() { DoTest("X"); }
[Test] public void TestY() { DoTest("Y"); }

Name des ausgefallenen Tests werden Ihnen sofort sagen, was kaputt ist. Natürlich können Sie Reihe Tests Gruppe ähnliche Tests verwenden. in einer Reihe von Situationen hilft auch separate Tests Mit Tests wie zu ignorieren, Kommunikation Tests an Kollegen und so weiter. Es ist keine große Sache, ein Snippet zu schaffen, den Test für Sie in einem zweiten erstellen, werden Sie viel mehr Zeit Vorbereitung von Daten verbringen.

Dann werden Sie auch einige Testdaten benötigen und eine Möglichkeit, Ihre Basisvorrichtung es finden, sollten Sie darüber einzurichten Regeln für das Projekt. Wenn der Test fehlschlägt, Dump tatsächliche Ausgabe in die Datei in der Nähe des Gold, und löschen Sie es, wenn Testdurchlauf. Auf diese Weise können Diff-Tool verwenden können, wenn nötig. Wenn es kein Gold Daten gefunden ist, schlägt Test mit entsprechender Meldung, aber tatsächliche Ausgabe ist sowieso geschrieben, so können Sie überprüfen, ob es richtig ist, und kopieren Sie sich „Gold“ zu werden.

Ich würde wahrscheinlich eine einzige Einheit Test schreiben, der eine Schleife enthält. Innerhalb der Schleife, würde ich 2 XML-Dateien lesen und eine Diff-Datei, und diff dann die XML-Dateien (ohne es auf der Festplatte zu schreiben) und in der Diff-Datei von der Festplatte gelesen vergleichen. Die Dateien nummeriert werden würde, z.B. a1.xml, b1.xml, diff1.txt; a2.xml, b2.xml, diff2.txt; a3.xml, b3.xml, diff3.txt, etc., und die Schleife wird beendet, wenn es nicht die nächste Nummer findet.

Dann können Sie neue Tests schreiben, nur durch neue Textdateien hinzufügen.

Anstatt Anruf .AreEqual könnten Sie die beiden Eingangsströme selbst, halten Sie den Inhalt einer Zählung von Zeile und Spalte analysieren und vergleichen. Sobald Sie einen Unterschied finden, können Sie eine Meldung wie ...

erzeugen
  

Zeile 32 Spalte 12 - Gefunden 'x' als 'y' erwartet wurde,

Sie können optional das verbessern, indem mehrere Zeilen Ausgaben Anzeige

  

Differenz bei Zeile 32 Spalte 12, erster Unterschied gezeigt
  A = das ist ein t x st
  B = das ist ein t e sts

Beachten Sie, in der Regel, würde ich in der Regel nur durch meinen Code generieren eine der beiden Ströme Sie haben. Das andere Ich von einem Test / Textdatei greifen würde, mit dem Auge oder eine andere Methode überprüft hat, dass die darin enthaltenen Daten korrekt sind!

Ich würde wahrscheinlich verwenden XmlReader durch die Dateien zu durchlaufen und sie vergleichen. Wenn ich einen Unterschied treffen würde ich einen XPath an die Stelle anzuzeigen, wo die Dateien unterschiedlich sind.

PS: Aber in Wirklichkeit war es immer genug für mich, nur um ein einfaches Lesen der gesamten Datei in einen String zu tun und vergleichen, die beiden Strings. Für die Berichterstattung ist es genug, um zu sehen, dass der Test nicht bestanden. Dann, wenn ich das Debuggen tun diff ich in der Regel die Dateien mit Araxis Merge wo genau zu sehen, ich habe Probleme.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top