2

我在理解访问方法“不自动移动光标”如何用于 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

为了实现这一点,我按照这里的指南编写了一个带有 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 异常:“AccessMethod Unique 的数据源表中没有更多的数据行”。

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

4

1 回答 1

2

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

您收到 WebTestEndOfDataException 的原因是:

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

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

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

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

于 2012-05-09T05:44:39.720 回答