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数据源无法连接的修复
- 修正数据源路径:当前
DataSource特性中指定的路径是C#代码文件IsEarlier.cs,而非XML测试数据文件。需替换为实际的XML文件路径,例如@"|DataDirectory|\IsEarlierTests.xml"。 - 配置XML文件输出属性:右键XML文件→属性→将“复制到输出目录”设置为“如果较新则复制”或“始终复制”,确保测试运行时能读取到文件。
- 匹配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,提问作者מעין אפשטיין
相关产品推荐
相关产品推荐

