如何使用xml在MSTest中创建带参数的性能测试?

3
我需要使用MSTest(LoadTests)和Visual Studio 2010生成一些性能测试。我需要对restful服务进行测试并收集指标。
我创建了一个集成测试,请求一个URL(类似于http://hostname/get/201212或任何ID)。然后我创建了一个负载测试,并成功执行了集成测试数千次,并调查响应时间和服务器指标(CPU负载,内存等)。
现在我需要执行类似的场景,但每个测试都需要从给定的XML中读取不同的ID。这样做的想法是不要有任何缓存。
目前为止,我尝试/思考的解决方案如下:
1. "冒泡排序"的解决方案是创建数千个测试,每个测试都有一个ID。不可行。
2. 下一个方法是创建一个测试来读取XML,迭代并发出请求。这种方法的问题是我最终会拥有一个需要几分钟才能运行的大型测试。
3. 我有一个可能的解决方法,使用[ClassInitialize]从XML加载所有ID,使用[TestInitialiaze]更改全局变量每个测试执行...
我不确定最后一个选项是否是最好的。MSTests中是否有任何机制允许我使用从XML读取的不同ID执行LoadTests?
2个回答

2

我不喜欢回答自己的问题,但我把这个放在这里是为了方便有同样问题的人参考。

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

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

如果我的Loadtest有1000个迭代和1000个ID的csv列表,则使用以下解决方案将执行1000个测试每个测试都有一个ID。如果发生您的LoadTest有更多的迭代,比如2000,那么在LoadTest 1001将再次从csv列表的开头开始。

我的解决方案

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

实现这一点的正确选项是创建一个具有DataSource属性的测试。例如,您可以创建一个包含要在测试中使用的ID的csv文件。以下是我的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。

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


1
我认为你的解决方案不是负载测试。采用这种方法,你的1000个测试将一个接一个地运行,而不是同时运行。我说得对吗? - chaliasos
你说得对,这是一项性能测试,因为我正在一个接一个地调用测试。首先,我创建了一个单一的测试,从nosql数据库中检索1个文档,并使用LoadTesting重复调用它数千次。后来,为了避免缓存命中,我不得不做同样的事情,但每次都使用不同的ID,以便文档不会重复两次。顺便说一下,真正的数字不是1000,而是150万个请求 :) - Oscar Foley
负载测试的目的是让虚拟(并发)用户向您的系统发送请求。那么您的测试结果呢?通过连续发送150万个请求,您的系统并没有承受负载。您的服务器每次只能处理一个请求。 - chaliasos
我只是使用 Visual Studio 2010 Ultimate 的 LoadTesting 功能,所以才使用了“负载测试”这个术语。我已经编辑了我的问题以反映这一点。 - Oscar Foley

1

"冒泡排序"的解决方案是创建成千上万个测试,每个测试都有一个id。不可行。

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

下一个方法是创建一个读取xml、迭代并进行请求的测试。这种方法的问题在于我最终会得到一个需要几分钟才能运行的大型测试。

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

我认为第三种方法是最好的方法,并且可以进行一些变化。我解决类似问题的方法是:

  1. 创建一个类(假设为),该类将为每个测试提供不同的数据。
  2. DataInput从scv文件中读取数据,并提供我想要的数据的静态方法(例如getNextUserName)。
  3. [ClassIntialize]中,我创建了一个静态的DataInput对象。
  4. [TestInitialize]中,我通过从DataInput获取数据来创建实际的请求到rest服务。

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


第三种方法很好。我正在尝试它,并且负载测试可以正确执行所有测试,但在收集结果时似乎失败了。(结果选项卡看起来是空的) - Oscar Foley
1
那是一个完全不同的错误。我认为你缺少了 LoadTest 数据库。请查看此帖子 - chaliasos
这正是我所遇到的问题...但之前我在没有数据库的情况下能够工作得很好。我打算试着设置一个数据库以防万一... - Oscar Foley
我已经在自己的环境中测试过,第三个解决方案不起作用。每次测试都会初始化,所以我要运行数千次才能使用第一行数据。解决方案包括DataDriven MSTests(正在调查中)。 - Oscar Foley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接