2013-06-03 21 views
6

Podczas testu UnitTest tworzę dane, które należy uwzględnić w przyszłych testach jednostkowych. Na przykład:Jak przekazać dane z UnitTest do testu 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); 
} 

muszę zapisać się „numer zamówienia”, tak by inny unittest (ewentualnie na innym środkiem) może skorzystać z tej generowane zamówienia. Zdecydowałem, że mogę korzystać z bazy danych, ale potem muszę operować nią jak kolejką w usuwaniu przedmiotów i wolałbym nie iść tą drogą.

Czy istnieje sposób "Zwrócić" OrderNumber z powrotem do LoadTest i przekazać go jako parametr kontekstowy w wywołaniu do innego UnitTest?

+0

Czy możesz wyjaśnić, dlaczego potrzebujesz dokładnej instancji stworzonej przez inny test? Dlaczego nie wystarczy utworzyć instancję w metodzie instalacji i używać jej w obu testach? – unholysampler

+0

Masz jedną metodę, która tworzy zamówienia. Ta metoda działa szybciej niż przetwarzanie. Musisz udowodnić, że możesz utworzyć 40000 zamówień w ciągu 1 godziny, a jednocześnie przetworzyć te zamówienia (nie musisz przetwarzać wszystkich zamówień 40K, po prostu udowodnij, że podczas przetwarzania możesz tworzyć zamówienia 40K). Nie można po prostu utworzyć wszystkich 40K na początek, ponieważ są problemy z współbieżnością, które mogą pojawić się podczas tworzenia i przetwarzania w tym samym czasie. Nie możesz utworzyć wzorca Utwórz/Przetwarzaj/Utwórz/Przetwarzaj, ponieważ nie uzyskasz wszystkich 40 000 zamówień. Porządek istnieje do przetworzenia. – esac

+0

Nie wykonałem żadnej pracy z testami obciążenia, więc nie mogę udzielić bezpośredniej pomocy. Jeśli jednak chodzi o to, że obie te metody są regularnie nazywane sposobem "tworzenia obciążenia", to może być tak proste, jak gdybyśmy mieli zmienną składową 'Kolejka' w klasie, w której te metody są zdefiniowane. W ten sposób,' CreateOrder() 'może dodać do kolejki i' ProcessOrder() 'może pobrać z niego. W przeciwnym razie spróbuj przeczytać [this] (http://msdn.microsoft.com/en-us/library/ms182561% 28v = vs.80% 29.aspx) w celu uzyskania szczegółowych informacji o testach ładujących w Visual Studio. – unholysampler

Odpowiedz

4

Możesz to zrobić poprzez LoadTest Plugin i używając UserContext. Każdy wirtualny użytkownik ma swoją własną UserContext i można go używać do przekazywania/pobierania danych z TestContext.

  1. Create a load test plugin
  2. Dodaj obsługi zdarzeń na TestStarting & TestFinished wydarzeń. Impreza TestStarting zadziała zanim metody TestInitialize a po TestFinishedTestCleanup:

    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. Użyj TestInitialize & TestCleanup dostać/dodawanie danych z/do 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. Aby uzyskać dostęp do testu UserContext w teście dodaj następującą właściwość dla każdego testu UnitTest:

    public LoadTestUserContext UserContext 
    { 
        get 
        { 
         return TestContext.Properties["$LoadTestUserContext"] as LoadTestUserContext; 
        } 
    } 
    
  5. W teście konfiguracyjnym testu obciążenia zestaw Test Mix Model = Based on sequential order, aby Twoje testy zostały wykonane w kolejności ich dodawania w urządzeniu Test Mix.

Uwaga: Aby to działało, trzeba dodać każdy TestMethod na pojedynczym pliku unittest. Jeśli masz je w tym samym pliku, metody TestInialize i TestCleanup zostaną wykonane na każdym z zawartych w nim TestMethod i prawdopodobnie spróbujesz uzyskać dostęp do danych, których nie masz (na przykład próbujesz uzyskać OrderNumer na CreateOrder).

+1

Doskonale, dzięki! – esac

+0

Nie ma za co. – Schaliasos

+1

Witam, pracuję krok po kroku z twoją odpowiedzią i jest ok, ale w kroku 4 nie udało mi się pobrać parametru "TestContext.Properties", ponieważ jest abstrakcyjny i nie ma parametru statycznego, możesz pomóc? – Hadash