Unit testing 为MSTest从XML文件加载随机数目的输入数据点

Unit testing 为MSTest从XML文件加载随机数目的输入数据点,unit-testing,visual-studio-2015,mstest,data-driven-tests,Unit Testing,Visual Studio 2015,Mstest,Data Driven Tests,我正在尝试创建一个数据驱动的测试,在每次调用时使用不同的输入多次调用一个方法。在这种特殊情况下,测试将验证一个类是否保持总时间的运行总和 下面是正在测试的代码: public Enum IoState{On, Off} public class PwmDataPoint { public IoState LineState { get; private set; } public double SecondsAtState { get; private set; } public

我正在尝试创建一个数据驱动的测试,在每次调用时使用不同的输入多次调用一个方法。在这种特殊情况下,测试将验证一个类是否保持总时间的运行总和

下面是正在测试的代码:

public Enum IoState{On, Off}

public class PwmDataPoint
{
  public IoState LineState { get; private set; }
  public double SecondsAtState { get; private set; }

  public PwmDataPoint(IoState lineState, double secondsAtState)
  {
    this.LineState = lineState;
    this.SecondsAtState = secondsAtState;
  }
}

public class PwmData
{
  public double TotalSeconds {get; private set;} = 0;

  public void AddNewDataPoint(PwmDataPoint addMe)
  {
    this.TotalSeconds+= addMe.SecondsAtState;
    //Other data processing code that other tests will cover...
  }
}
我试图创建的测试将验证调用
PwmData.AddNewDataPoint
PwmData.TotalSeconds
是否正确更新

显然,
PwmData.AddNewDataPoint
可以在
PwmData
对象的生命周期内调用任意次数

我试图在MSTest中编写一个数据驱动测试,但我不知道如何从XML测试数据文件中加载随机数目的数据点

下面是XML文件中的一个片段:

<?xml version="1.0" encoding="utf-8" ?>
<TestData>
  <TestDatum>
    <PwmDataPoint>
      <IoState>On</IoState>
      <SecondsAtState>0.25</SecondsAtState>
    </PwmDataPoint>
    <TotalTime>0.25</TotalTime>
  </TestDatum>
  <TestDatum>
    <PwmDataPoint>
      <IoState>On</IoState>
      <SecondsAtState>0.25</SecondsAtState>
    </PwmDataPoint>
    <PwmDataPoint>
      <IoState>On</IoState>
      <SecondsAtState>0.25</SecondsAtState>
    </PwmDataPoint>
    <PwmDataPoint>
      <IoState>Off</IoState>
      <SecondsAtState>0.25</SecondsAtState>
    </PwmDataPoint>
    <PwmDataPoint>
      <IoState>On</IoState>
      <SecondsAtState>0.25</SecondsAtState>
    </PwmDataPoint>
    <PwmDataPoint>
      <IoState>Off</IoState>
      <SecondsAtState>0.25</SecondsAtState>
    </PwmDataPoint>
    <TotalTime>1.25</TotalTime>
  </TestDatum>
</TestData>

在…上
0.25
0.25
在…上
0.25
在…上
0.25
关
0.25
在…上
0.25
关
0.25
1.25
每个
TestDatum
都是运行测试所需的数据。在这种情况下,有2个测试要运行:第一个测试有1个
PwmDataPoint
要使用,其中第二个测试将使用5个
PwmDataPoint
s

我对数据驱动的MSTests相当陌生,我能找到的所有示例都有恒定数量的输入数据点


如何在MSTest中从XML文件动态加载N个输入数据点?

解决了这个问题。我首先将XML文件更改为:

<?xml version="1.0" encoding="utf-8" ?>
<TestData>
  <TestDatum>
    <PwmDataPoint IoState ="On" SecondsAtState="0.25"/>
    <TotalTime Time ="0.25"/>
  </TestDatum>
  <TestDatum>
    <PwmDataPoint IoState ="On" SecondsAtState="0.25"/>
    <PwmDataPoint IoState ="Off" SecondsAtState="0.25"/>
    <PwmDataPoint IoState ="On" SecondsAtState="0.25"/>
    <PwmDataPoint IoState ="Off" SecondsAtState="0.25"/>
    <PwmDataPoint IoState ="On" SecondsAtState="0.25"/>
    <TotalTime Time ="1.25"/>
  </TestDatum>
</TestData>
[TestMethod,
  DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
  "|DataDirectory|\\Data\\TotalTimeTestData.xml",
  "TestDatum",
  DataAccessMethod.Sequential)]
public void AddingNewDataPointUpdatesTotalTime()
{
  PwmData dataUnderTest = new PwmData();
  foreach(var row in TestContext.DataRow.GetChildRows("TestDatum_PwmDataPoint"))
  {
    IoState state = (IoState)Enum.Parse(typeof(IoState), row["IoState"].ToString());
    double timeAtState = Convert.ToDouble(row["SecondsAtState"].ToString());
    dataUnderTest.AddNewDataPoint(new PwmDataPoint(state, timeAtState));
  }
  double expected = Convert.ToDouble(TestContext.DataRow.GetChildRows("TestDatum_TotalTime")[0]["Time"]);

  Assert.AreEqual(expected, dataUnderTest.TotalSeconds);

}