C# 如何在web测试插件中调用MoveDataTableCursor来遍历表中的有限行集?

C# 如何在web测试插件中调用MoveDataTableCursor来遍历表中的有限行集?,c#,visual-studio-2010,.net-4.0,webtest,C#,Visual Studio 2010,.net 4.0,Webtest,我很难理解web测试数据源的访问方法“不自动移动光标”是如何工作的。而这些文件似乎还远远不够详尽 首先,假设有一个简单的web测试,只有一个请求。它使用一个名为DS的数据源和一个名为StepList的表,该表包含5行 表的访问方法设置为“不自动移动光标”,当前测试设置在web测试属性中启用了“每个数据源行运行一次”。web测试不是负载测试的一部分 在这些条件下,测试每行运行5次,因此它基本上会自动移动光标。这是有意的吗 现在,谈谈实际问题,这是本文的主题 我上面的StepList表有一个标识列和

我很难理解web测试数据源的访问方法“不自动移动光标”是如何工作的。而这些文件似乎还远远不够详尽

首先,假设有一个简单的web测试,只有一个请求。它使用一个名为DS的数据源和一个名为StepList的表,该表包含5行

表的访问方法设置为“不自动移动光标”,当前测试设置在web测试属性中启用了“每个数据源行运行一次”。web测试不是负载测试的一部分

在这些条件下,测试每行运行5次,因此它基本上会自动移动光标。这是有意的吗

现在,谈谈实际问题,这是本文的主题

我上面的StepList表有一个标识列和一个StepId列。所讨论的web测试实际上是从另一个web测试调用的,它应该只对在测试上下文中设置了StepId的表行运行

Id  StepId
1   1
2   1
3   2
4   2
5   2
为了实现这一点,我遵循的指导原则编写了一个web测试插件,其PreWebTest方法如下所示:

public override void PreWebTest(object sender, PreWebTestEventArgs e)
{
    string stepId = string.Empty;

    if (e.WebTest.Context.ContainsKey(ContextParameterName))
    {
        stepId = e.WebTest.Context[ContextParameterName].ToString();
    }

    while (e.WebTest.Context["DS.StepList.StepId"].ToString() != stepId)
    {
        e.WebTest.MoveDataTableCursor("DS", "StepList");
    }
}
只有当stepId的值为“2”时,上述代码才能在示例表上正常工作。如果是“1”,则MoveDataTableCursor抛出WebTestEndOfDataException异常:“AccessMethod唯一的数据源表中不再有数据行”


我尝试捕获异常并停止web测试,但这不起作用,因为测试似乎永远不会结束。

回答第一个问题:“不自动移动光标”设置仅适用于负载测试中的运行,这就是为什么在使用设置“每个数据源行运行一次”的web测试期间,光标仍会自动移动的原因。当然,后一种设置仅适用于web测试运行

获取WebTestEndOfDataException的原因是:

  • VisualStudio测试引擎实现“每个数据源行运行一次”的方式包括,所有五个测试只有一个数据游标;i、 e.在所有5次测试之间,光标的状态被记住
  • 每次测试迭代都会自动增加数据光标
  • 您的插件在这组5个测试中推进数据游标,这必然会在5个测试完成之前耗尽可用的行
  • 使测试工作的最简单方法是手动设置迭代次数,而不是使用“每个数据源行运行一次”。例如,数据中只有两个有效行,因此将迭代次数设置为2。但是,这也是一个糟糕的解决方案,因为您必须手动计算行数并更改值

    下一个最好的方法是更改WebTestPlugin,使其只需检查DS.StepList.StepId的值,如果与所需值不匹配,则执行WebTest.Stop()。这样,不需要的迭代将立即终止。然而,它们仍然会浪费时间,增加视觉混乱

    如果父测试应始终运行,并且只有被调用的测试应被跳过,则将“对WebTest的调用”包装在“字符串比较”条件规则中,该规则根据StepId上下文参数检查DS.StepList.StepId的值,从而仅在StepId正确时调用子测试