2012-10-24 12 views
7

Mam pytanie do guys.I masz 2 testy jednostkowe, które są wzywające sieciowe .Powierzchnia wartość, że jedna jednostka powraca-test należy stosować inną metodę testów jednostkowychHolding Wartość jednostkowych testuje

Przykład

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);    
     } 
    } 
} 

Jak mogę zapisać wartość w jednym unittest i użyć tej wartości w innym unittest.

+2

to technicznie testy integracyjne, testy jednostkowe nie powinna zależeć od czynników zewnętrznych (w przypadku usługi internetowej) –

+0

Typowo nie chcesz, aby test jednej jednostki był zależny od innego, ponieważ nie zawsze możesz zaufać zamówieniu, w którym testy są uruchamiane, i uniemożliwia ci uruchomienie jednego testu na raz. –

+0

@trevor pilley yes .. ale nawet w testach integracyjnych, jak możemy użyć wartości zwróconej przez jeden unittest w innym ... – user1410658

Odpowiedz

8

Ogólnie nie powinieneś pisać swoich testów w ten sposób. Nie można zagwarantować, że testy będą wykonywane w dowolnej kolejności, więc nie ma na to dobrego sposobu.

Zamiast tego spraw, aby testy były niezależne, ale zmodyfikuj część wspólną w swojej własnej (beztestowej) metodzie, którą możesz wywołać w ramach innego testu.

+2

To najlepsza trasa. Jeszcze lepiej wstrzyknąć interfejs serwisowy, który zwróci wartości testowalne dla testów jednostkowych, a następnie przetestować usługę samodzielnie. – n8wrl

+1

Jeśli chodzi o test integracji, to jest to również droga, którą wziąłem. Oznacza to, że gdy pierwszy się nie powiedzie, oba się nie powiodą, ale hej, nie możesz mieć wszystkiego. Inną możliwością jest posiadanie znanego tokena, z którego jesteś pewny, że wywołuje on prawidłową reakcję z twojego systemu testowego i używasz go podczas drugiego testu. – flq

2

Nie używaj ponownie żadnych wartości. Kolejność, w której uruchamiane są testy, jest bardzo często losowa (najczęściej biegacze, takie jak testy NUnit i Resharper w losowej kolejności, niektórzy mogą to robić równolegle). Zamiast tego po prostu wywołaj ponownie usługę sieciową (nawet jeśli oznacza to wykonanie połączeń usługi internetowej) w drugim teście i pobierz potrzebną wartość.

Każdy test (niezależnie od tego, czy jest to jednostka czy integracja), powinien mieć wszystkie dane/zależności dostępne do uruchomienia. Nigdy nie powinieneś polegać na innych testach, aby skonfigurować środowisko/dane, ponieważ nie jest to to, na co są napisane.

Pomyśl o swoich testach w izolacja - każdy pojedynczy test jest osobną istotą, która konfiguruje, wykonuje i czyści wszystko, co jest niezbędne do wykonania określonego scenariusza.

+0

Muszę spróbować tego pomysłu ... – user1410658

2

Oto przykład, po kontury Oleksi, w jaki sposób można zorganizować ten

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

To ma sens, ale co, jeśli każdy test ma inne dane do połączenia !! Jestem w takiej sytuacji. Test 1 Utwórz proces, test 2 usuwa proces – user1410658

+1

@ user1410658: * create-delete * to twój scenariusz procesu integracji - to powinien być jeden test. –

Powiązane problemy