如何从负载测试插件中获取负载测试中的测试迭代次数?

时间:2013-09-23 19:28:21

标签: c# load-testing

我需要从负载测试插件中获取负载测试的测试迭代次数,其中我有一个LoadTest对象的实例。我搜索了LoadTest对象的属性,与通常用于配置负载测试的treeview编辑器相比,感觉有很多缺失。

我已经将测试迭代次数再次定义为Context参数并将其传递给我的Web测试,但这感觉就像是一个黑客,因为我正在复制数据。

class MyLoadTestPlugin : ILoadTestPlugin
{
    private LoadTest loadTest;

    public void Initialize(LoadTest test)
    {
        loadTest = test;

        loadTest.TestStarting += (_, e) =>
        {
            // Get # of Test Iterations in load test here,
            // "loadTest" object does not have nearly as
            // many properties as it should, compared to
            // the tree view editor.
        };
    }     
}

2 个答案:

答案 0 :(得分:2)

使用LoadTestPlugin读取.loadtest文件,该文件是XML文件。下面是一个读取.loadtest文件中TotalIterations的示例。

using System;
using Microsoft.VisualStudio.TestTools.LoadTesting;
using System.IO;
using System.Xml;

namespace LoadTest
{
    public class LoadTestPluginImpl : ILoadTestPlugin
    {

        LoadTest mLoadTest;

        static int TotalIterations;
        public void Initialize(LoadTest loadTest)
        {
            mLoadTest = loadTest;
            //connect to the TestStarting event.
            mLoadTest.TestStarting += new EventHandler<TestStartingEventArgs>(mLoadTest_TestStarting);
            ReadTestConfig();
        }

        void mLoadTest_TestStarting(object sender, TestStartingEventArgs e)
        {
            //When the test starts, copy the load test context parameters to
            //the test context parameters
            foreach (string key in mLoadTest.Context.Keys)
            {
                e.TestContextProperties.Add(key, mLoadTest.Context[key]);
            }
            //add the CurrentTestIteration to the TestContext
            e.TestContextProperties.Add("TestIterationNumber", e.TestIterationNumber);
            //add the TotalIterations to the TestContext and access from the Unit Test.
            e.TestContextProperties.Add("TotalIterations", TotalIterations);

        }

        void ReadTestConfig()
        {
            string filePath = Path.Combine(Environment.CurrentDirectory, mLoadTest.Name + ".loadtest");

            if (File.Exists(filePath))
            {
                string runSettings = mLoadTest.RunSettings.Name;
                XmlDocument xdoc = new XmlDocument();
                xdoc.Load(filePath);

                XmlElement root = xdoc.DocumentElement;

                string xmlNameSpace = root.GetAttribute("xmlns");
                XmlNamespaceManager xmlMgr = new XmlNamespaceManager(xdoc.NameTable);
                if (!string.IsNullOrWhiteSpace(xmlNameSpace))
                {
                    xmlMgr.AddNamespace("lt", xmlNameSpace);
                }

                var nodeRunSettings = xdoc.SelectSingleNode(string.Format("//lt:LoadTest/lt:RunConfigurations/lt:RunConfiguration[@Name='{0}']", runSettings), xmlMgr);
                //var nodeRunSettings = xdoc.SelectSingleNode(string.Format("//lt:LoadTest", runSettings), xmlMgr);
                if (nodeRunSettings != null)
                {
                    TotalIterations = Convert.ToInt32(nodeRunSettings.Attributes["TestIterations"].Value);
                }

            }
        }
    }
}

同样,您可以阅读其他值。

答案 1 :(得分:1)

Web测试具有webTest.Context.WebTestIteration中的当前迭代编号(以及名为$WebTestIteration的上下文参数)。

LoadTest可以访问TestStartingEventArgs对象中的当前迭代编号:

loadTest.TestStarting += ( (sender, e) =>
{
    int iteration = e.TestIterationNumber;
};

为了向自己证明这些值是相同的,并且没有意外的行为,比如数字在不同的场景中重复使用,我(编辑:重新)编写了这些插件,并检查出来

(感谢@AdrianHHH指出前面的代码没有完成)

public class LoadTestIteration : ILoadTestPlugin
{
    List<int> usedTestIterationNumbers = new List<int>();
    public void Initialize(LoadTest loadTest)
    {
        loadTest.TestStarting += (sender, e) =>
        {
            e.TestContextProperties["$LoadTest.TestIterationNumber"] = e.TestIterationNumber;
            System.Diagnostics.Debug.Assert(!usedTestIterationNumbers.Contains(e.TestIterationNumber), "Duplicate LoadTest TestIterationNumber: " + e.TestIterationNumber);
            usedTestIterationNumbers.Add(e.TestIterationNumber);
        };
    }
}

public class TestWebTestIteration : WebTestPlugin
{
    public override void PreWebTest(object sender, PreWebTestEventArgs e)
    {
        int lti = (int)e.WebTest.Context["$LoadTest.TestIterationNumber"];
        int wti = e.WebTest.Context.WebTestIteration;
        System.Diagnostics.Debug.Assert(lti == wti, String.Format("$LoadTestIteration {0} differs from $WebTestIteration {1}", lti, wti));
    }
}