3

我需要使用 MSTest (LoadTests) 和 Visual Studio 2010 生成一些性能测试。我需要对一个 restful 服务进行测试并收集指标。

我已经创建了一个请求一个 URL 的集成测试(类似于http://hostname/get/201212或任何 ID 的东西)。后来我创建了一个负载测试并设法执行数千次集成测试并调查响应时间和服务器指标(CPU 负载、内存等)

现在我需要执行类似的场景,但每个测试都需要从包含数千个的给定 XML 读取不同的 ID。这个想法是没有任何缓存。

到目前为止我已经尝试/想到了什么?

  1. “冒泡排序”解决方案是创建数千个测试,每个测试都有一个 id。不可行
  2. 下一种方法是创建一个读取 xml 的测试,遍历它并发出请求。这种方法的问题是我将结束一个需要几分钟才能运行的大型测试。
  3. 我有一个可能的解决方法,使用[ClassInitialize]从 XML 加载所有 ID,并使用[TestInitialize]在每次测试执行时更改全局变量...

我不确定最后一个选项是否是最好的。MSTests 中是否有任何机制允许我使用从 XML 读取的不同 ID 执行 LoadTests?

4

2 回答 2

2

我不喜欢回答我自己的问题,但我把它放在这里,以供将来有同样问题的人参考。

为什么其他第三个选项是错误的

第三个选项的问题是,在具有 1000 次迭代且 ID 列表为 1000的 LoadTest 中,LoadTest 使用第一个 ID 运行 1000 次而不是 1000 次,每个 ID 都有一个。我使用了某种 nosql 分析器来证明这一点。

如果我的 Loadtest 有 1000 次迭代并且我的 csv 列表有 1000 个 ID,则使用以下解决方案,每个 ID将执行 1000 个测试。如果你的 LoadTest 有更多的迭代,比如 2000,那么在 LoadTest 中,1001 将从 csv 列表的开头重新开始。

我的解决方案

注意:此解决方案使用 csv 文件。它可以很容易地适应使用另一个不同的数据源,如 xml、excel、SQL server 中的表等。

实现此目的的正确选项是使用 DataSource属性创建测试。例如,您创建一个csv文件,其中包含要在测试中使用的 ID。我的 csv 文件示例:

ID
1003002-20121211120000
1004071-20121211120000

您需要在测试中添加DataContext

private TestContext testContextInstance;
public TestContext TestContext
{
    get { return testContextInstance; }
    set { testContextInstance = value; }
}

最后,你的测试应该是这样的:

    [TestMethod,DeploymentItem("DataOrigin\\list.csv"), DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\list.csv", "list#csv", DataAccessMethod.Sequential)]
    public void TestScenario_1_DATADRIVEN()
    {
        // PREPARATION
        string ID = TestContext.DataRow["ID"].ToString();
        string querystring = CreateQueryWithErrorDebug(ID);

        // EXECUTION
        string result = RunXCCQuery(querystring);

        // ASSERTS
        Assert.IsTrue(result.Length > 0);
        Assert.IsTrue(result.Contains(ID));
    }

DeploymentItem属性复制 csv 文件。DataSource属性读取它并遍历它。

此行是您的测试从 TestContext 读取的位置。

string ID = TestContext.DataRow["ID"].ToString();

CSV 文件中有 n 个 ID 将导致测试运行 n 次,每个 ID 一个。

我在调查中发现了一些有用的链接:

于 2013-02-28T09:03:08.743 回答
1

“冒泡排序”解决方案是创建数千个测试,每个测试都有一个 id。不可行

完全同意。这是不可能的。

下一种方法是创建一个读取 xml 的测试,遍历它并发出请求。这种方法的问题是我将结束一个需要几分钟才能运行的大型测试。

这种方法不是负载测试。您一次只有一个测试发送一个请求。

我认为最好的方法是有一些变化的第三种方法。我解决类似问题的方法是:

  1. 创建一个类(比方说DataInput),它将为每个测试提供不同的数据。
  2. 正在从 scv 文件中DataInput读取数据,并具有提供我想要的数据的静态方法(例如 getNextUserName)。
  3. [ClassIntialize]我创建一个静态DataInput对象。
  4. [TestInitialize]我通过从DataInput.

这样所有的测试都有不同的数据。

于 2013-02-25T12:54:22.223 回答