2015-05-18 18 views
5

Ich habe eine Testmethode, die 2 Unter-Testmethoden aufruft. Beide Untermethoden sind datengesteuert aus einer XML-Datei. Wenn ich alle Submethoden ausführen, laufen sie gut und erfolgreich. Wenn ich jedoch Main Test Method (Aufrufer beider Untermethoden) ausführe, findet es TestContext.DataConnection und TestContext.DataRow als null.Komponententest TestContext Mehrere Aufrufe

private TestContext testContext; 
    public TestContext TestContext 
    { 
     get { return testContext; } 
     set { testContext = value; } 
    } 
    [TestMethod] 
    public void SaveEmpty_Json_LocalStorage() 
    { 
     // Testing JSON Type format export and save 
     SetWindowsUsers(); 
     // Add Network Information 
     SetWifiInformation(); 

     // More logic and assertions here. 
     // More logic and assertions here. 
     // More logic and assertions here. 
    } 

    [TestMethod] 
    [DeploymentItem("input.xml")] 
    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", 
       "input.xml", 
       "User", 
       DataAccessMethod.Sequential)] 
    public void SetWindowsUsers() 
    { 
     Console.WriteLine(TestContext.DataRow["UserName"].ToString()) 
     // MORE LOGIC and Asserts 
    } 

    [TestMethod] 
    [DeploymentItem("input.xml")] 
    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", 
       "input.xml", 
       "WifiList", 
       DataAccessMethod.Sequential)] 
    public void SetWifiInformation() 
    { 
     Console.WriteLine(TestContext.DataRow["SSID"].ToString()) 
     // MORE LOGIC and Asserts 
    } 

Wenn ich alle starte, 2 Methoden bestanden und 1 fehlschlägt. Wenn ich einzeln ausführe, wird SaveData_Json_LocalStorage nicht bestanden, TestContext.DataRow wird immer als null abgerufen. Ist es in Ordnung, mehrere Methoden aufzurufen? Wie schreibt man am besten verkettete Testfälle?

+0

Ich habe nie die 'DeploymentItem' und' DataSource' Attribute gesehen, aber ich bin ziemlich sicher, dass sie die Quelle Ihres Problems sind. Attribute machen eigentlich nichts alleine. Sie benötigen das Unit-Test-Framework, um etwas mit ihnen zu tun. (Richten Sie in diesem Fall Ihre Daten ein.) Wenn Sie 'SetWindowsUsers' und' SetWifiInformation' direkt aufrufen, wird diese attributbasierte Konfiguration nicht ausgeführt. –

+1

Im Allgemeinen sollten Sie die Verkettung von Testfällen vermeiden. Es liegt am Test Runner, die Reihenfolge der Ausführung zu bestimmen. Verwenden Sie stattdessen eine allgemeine Setup-Methode für die Testfälle. – Henrik

+0

@JasonWatkins Wenn ich SetWindowsUsers und SetWifiInformation direkt aufrufen, funktionieren beide Attribute "DataSource" und DeploymentItems gut und ich bekomme Daten aus XML und Test bestanden. Ich bekomme meine TestContext.DataRow nicht als null. Diese beiden Attribute sind ziemlich Standard und verwendet für Data Driven Testfälle – rocky

Antwort

2

Die Verkettung sollte nur durchgeführt werden, wenn man nicht wiederherstellbare Daten haben muss. Ansonsten mache jeden Test zu einem eindeutigen Test.

Datengesteuert aus einer XML-Datei.

Betrachten Sie die read-only Xml in eine Eigenschaft setzen, die einmal vor thet Tests im ClassInitialization Methode ausgeführt wird. Testen Sie dann die einzelnen Operationen, gefolgt von der "Main" -Operation, jeweils als separate testbare Einheit.

public static XDocument Xml { get; set; } 

[DeploymentItem("input.xml")] 
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", 
      "input.xml", 
      "User", 
      DataAccessMethod.Sequential)] 
[ClassInitialize()] 
public static void ClassInit(TestContext context) 
{ // This is done only once and used by other tests. 
    Xml = ... 
    Assert.IsTrue(Xml.Node ...); 
} 

schauen Ansonsten in die Daten auf dem Test abhängig spöttisch durchgeführt wird oder wenn es aus einem bestimmten Anruf kommt, wie etwa ein shim? Siehe meinen Artikel Shim Saves The Day in A Tricky Unit Test Situation.

+0

Problem mit dieser Lösung, ich habe zwei Tabellen in meiner XML-Datei. und jede Methode A und B verwendet ihre eigene Tabelle. Meine Szenarien sind Methode A und B sind verschiedene Testfälle, aber die Hauptmethode benötigt A und B als Voraussetzung für die Ausführung weiterer Logik. Es benötigt Daten aus der Tabelle der XML-Datei. Wenn ich einen Weg finde, Daten von mehreren Tabellen zu laden, dann werde ich den Aufruf der verketteten Methode entfernen und die unabhängige Datenladung schreiben. – rocky

+0

@rocky Ich würde in die Erstellung eines einzigartigen Shim oder "verspotteten" Werte für jeden Komponententest suchen. Siehe meinen Artikel [Shim rettet den Tag in einer schwierigen Test-Situation] (http://blogs.msdn.com/b/mvpawardprogram/archive/2012/09/04/shim-saves-the-day-in-a- tricky-unit-test-situation.aspx) – OmegaMan

+0

Danke. Ich werde versuchen, mich zu schämen und zu verspotten. – rocky