You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio XML序列化测试:DisplayName使用及XML连接失效求助

XML驱动单元测试问题排查与优化

问题描述

  • 原本正常连接的XML数据源突然无法连接;
  • 希望在XML驱动的测试中,像DataRow特性那样用DisplayName标识测试用例。

生成的C#实体类代码

using System;
using System.Xml.Serialization;
using System.Collections.Generic;

namespace ClockD
{
    [XmlRoot(ElementName = "IsEarlier")]
    public class IsEarlier
    {
        [XmlElement(ElementName = "hour1")]
        public string Hour1 { get; set; }
        [XmlElement(ElementName = "min1")]
        public string Min1 { get; set; }
        [XmlElement(ElementName = "hour2")]
        public string Hour2 { get; set; }
        [XmlElement(ElementName = "min2")]
        public string Min2 { get; set; }
        [XmlElement(ElementName = "res")]
        public string Res { get; set; }
        [XmlAttribute(AttributeName = "Name")]
        public string Name { get; set; }
        [XmlAttribute(AttributeName = "DisplayName")]
        public string DisplayName { get; set; }
    }

    [XmlRoot(ElementName = "tar")]
    public class Tar
    {
        [XmlElement(ElementName = "IsEarlier")]
        public List<IsEarlier> IsEarlier { get; set; }
    }
}

测试代码

using ClockD;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace ClockDUnitTest
{
    [TestClass]
    public class IsEarlierTest
    {
        private TestContext context;
        public TestContext TestContext
        {
            get { return context; }
            set { context = value; }
        }


        [TestMethod]
        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
            @"|DataDirectory|\ClockD\IsEarlier.cs",
            "IsEarlier",
            DataAccessMethod.Sequential)]
        public void IsEarlierByXML()
        {
            int h1 = Convert.ToInt32(TestContext.DataRow["hour1"].ToString());
            int m1 = Convert.ToInt32(TestContext.DataRow["min1"].ToString());
            ClockD.Clock c1 = new ClockD.Clock(h1, m1);

            int h2 = Convert.ToInt32(TestContext.DataRow["hour2"].ToString());
            int m2 = Convert.ToInt32(TestContext.DataRow["min2"].ToString());
            ClockD.Clock c2 = new ClockD.Clock(h2, m2);


            bool expected = Convert.ToBoolean(TestContext.DataRow["res"].ToString());
            bool actual;

            actual = c1.IsEarlier(c2);

            Assert.IsTrue(expected == actual);
        }
    }
}

问题1:XML数据源无法连接的修复

  1. 修正数据源路径:当前DataSource特性中指定的路径是C#代码文件IsEarlier.cs,而非XML测试数据文件。需替换为实际的XML文件路径,例如@"|DataDirectory|\IsEarlierTests.xml"。
  2. 配置XML文件输出属性:右键XML文件→属性→将“复制到输出目录”设置为“如果较新则复制”或“始终复制”,确保测试运行时能读取到文件。
  3. 匹配XML结构与数据源配置:若XML根节点是<tar>,则DataSource的第三个参数需改为"tar/IsEarlier",对应XML结构示例:
    <tar>
      <IsEarlier Name="Case1" DisplayName="早1小时测试">
        <hour1>9</hour1>
        <min1>0</min1>
        <hour2>10</hour2>
        <min2>0</min2>
        <res>True</res>
      </IsEarlier>
    </tar>
    

问题2:启用DisplayName标识测试用例

MS Unit Test不支持直接给XML驱动的测试用例配置DisplayName,但可通过TestContext动态修改测试名称:

在测试方法开头添加以下代码:

// 从XML属性中读取DisplayName并修改测试名称
string displayName = TestContext.DataRow["DisplayName"]?.ToString();
if (!string.IsNullOrEmpty(displayName))
{
    TestContext.TestName = displayName;
}

注:XML中DisplayName是节点属性时,XML数据源会自动将其作为列名,可直接通过TestContext.DataRow["DisplayName"]获取。


内容的提问来源于stack exchange,提问作者מעין אפשטיין

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:52:47