ClassInitialize上的数据驱动单元测试

时间:2013-06-06 23:20:01

标签: c# testing mstest

我每次尝试使用不同的值运行一些测试。例如:我有3种方法:methodAmethodBmethodC。我想用不同的索引位置运行每个方法两次。我有TestInitializeClassInitialize方法。

  1. 我尝试使用ClassInitialize,但我没有成功;我收到编译时错误,因为我的测试上下文不是静态的。

    public TestContext TestContext
    {
       get { return testContextInstance; }
       set { testContextInstance = value; }
    }
    
    [DeploymentItem("UI.Framework.IntegrationTests\\ExpectedValues.xml")]
    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\ExpectedValues.xml", "searchTerm2", DataAccessMethod.Sequential)]
    [ClassInitialize()]
    publicstaticvoid ClassInitialize(TestContext context)
    {        
       string indexPath = TestContext.DataRow[0].ToString();
       bool isSuccess1 = SearchApiTestsHelper.InitializeSearchEngine(indexPath, null);
       Assert.IsTrue(isSuccess1);
    }
    

    我不能这样做。

  2. 我尝试使用TestInitialize,但未加载数据行,它是null

    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
                "|DataDirectory|\\ExpectedValues.xml", 
                "indices", 
                DataAccessMethod.Sequential),
    TestInitialize()]
    public void MyTestInitialize()
    {
        string indexPath = TestContext.DataRow[0].ToString();
        bool isSuccess1 = SearchApiTestsHelper.InitializeSearchEngine(indexPath, null);
        Assert.IsTrue(isSuccess1);
    }
    
  3. 我知道我可以将每个方法设置为运行两次,但是,某些方法需要不同的数据进行验证。例如method2仍需要为每个索引位置运行两次,并且每次运行都会从数据源中声明一组预期值。

    [DeploymentItem("UI.Framework.IntegrationTests\\ExpectedValues.xml")]
    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
                "|DataDirectory|\\ExpectedValues.xml", 
                "pb1", DataAccessMethod.Sequential),
     TestCategory("Integration")]
    [TestMethod]
    public void PhraseBoosting()
    {
        expectedVal = TestContext.DataRow[0].ToString();
    }
    

    如何归档?

2 个答案:

答案 0 :(得分:3)

假设这样的XML文件:

<Values>
  <searchTerm2>this is search term 2</searchTerm2>
  <indices>these are the indices</indices>
  <pb1>personal best?</pb1>
</Values>

您可以像这样访问值:

[TestClass]
    public class UnitTest1
    {
        public TestContext TestContext
        {
            get;
            set;
        }

        //[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\ExpectedValues.xml", "Values", DataAccessMethod.Sequential)]
        //[ClassInitialize]
        //public static void ClassInitialize(TestContext testContext)
        //{
        //    string indexPath = testContext.DataRow["searchTerm2"].ToString();
        //    Console.WriteLine(indexPath);
        //}

        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\ExpectedValues.xml", "Values", DataAccessMethod.Sequential)]
        [TestInitialize]
        public void TestInitialize()
        {
            string indexPath = TestContext.DataRow["indices"].ToString();
            Console.WriteLine(indexPath);
        }

        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\ExpectedValues.xml", "Values", DataAccessMethod.Sequential)]        
        [TestMethod]
        public void TestMethod1()
        {
            string indexPath = TestContext.DataRow["pb1"].ToString();
            Console.WriteLine(indexPath);
        }
    }

类初始化方法似乎不起作用。我不确定这是否符合设计要求。

答案 1 :(得分:1)

VS单元测试框架不支持类初始化级别的数据驱动测试。唯一的选择是在TestMethod级别使用它。我希望他们将此添加到下一个版本。