2015-05-18 12 views
5

Ho un metodo di prova che chiama 2 metodi di test secondario. Entrambi i metodi secondari sono basati su dati da un file XML. Se eseguo ciascun sottoprogramma, funzionano correttamente e con successo. Tuttavia, quando eseguo il Metodo di prova principale (chiamante di entrambi i metodi secondari) trova TestContext.DataConnection e TestContext.DataRow come null.Test unità TestContext Chiamate multiple

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 
    } 

Se corro tutto, passano 2 metodi e 1 non riesce. Se corro individualmente, SaveData_Json_LocalStorage non passa, ottiene sempre TestContext.DataRow come null. Va bene chiamare più metodi all'interno. Qual è il modo migliore per scrivere casi di test concatenati.

+0

Non ho mai visto gli attributi 'DeploymentItem' e' DataSource', ma sono abbastanza sicuro che siano la fonte del problema. Gli attributi in realtà non fanno nulla da soli. Hai bisogno del quadro di test unitario per fare qualcosa con loro. (Configura i tuoi dati in questo caso.) Quando chiami "SetWindowsUsers" e "SetWifiInformation' direttamente, questa impostazione basata sugli attributi non viene eseguita. –

+1

In generale si dovrebbe evitare di concatenare i casi di test. Spetta al Test Runner decidere l'ordine di esecuzione. Utilizzare invece un metodo di configurazione generale per i casi di test. – Henrik

+0

@JasonWatkins Quando chiamo SetWindowsUsers e SetWifiInformation direttamente, entrambi gli attributi "DataSource" e DeploymentItems funzionano correttamente e ottengo Dati da XML e Test pass. Non ottengo il mio TestContext.DataRow come null. Questi due attributi sono piuttosto standard e usati per i casi Test Data Driven – rocky

risposta

2

Il concatenamento deve essere eseguito solo se è necessario disporre di dati non riconducibili. In caso contrario, rendere ogni test un test distinto.

Dati generati da un file XML.

provare a inserire il sola lettura Xml in una proprietà che viene eseguito una volta prima thet test nel metodo ClassInitialization. Quindi testare le singole operazioni, seguite dall'operazione "Principale", ciascuna come unità testabile separata.

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

altrimenti cercate nel beffardo i dati a seconda del test in corso di esecuzione o se proviene da una specifica chiamata, come circa un shim? Vedi il mio articolo Shim Saves The Day in A Tricky Unit Test Situation.

+0

problema con questa soluzione, ho due tabelle all'interno del mio file XML. e ogni metodo A e B usa la propria tabella. I miei scenari sono il metodo A e B sono casi di test distinti, tuttavia il metodo principale ha bisogno di A e B come prerequisito per l'esecuzione di ulteriore logica. Ha bisogno di dati sia dalla tabella del file XML. Se trovo un modo per caricare dati da più tabelle, rimuoverò il metodo call to chained e scriverò il carico di dati indipendente. – rocky

+0

@rocky Vorrei esaminare la creazione di uno spessore univoco o valori 'mocked' per ogni unit test. Vedi il mio articolo [Shim salva il giorno in una situazione di prova unitaria ingannevole] (http://blogs.msdn.com/b/mvpawardprogram/archive/2012/09/04/shim-saves-the-day-in-a- tricky-unit-test-situation.aspx) – OmegaMan

+0

Grazie. Proverò a shim e beffardo. – rocky