2015-05-18 22 views
5

Mam metodę testową, która wywołuje 2 metody testu dodatkowego. Obie metody podrzędne to dane kierowane z pliku XML. Jeśli uruchomię każdą z metod sub, działają dobrze i pomyślnie. Jednak po uruchomieniu głównej metody testowej (wywołującej obie metody podrzędne) odnajduje TestContext.DataConnection i TestContext.DataRow jako null.Test jednostek TestContext Wiele połączeń

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 
    } 

Jeśli uruchomię wszystkie, 2 metody zostaną zaliczone, a 1 zakończy się niepowodzeniem. Jeśli uruchamiam pojedynczo, SaveData_Json_LocalStorage nie przechodzi, zawsze pobiera wartość TestContext.DataRow jako null. Czy można wzywać wielu metod w środku? Jaki jest najlepszy sposób pisania przykutych przypadków testowych.

+0

Nigdy nie widziałem atrybutów 'DeploymentItem' i' DataSource', ale jestem prawie pewien, że są one źródłem problemu. Atrybuty w rzeczywistości nic nie robią same. Potrzebujesz szkieletu testów jednostkowych, aby coś z nimi zrobić. (Skonfiguruj swoje dane w tym przypadku.) Kiedy wywołasz 'SetWindowsUsers' i' SetWifiInformation' bezpośrednio, ta konfiguracja oparta na atrybutach nie jest wykonywana. –

+1

Generalnie powinieneś unikać testowania przypadków testowych. To od testującego może zależeć kolejność wykonania. Zamiast tego użyj ogólnej metody konfiguracji przypadków testowych. – Henrik

+0

@JasonWatkins Kiedy wywołuję SetWindowsUsers i SetWifiInformation bezpośrednio, Oba atrybuty "DataSource" i DeploymentItems działa dobrze i otrzymuję dane z XML i Test przekazać. Nie dostaję mojego TestContext.DataRow jako null. Te dwa atrybuty są dość standardowe i stosowane w przypadku testów sterowanych danymi. – rocky

Odpowiedz

2

Łańcuchowanie powinno być wykonywane tylko wtedy, gdy trzeba mieć dane, które nie mogą się odtworzyć. W przeciwnym razie wykonaj każdy test jako odrębny test.

Dane pochodzą z pliku XML.

rozważyć umieszczenie read-only XML do obiektu, który jest prowadzony raz przed Thet testów w sposobie ClassInitialization. Następnie przetestuj poszczególne operacje, a następnie operację "Main", każda jako osobna jednostka testowalna.

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

Inaczej spojrzeć na wyśmianie danych w zależności od wykonywanego testu czy pochodzi ona od konkretnej rozmowy, jak o shim? Zobacz mój artykuł Shim Saves The Day in A Tricky Unit Test Situation.

+0

Problem z tym rozwiązaniem, mam dwie tabele w moim pliku XML. a każda metoda A i B używa własnej tabeli. Moje scenariusze to Metody A i B są odrębnymi przypadkami testowymi, jednak główna metoda wymaga A i B jako warunku wstępnego do dalszej logiki. Potrzebuje danych zarówno z tabeli pliku XML. Jeśli znajdę sposób na załadowanie danych z wielu tabel, wówczas usuniemy wywołanie metody powiązanej i zapiszę niezależne ładowanie danych. – rocky

+0

@rocky Chciałbym zajrzeć do tworzenia unikalnych wartości shim lub 'szyderstwa' dla każdego testu jednostkowego. Zobacz mój artykuł [Shim Zapisuje dzień w trudnej sytuacji testu jednostkowego] (http://blogs.msdn.com/b/mvpawardprogram/archive/2012/09/04/shim-saves-the-day-in-a- tricky-unit-test-situation.aspx) – OmegaMan

+0

Dzięki. Spróbuję podszyć się i kpić. – rocky

Powiązane problemy