Как запустить модульный тест с несколькими источниками данных?

Я не могу найти способ запустить различные модульные тесты в пределах одного и того же тестового класса, которые используют разные источники данных.

Вот пример тестового класса:

  namespace Calc.Tests
  {
     [TestClass]
     public class CalcTests
     {
        private static TestContext Context { get; set; }

        [ClassInitialize]
        public static void ClassInitialize(TestContext context)
        {
           Context = context;
        }

        [TestMethod]
        [DeploymentItem("AddedValues.csv")]
        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", @"|DataDirectory|\AddedValues.csv", "AddedValues#csv", DataAccessMethod.Sequential)]
        public void Add_UsingValuesWithinCsv()
        {
           Calc calc = new Calc();

           // Arrange
           int firstValue = Convert.ToInt32(Context.DataRow["firstValue"]);
           int secondValue = Convert.ToInt32(Context.DataRow["secondValue"]);
           int expectedResult = Convert.ToInt32(Context.DataRow["expectedResult"]);

           // Act
           int result = calc.Add(firstValue, secondValue);

           // Assert
           Assert.AreEqual<int>(result, expectedResult);
        }

        [TestMethod]
        [DeploymentItem("AddedValues.xml")]
        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", @"|DataDirectory|\AddedValues.xml", "TestCase", DataAccessMethod.Sequential)]
        public void Add_UsingValuesWithinXml()
        {
           Calc calc = new Calc();

           // Arrange
           int firstValue = Convert.ToInt32(Context.DataRow["firstValue"]);
           int secondValue = Convert.ToInt32(Context.DataRow["secondValue"]);
           int expectedResult = Convert.ToInt32(Context.DataRow["expectedResult"]);

           // Act
           int result = calc.Add(firstValue, secondValue);

           // Assert
           Assert.AreEqual<int>(result, expectedResult);
        }
     }
  }

Если я запускаю только модульный тест, используя данные из XML, все работает нормально.

Если я запускаю только модульный тест, используя данные из csv, все работает нормально.

Если я запускаю все тесты в тестовом классе, выполнение второго модульного теста завершается с ошибкой.

Есть ли способ убедиться, что DataSource сбрасывается перед каждым модульным тестом?

Я просмотрел TestCleanup и TestInitialize, но ничего не нашел...


person Doum    schedule 06.02.2014    source источник


Ответы (2)


Я понял!

Я неправильно понял использование TestContext, которое мне пришлось инициализировать в моем методе ClassInitialize.

Поскольку мой ClassInitialized был статическим, мне также нужно было установить мой TestContext как статический, а TestContext был инициализирован только один раз в ClassInitialize.

Согласно документации MSDN, мое свойство TestContext должно быть свойством экземпляра, и MSTest автоматически предоставит мне TestContext. http://msdn.microsoft.com/en-us/library/ms404699(v=vs.80).aspx

Благодаря этому мой TestContext.DataRow отлично работает с DataSource, предоставленным в качестве атрибута TestMethod.

Надеюсь, это может помочь кому-то, когда-нибудь!

person Doum    schedule 07.02.2014

С какой проблемой вы столкнулись при использовании TestInitialize/TestCleanUp?

Я бы попробовал использовать один из двух приведенных ниже методов для инициализации или очистки.

[TestInitialize()]
public void RunsBeforeEveryTest() { }

[TestCleanup()]
public void RunsAfterEveryTest() { }
person TGH    schedule 07.02.2014
comment
У меня не было проблем с использованием TestInitialize из TestCleanup, я использую их регулярно. Сначала мне нужно было сбросить использование каждого источника данных в очистке, потому что контекст источника данных не изменился бы для каждого модульного теста в соответствии с их атрибутом [DataSource]. Я объяснил в своем посте, в чем была моя проблема. По возможности отмечу как отвеченный (пока не могу) - person Doum; 07.02.2014