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

本文关键字:遍历 MoveDataTableCursor web 测试 调用 插件 | 更新日期: 2023-09-27 18:27:51

我很难理解访问方法"Do not move cursor automatically"如何适用于web测试数据源。而且这些文件似乎还远远不够详尽。

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

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

在这种情况下,测试每行运行5次,所以它基本上会自动移动光标。这是有意的吗?

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

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

Id  StepId
1   1
2   1
3   2
4   2
5   2

为了实现这一点,我遵循了这里的指导方针,并用PreWebTest方法编写了一个web测试插件,如下所示:

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异常:"在具有唯一访问方法的数据源表中不再有数据行"。

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

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

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

您得到WebTestEndOfDataException的原因是:

  1. Visual Studio测试引擎实现"每个数据源行运行一次"的方式包括以下事实:所有五个测试都只有一个数据游标;即在所有5个测试之间记住光标的状态
  2. 每次测试迭代都会自动增加数据游标
  3. 您的插件在这组5个测试中推进数据光标,在5个测试完成之前,必须耗尽可用行

使测试工作的最简单方法是手动设置迭代次数,而不是使用"每个数据源行运行一次"。例如,数据中只有两个有效行,因此将迭代次数设置为2。然而,这也是一个糟糕的解决方案,因为您必须手动计算行数并更改值。

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

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