如何使用多个数据源运行单元测试?

时间:2014-02-06 16:27:24

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

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

以下是测试类的示例:

  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的数据运行 单元测试,则eveything运行正常。

如果我在测试类中运行所有测试第二次单元测试运行将以错误结束。

有没有办法确保在每次单元测试之前重置DataSource?

我看过TestCleanup和TestInitialize,但没有发现任何事情......

2 个答案:

答案 0 :(得分: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与作为TestMethod属性提供的DataSource一起正常工作。

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

答案 1 :(得分:0)

使用TestInitialize/TestCleanUp遇到的问题是什么?

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

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

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