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

本文关键字:创建 参数 性能测试 MSTest 何使用 xml | 更新日期: 2023-09-27 18:01:03

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

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

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

到目前为止,我尝试/思考了什么

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

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

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

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

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

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

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

我的解决方案

注意:此解决方案使用csv文件。它可以很容易地适应使用另一个不同的DataSource,如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一个。

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

  • MSDN信息
  • StackOverflow中的这个问题
  • MSDN关于如何访问不同DataSource的说明

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

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

下一种方法是创建一个读取xml的测试,并对其进行迭代并提出请求。这种方法的问题在于,我将结束进行一次需要几分钟时间的大测试。

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

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

  1. 创建一个类(比如DataInput(,为每个测试提供不同的数据
  2. DataInput正在从scv文件中读取数据,并具有提供我想要的数据的静态方法(例如getNextUserName(
  3. [ClassIntialize]中,我创建了一个静态DataInput对象
  4. [TestInitialize]中,我通过从DataInput获取数据来创建对其余服务的实际请求

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