【问题标题】:Loading random number of input data points from XML file for MSTest为 MSTest 从 XML 文件加载随机数量的输入数据点
【发布时间】:2016-02-10 14:14:20
【问题描述】:

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

下面是测试代码:

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.TotalSeconds 在调用 PwmData.AddNewDataPoint 时得到正确更新。

显然,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>

每个TestDatum 都是运行测试所需的数据。在这种情况下,需要运行 2 个测试:第一个测试使用 1 个PwmDataPoint,第二个测试将使用 5 个PwmDataPoints。

我对数据驱动的 MSTest 比较陌生,我能找到的所有示例都有恒定数量的输入数据点。

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

【问题讨论】:

    标签: unit-testing visual-studio-2015 mstest data-driven-tests


    【解决方案1】:

    想通了。我首先将 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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2015-11-14
      • 1970-01-01
      • 2015-06-26
      • 2019-01-02
      相关资源
      最近更新 更多