2013-06-03 11 views
6

Während meines UnitTest erstelle ich Daten, die in zukünftigen UnitTests referenziert werden müssen. Zum Beispiel:Wie übertrage ich Daten von einem UnitTest zu einem LoadTest?

[TestMethod] 
public void CreateOrder() 
{ 
    Order order = new Order(); 
    int orderNumber = order.Create(); 
    // return orderNumber; 
} 

[TestMethod] 
public void ProcessOrder() 
{ 
    int orderNumber = (int)TestContext.Properties["OrderNumber"]; 
    ProcessOrder(orderNumber); 
} 

Ich muss sparen off ‚ordernumber‘ so, dass eine andere Unittest (möglicherweise auf einem anderen Agenten) kann dieser Reihenfolge erzeugt verwenden. Ich habe entschieden, dass ich eine Datenbank verwenden kann, aber dann muss ich sie wie eine Warteschlange beim Entfernen von Objekten betreiben und möchte diesen Weg nicht gehen.

Gibt es eine Möglichkeit, die orderNumber zurück zum LoadTest zu geben und diese als Context-Parameter in einem Aufruf an einen anderen UnitTest zu übergeben?

+0

Können Sie erklären, warum Sie genau die Instanz benötigen, die durch den anderen Test erstellt wurde? Warum reicht es nicht aus, die Instanz in einer Setup-Methode zu erstellen und von beiden Tests zu verwenden? – unholysampler

+0

Sie haben eine Methode, die Bestellungen erstellt. Diese Methode arbeitet schneller als die Verarbeitung. Sie müssen beweisen, dass Sie 40000 Bestellungen in 1 Stunde erstellen und gleichzeitig diese Bestellung bearbeiten können (Sie müssen nicht alle 40K Bestellungen bearbeiten, nur beweisen, dass während der Verarbeitung 40K Bestellungen erstellt werden können). Sie können nicht einfach alle 40K-Dateien erstellen, da es Probleme mit der Nebenläufigkeit gibt, die durch gleichzeitiges Erstellen und Verarbeiten auftreten können. Sie können nicht ein Create/Process/Create/Process-Muster erstellen, da Sie nicht alle 40K-Aufträge erhalten. Die Reihenfolge muss existieren, um zu verarbeiten. – esac

+0

Ich habe keine Arbeit mit Lasttests gemacht, daher kann ich keine direkte Hilfe geben. Aber wenn die Idee ist, dass diese beiden Methoden regelmäßig aufgerufen werden, um "load" zu erstellen, dann ist es vielleicht so einfach, eine Member-Variable "Queue" in der Klasse zu haben, in der diese Methoden definiert sind. Auf diese Weise 'CreateOrder() 'kann zur Warteschlange hinzufügen und' ProcessOrder() 'kann daraus ziehen. Versuchen Sie andernfalls, [this] zu lesen (http://msdn.microsoft.com).com/de-us/library/ms182561% 28v = vs.80% 29.aspx) für Details zu Auslastungstests in Visual Studio. – unholysampler

Antwort

4

Sie können es über eine LoadTest Plugin und unter Verwendung der UserContext tun. Jeder virtuelle Benutzer hat seine eigene UserContext und Sie können damit Daten von TestContext übergeben/abrufen.

  1. Create a load test plugin
  2. Event-Handler auf den TestStarting & TestFinished Ereignisse hinzufügen. Das TestStarting Ereignis wird ausgelöst, bevor die TestInitialize Methode und die TestFinished nach den TestCleanup:

    public void TestStarting(object sender, TestStartingEventArgs e) 
    { 
        // Pass the UserContext into the TestContext before the test started with all its data retrieved so far data. 
        // At the first test it will just be empty 
        e.TestContextProperties.Add("UserContext", e.UserContext); 
    } 
    
    public void TestFinished(object sender, TestFinishedEventArgs e) 
    { 
        // do something with the data retrieved form the test 
    } 
    
  3. die TestInitialize & TestCleanup verwenden, um Daten zu bekommen/hinzufügen von/bis UserContext:

    [TestInitialize] 
    public void TestInitialize() 
    { 
        // Get the order number which was added by the TestCleanup method of the previous test 
        int orderNumber = (int) UserContext["orderNumber"]; 
    } 
    
    [TestCleanup] 
    public void TestCleanup() 
    { 
        // When the CreateOrder test is completed, add the order number to the UserContext 
        // so the next will have access to it 
        UserContext.Add("orderNumber", orderNumber); 
    } 
    
  4. Zugang zu zu dem UserContext auf dem Test fügen Sie die folgende Eigenschaft auf jedem UnitTest hinzu:

    public LoadTestUserContext UserContext 
    { 
        get 
        { 
         return TestContext.Properties["$LoadTestUserContext"] as LoadTestUserContext; 
        } 
    } 
    
  5. In der Testkonfiguration laden Sie Test Mix Model = Based on sequential order, damit Ihre Tests in der Reihenfolge ausgeführt werden, in der Sie sie auf Test Mix hinzufügen.

Hinweis: Damit dies funktioniert, müssen Sie jede TestMethod auf einer einzelnen Unittest-Datei. Wenn Sie sie in derselben Datei haben, werden die Methoden TestInialize und TestCleanup auf jedem enthaltenen TestMethod ausgeführt, und möglicherweise versuchen Sie, auf Daten zuzugreifen, die Sie nicht haben (z. B. versuchen, die Bestellnummer auf CreateOrder zu erhalten).

+1

Ausgezeichnet, danke! – esac

+0

Sie sind willkommen. – Schaliasos

+1

Hallo, ich arbeite Schritt für Schritt mit Ihrer Antwort und es ist in Ordnung, aber auf Schritt 4 habe ich nicht Erfolg, "TestContext.Properties" -Parameter abrufen, weil es abstrakt und keine statischen Parameter, können Sie helfen? – Hadash

Verwandte Themen