2015-05-18 4 views
5

У меня есть метод тестирования, который вызывает 2 метода субтеста. Оба вспомогательных метода - Data Driven из файла XML. Если я запускаю каждый вспомогательный метод, они работают нормально и успешно. Однако, когда я запускаю главный метод тестирования (вызывающий оба вспомогательных метода), он находит TestContext.DataConnection и TestContext.DataRow равным нулю.Ед. Тест TestContext Несколько вызовов

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 
    } 

Если я запустил все, 2 метода передаются и 1 не удается. Если я запускаю индивидуально, SaveData_Json_LocalStorage не проходит, всегда получает TestContext.DataRow как null. Можно ли вызвать несколько методов внутри. Каков наилучший способ написания прикованных тестовых случаев.

+0

Я никогда не видел атрибуты 'DeploymentItem' и' DataSource', но я уверен, что они являются источником вашей проблемы. Атрибуты на самом деле ничего не делают сами по себе. Для этого вам нужна единая тестовая среда, чтобы что-то сделать с ними. (Настройте свои данные в этом случае.) Когда вы вызываете 'SetWindowsUsers' и' SetWifiInformation' напрямую, эта настройка на основе атрибутов не выполняется. –

+1

В целом вам следует избегать цепочки тестовых случаев. Определить порядок исполнения можно только с помощью Test Runner. Вместо этого используйте общий метод настройки для тестовых случаев. – Henrik

+0

@JasonWatkins Когда я вызываю SetWindowsUsers и SetWifiInformation напрямую, оба атрибута «DataSource» и DeploymentItems отлично работают, и я получаю Data from XML и Test pass. Я не получил свой TestContext.DataRow как null. Эти два атрибута довольно стандартизированы и используются для тестовых примеров Data Driven. – rocky

ответ

2

Цепочка должна выполняться только в том случае, если у вас должны быть данные, невоспроизводимые. В противном случае сделайте каждый тест отдельным испытанием.

Данные, полученные из файла XML.

Рассмотрим размещение только для чтения Xml в собственность, которая запускается раз перед тем Термическое испытаний в методе ClassInitialization. Затем проверьте отдельные операции, а затем операцию «Главная», каждая в качестве отдельного проверяемого блока.

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

В противном случае смотреть на насмешливые данные в зависимости от теста, выполняемого или если она исходит от конкретного вызова, как насчет shim? См. Мою статью Shim Saves The Day in A Tricky Unit Test Situation.

+0

проблема с этим решением, у меня есть две таблицы внутри моего XML-файла. и каждый метод A и B использует свою собственную таблицу. Мои сценарии - это методы A и B, которые являются отдельными тестовыми примерами, однако основной метод требует A и B в качестве предпосылки для запуска дальнейшей логики. Ему нужны данные из таблицы XML-файла. Если я найду способ загрузить данные из нескольких таблиц, я удалю метод вызова с цепочкой и напишу независимую нагрузку на данные. – rocky

+0

@rocky Я бы посмотрел на создание уникальной прокладки или 'mocked' для каждого модульного теста. См. Мою статью [Shim спасает день в сложной ситуации с тестовым блоком] (http://blogs.msdn.com/b/mvpawardprogram/archive/2012/09/04/shim-saves-the-day-in-a- tricky-unit-test-situation.aspx) – OmegaMan

+0

Спасибо. Я попробую прокладку и насмешку. – rocky

Смежные вопросы