2013-07-23 4 views
9

Ich habe eine Testmethode, die zwei XML-Dateien als Eingabe akzeptiert und vergleicht. Ich verwende Microsoft.VisualStudio.TestTools.UnitTesting Framework auf .NET 4.5. Ich möchte die Testmethode so ändern, dass sie mehrere XML-Dateien (zwei gleichzeitig in Paaren) benötigt, den Test ausführt und die Ergebnisse getrennt angibt.Datengetriebenes Testen in C# mit Arrays

Ich habe den folgenden Code versucht, aber es gibt nur einen einzigen Ausgang und stoppt, wenn ein Paar Eingabedateien den Test nicht besteht.

string[] source = {file1, file2, file3, file4....}; 
string[] target = {fileA, fileB, fileC, fileD....}; 

[Test Method] 
public void TestCase01() 
{ 
     TestLogic testObj = new TestLogic(); //class containing the comparison method 
     for (int i = 0; i < source.Length; i++) 
     { 
      Assert.IsTrue (testObj.VerifyFiles(source[i], target[i])); 
     } 
} 

Nach einigen Recherchen ich, dass DataSource Attribut verwendet werden, herausgefunden werden. Aber ich weiß nicht, wie man zwei Arrays (oder ein einzelnes zweidimensionales Array) an das DataSource Attribut übergibt. Ich würde lieber Microsoft.VisualStudio.TestTools.UnitTesting zum Testen und andere 3rd Party Frameworks wie NUnit nur als letztes Mittel verwenden.

Bearbeiten: Ich weiß nicht die Anzahl der Eingabedateien. Ich habe 4 Dateien nur als Beispiel benutzt. Bevor Sie die Dateien an die TestMethod übergeben, packe ich sie mit ihren IDs. Also lese ich zuerst zwei Dateien aus zwei verschiedenen Ordnern, kupple sie basierend auf ihrer ID und übergebe dann die gepaarten Dateien zum Testen an den Testfall. Ich speichere jetzt die gepaarten Dateinamen (Quelle und Ziel) in einem Array oder einer Liste und übergebe sie dann an den Testfall. Offensichtlich funktioniert diese Methode nicht und ich habe das oben erwähnte Problem.

Antwort

0

Simply Equate könnte funktionieren Datasource instance = Array. Datenquellenzeilen in Schleifen- und Zeilenwerten als Array-Instanz.

+5

Können Sie bitte ein wenig ausarbeiten? Vielleicht gib ein Demo-Code dafür. – Vijay

7

Sie können als DataSource eine CSV-Datei verwenden, die Tow-Spalten haben wird (eine für Quelle und eine für Ziel). Dann in Ihrem Test es wie folgt verwendet werden:

[TestClass] 
public class TestCase 
{ 
    [TestMethod] 
    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "files.csv", "files#csv", DataAccessMethod.Sequential)] 
    public void TestCase() 
    { 
     TestLogic testObj = new TestLogic(); 

     string source = (string) TestContext.DataRow["source"]; // get the value from the 'source' column 
     string target = (string) TestContext.DataRow["target"]; // get the value from the 'target' column 

     Assert.IsTrue(testObj.VerifyFiles(source, target)); 
    } 

    public TestContext TestContext{ get; set; } 
} 

Der Test durch die Reihen der Datasource durchlaufen und wird einmal für jede Zeile ausgeführt werden.

Überprüfen Sie here für weitere Details.

+1

Stellen Sie sicher, dass .csv-Datei in Quelle eingecheckt ist ... –

+0

Also mit dieser Methode muss ich die Dateien aus zwei Ordner lesen, sie auf der Grundlage ihrer IDs paaren und dann die paarweise Dateinamen in einer CSV-Datei speichern Ich lese nach dem Testfall. Gibt es eine direktere Methode, dies zu tun? Wie direkt übergeben Array an die DataSource? – Vijay

+0

In Ihrer Frage haben Sie nichts über die Paarung erwähnt. Sie scheinen bereits gepaart zu sein. Nur Arrays von Strings (ich schlage die Pfade vor), also bestand meine Lösung darin, diese Arrays (die gepaarten Pfade) in einen scv zu schreiben und sie von dort zu lesen. Auf diese Weise müssen Sie den Testfall nicht duplizieren und mehr gepaarte Pfade hinzufügen, ohne den Code zu ändern. Wenn Sie zusätzliche Funktionen in Ihrem Test haben, bearbeiten Sie Ihre Frage. – Schaliasos

2

hatte ich ein ähnliches Problem und am Ende folgte die Empfehlung von this blog post,

wir eine Reihe von Anonyme Typen verwendet, um unsere Reihe von Bedingungen zu speichern, und verwenden dann LINQ foreach() -Methode Schleife durch das Array und führen Sie den Test für jedes Element.

+0

Das sieht genauso aus wie die ursprüngliche Lösung des OP, die er zu vermeiden versucht, z. "Es gibt nur eine einzige Ausgabe und stoppt, wenn ein Paar Eingabedateien den Test nicht besteht" –