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

C# 如何使用xml在MSTest中创建参数化性能测试?,c#,visual-studio-2010,mstest,load-testing,performance-testing,C#,Visual Studio 2010,Mstest,Load Testing,Performance Testing,我需要使用MSTest(LoadTests)和VisualStudio2010生成一些性能测试。我需要对restful服务进行测试并收集指标 我创建了一个集成测试,它请求一个URL(类似于restful的东西)http://hostname/get/201212或任何ID)。之后,我创建了一个负载测试,并设法执行数千次集成测试,并调查响应时间和服务器指标(CPU负载、内存等) 现在我需要执行一个类似的场景,但是每个测试都需要从包含数千个数据的给定XML中读取不同的ID。这个想法是没有任何缓存 到

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

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

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

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

  • “冒泡排序”解决方案是创建数千个测试,每个测试都有一个id。不可行
  • 下一种方法是创建一个测试,读取xml,对其进行迭代并发出请求。这种方法的问题是,我将结束一个需要几分钟才能运行的大型测试
  • 我有一个可能的解决方法,使用[ClassInitialize]从XML加载所有ID,使用[TestInitialiaze]在每次测试执行时更改一个全局变量 我不确定最后一个选择是否是最好的MSTests中是否有任何机制允许我使用从XML读取的不同ID执行负载测试?

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

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

    下一种方法是创建一个读取xml的测试,并对其进行迭代 并提出要求。这种方法的问题是,我将结束 有一个需要几分钟才能运行的大型测试

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

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

  • 创建一个类(比如说
    DataInput
    ),为每个测试提供不同的数据
  • DataInput
    正在从scv文件读取数据,并具有提供所需数据的静态方法(例如getNextUserName)
  • [classialize]
    中,我创建了一个静态
    DataInput
    对象
  • [TestInitialize]
    中,我通过从
    数据输入获取数据来创建对rest服务的实际请求

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

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

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

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

    使用以下解决方案,如果我的Loadtest有1000次迭代,并且我的csv列表有1000个ID,那么将执行1000个测试,每个测试都有一个ID。如果您的负载测试有更多的迭代,比如说2000次,那么在负载测试中,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文件数据源属性读取它并对其进行迭代

    此行是测试从TestContext读取数据的地方

    string ID = TestContext.DataRow["ID"].ToString();
    
    在CSV文件中有n个ID将导致测试运行n次,每个ID运行一次。

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


    第三种方法的好主意。我正在尝试,LoadTests正确地执行所有测试,但在收集结果时似乎失败了。(结果选项卡看起来是空的)这是一个完全不同的错误。我认为您缺少
    LoadTest
    数据库。看看这个。这正是发生在我身上的事。。。但是我以前在没有DB的情况下工作,没有问题。我将尝试设置一个数据库,以防万一…我已经在我自己的测试和第三个解决方案不工作。每次初始化测试时,我都会使用第一个数据行运行数千次。解决方案包括数据驱动的MSTests(现在正在调查),我认为您的解决方案不是负载测试。使用这种方法,您的1000个测试将一个接一个地运行,而不是同时运行。我说得对吗?你说得对,这是一个性能测试,因为我一个接一个地调用测试。首先,我创建了一个测试,从nosql DB中检索到一个文档,并使用LoadTesting调用它数千次。后来,为了避免缓存命中,我不得不做同样的操作,但每次都使用不同的ID,这样文档就不会重复两次。顺便说一句,实际数字不是1000,而是150万个请求:)的目的是让虚拟(并发)用户对您的系统执行请求。你的测试结果如何?通过一个接一个地发送150万个请求,您的系统未处于加载状态。您的服务器必须同时处理一个请求。我之所以使用负载测试这个术语,是因为我使用的是Visual Studio 2010 Ultimate的负载测试功能。我编辑了我的问题以反映这一点。