2012-10-24 2 views
7

Ich habe eine Frage für Sie 2 Unit-Tests haben guys.I, die ein Web Service .Der Wert, der eine Einheit-Test ist für eine andere Einheit TestmethodeHolding a Wert in Unit-Tests

Beispiel

verwendet werden soll, rufen
namespace TestProject1 
{ 
    public class UnitTest1 
    { 
     String TID = string.empty; 

     public void test1 
     { 
      //calling webservices and code 

      Assert.AreNotEqual(HoID, hID); 
      TID = hID; 
     } 

     public void test2 
     { 
      //calling webservices and code    
      string HID = TID // I need the TID value from the Above testcase here 

      Assert.AreNotEqual(HID, hID);    
     } 
    } 
} 

Wie kann ich einen Wert in einem Unittest speichern und diesen Wert in einem anderen Unittest verwenden.

+2

organisieren können, dass abhängen sollte technisch ein Integrationstest, Unit-Tests nicht auf äußere Einflüsse (in Ihrem Fall einen Web-Service) –

+0

Typischerweise Sie möchten nicht, dass ein Komponententest von einem anderen abhängt, da Sie nicht immer der Reihenfolge vertrauen können, in der die Tests ausgeführt werden, und es verhindert, dass Sie jeweils einen Test ausführen können. –

+0

@trevor pilley ja .. aber sogar in der Integration testen, wie können wir einen Wert von einem Unittest in einem anderen zurückgegeben ... – user1410658

Antwort

8

Im Allgemeinen sollten Sie Ihre Tests nicht so schreiben. Sie können nicht sicherstellen, dass Ihre Tests in einer bestimmten Reihenfolge ausgeführt werden. Es gibt also keine gute Möglichkeit, dies zu tun.

Stattdessen die Tests unabhängig machen, aber den gemeinsamen Teil in seine eigene (Nicht-Test-) Methode umgestalten, die Sie als Teil Ihres anderen Tests aufrufen können.

+2

Dies ist die beste Route. Noch besser ist es, eine Serviceschnittstelle einzufügen, die bekanntermaßen testbare Werte für Ihre Komponententests zurückgibt und dann den Service unabhängig testet. – n8wrl

+1

In Bezug auf einen Integrationstest wäre dies auch der Weg, den ich nehmen würde. Es bedeutet, dass, wenn die erste fehlschlägt, beide fehlschlagen, aber hey, du kannst nicht alle haben. Eine andere Möglichkeit besteht darin, ein bekanntes Token zu haben, von dem Sie sicher sind, dass es die richtige Reaktion von Ihrem Testsystem auslöst, und dieses beim zweiten Test verwendet. – flq

2

Keine Werte wiederverwenden. Die Reihenfolge, in der die Tests ausgeführt werden, ist sehr oft zufällig (die meisten Runner wie NUnit und Resharper führen Tests in zufälliger Reihenfolge durch, manche sogar parallel). Rufen Sie stattdessen den Webdienst erneut auf (auch wenn das bedeutet, dass Sie in Ihrem zweiten Test Webdienstaufrufe haben) und den Wert abrufen, den Sie benötigen.

Für jeden Test (ob Einheit oder Integration) sollten alle Daten/Abhängigkeiten verfügbar sein, damit er ausgeführt werden kann. Sie sollten sich niemals auf andere Tests verlassen, um Umgebung/Daten zu erstellen, da dies nicht das ist, wofür sie geschrieben wurden.

Denken Sie an Ihre Tests in Isolation - jeder einzelne Test ist ein separates Wesen, das eingerichtet, ausgeführt und bereinigt alles, was notwendig ist, um bestimmte Szenario auszuüben.

+0

Ich muss diese Idee versuchen ... – user1410658

2

Hier ist ein Beispiel, im Anschluss an die Umrisse von Oleksi, wie Sie dieses

String TID = string.empty; 

[TestFixtureSetUp] 
public void Given() { 
    //calling webservices and code 
    TID = hID; 
    //calling webservices and code 
} 

[Test] 
public void assertions_call_1() { 
    ... 
} 

public void assertions_on_call_2() { 
    if (string.IsNullOrEmpty(TID)) 
    Assert.Inconclusive("Prerequisites for test not met"); 
    ... 
} 
+0

Macht Sinn !!! aber was ist, wenn jeder Test andere Daten hat, um zu nennen !! Ich bin in dieser Situation. Test 1 Erstellen Sie einen Prozess, Test 2 löscht einen Prozess – user1410658

+1

@ user1410658: * create-delete * ist Ihr Integrationsprozess Szenario dann - das sollte ein Test sein. –