【问题标题】:How to run unit test with multiple datasource?如何使用多个数据源运行单元测试?
【发布时间】:2014-02-06 16:27:23
【问题描述】:

我找不到在使用不同数据源相同测试类中运行不同单元测试的方法。

这是一个测试类的例子:

  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,但没有找到任何可以这样做的...

【问题讨论】:

    标签: c# unit-testing datasource mstest data-driven-tests


    【解决方案1】:

    我明白了!

    我误解了 TestContext 的使用,尽管我必须在 ClassInitialize 方法中进行初始化。

    因为我的 ClassInitialized 是静态的,所以我也需要将我的 TestContext 设置为静态,并且 TestContext 只在 ClassInitialize 处初始化一次。

    根据 MSDN 文档,我的 TestContext 属性需要是实例属性,MSTest 会自动为我提供 TestContext。 http://msdn.microsoft.com/en-us/library/ms404699(v=vs.80).aspx

    这样做,使我的 TestContext.DataRow 与作为 TestMethod 属性提供的 DataSource 一起正常工作。

    希望有一天这对某人有所帮助!

    【讨论】:

      【解决方案2】:

      您在使用TestInitialize/TestCleanUp时遇到了什么问题?

      我会尝试使用以下两种方法之一进行初始化或清理。

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

      【讨论】:

      • 我使用TestCleanup的TestInitialize没有问题,我经常使用它们。我首先需要在 Cleanup 中重置每个 DataSource 的使用,因为 DataSource 上下文不会根据每个单元测试的 [DataSource] 属性而改变。我已经在我的帖子中解释了我的问题。尽可能将其标记为已回答(暂时不能)
      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 2011-12-18
      相关资源
      最近更新 更多