WebTestPlugins.cs 12.9 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Microsoft.VisualStudio.TestTools.WebTesting;
using Microsoft.VisualStudio.TestTools.LoadTesting;
using System.IO;
using System.ComponentModel;

namespace LIL_VSTT_Plugins
{


    /// <summary>
    /// Datasource Unique Once
    /// </summary>
    [DisplayName("Datasource Unique Once")]
    [Description("(C) Copyright 2011 LIGHTS IN LINE AB\r\nOBS! Läs hela! Styr datasource selection till att endast göras en gång per VU. Du måste ändra i din datasource Access Metod till Do Not Move Automatically! WebTestUserId används för att välja rad. Använder de datasources som finns definerade i webtestet. Använd test mix based on users starting tests samt 0 percent new users.")]
    public class UniqueOnce : WebTestPlugin
    {
        string dataSourceName;
        string dataTableName;
        int offset;

        [DisplayName("Datakällans namn")]
        [Description("Ange namnet på datakällan i ditt webtest, tex DataSource1")]
        [DefaultValue("DataSource1")]
        public string DataSourceName
        {
            get { return dataSourceName; }
            set { dataSourceName = value; }
        }

        [DisplayName("Tabellens namn")]
        [Description("Ange namnet på den tabell som ska användas, tex Userdata#csv")]
        public string DataSourceTableName
        {
            get { return dataTableName; }
            set { dataTableName = value; }
        }

        [DisplayName("Offset")]
        [Description("Används för att hoppa över ett visst antal rader från början på datakällan så de inte används.")]
        [DefaultValue(0)]
        public int Offset
        {
            get { return offset; }
            set { offset = value; }
        }

        public override void PreWebTest(object sender, PreWebTestEventArgs e)
        {
            base.PreWebTest(sender, e);
            int index = e.WebTest.Context.WebTestUserId + offset;
            e.WebTest.MoveDataTableCursor(dataSourceName, dataTableName, index);
            e.WebTest.AddCommentToResult("Selected row number " + index + " from datasource " + dataSourceName + " and table " + dataTableName + ".");
        }
    }

    /// <summary>
    /// Filtrar bort oönskade objekt från sidor.
    /// Samtliga objekt vars URL börjar med den angivna strängen kommer ignoreras och inte laddas ner.
    /// </summary>
    [DisplayName("Dynamisk URL exclude filter")]
    [Description("(C) Copyright 2011 LIGHTS IN LINE AB\r\nFilter för att ignorera vissa objekt på websidor så de inte laddas ner automatiskt.")]
    public class WebTestDependentFilter : WebTestPlugin
    {
        string m_startsWith;

        /// <summary>
        /// Fullständig URL (inkl http://) som börjar med FilterString kommer att ignoreras.
        
        [DisplayName("URL börjar med")]
        [Description("Dynamiska (dependent) objekt som hittas kommer endast att laddas ner om de INTE börjar med denna sträng.\r\nTex: https://www.excludedsite.com")]
        public string FilterString
        {
            get { return m_startsWith; }
            set { m_startsWith = value; }
        }
        
        public override void PostRequest(object sender, PostRequestEventArgs e)
        {
            WebTestRequestCollection depsToRemove = new WebTestRequestCollection();
            Boolean hasRun = false;

            foreach (WebTestRequest r in e.Request.DependentRequests)
            {
                if (!string.IsNullOrEmpty(m_startsWith) &&
                    r.Url.StartsWith(m_startsWith))
                {
                    depsToRemove.Add(r);
                    hasRun = true;
                }
            }
            foreach (WebTestRequest r in depsToRemove)
            {
                e.Request.DependentRequests.Remove(r);
            }

            if (hasRun)
            {
                //e.WebTest.AddCommentToResult("WebTestDependentFilter has run");
            }
        }
    }

    /// <summary>
    /// Filtrar bort oönskade objekt från sidor.
    /// Samtliga objekt vars URL börjar med den angivna strängen kommer ignoreras och inte laddas ner.
    /// </summary>
    [DisplayName("Dynamisk URL include filter")]
    [Description("(C) Copyright 2011 LIGHTS IN LINE AB\r\nFilter för att ignorera vissa objekt på websidor så de inte laddas ner automatiskt.")]
    public class WebTestDependentIncludeFilter : WebTestPlugin
    {
        string m_startsWith;

        /// <summary>
        /// Fullständig URL (inkl http://) som börjar med FilterString kommer att ignoreras.

        [DisplayName("URL börjar med")]
        [Description("Alla dynamiska (dependent) objekt som hittas kommer endast att laddas ner OM DE BÖRJAR med denna sträng.\r\nTex: https://www.onlythissite.com")]
        public string FilterString
        {
            get { return m_startsWith; }
            set { m_startsWith = value; }
        }

        public override void PostRequest(object sender, PostRequestEventArgs e)
        {
            WebTestRequestCollection depsToRemove = new WebTestRequestCollection();
            Boolean hasRun = false;

            foreach (WebTestRequest r in e.Request.DependentRequests)
            {
                if (!string.IsNullOrEmpty(m_startsWith) &&
                    !r.Url.StartsWith(m_startsWith))
                {
                    depsToRemove.Add(r);
                    hasRun = true;
                }
            }
            foreach (WebTestRequest r in depsToRemove)
            {
                e.Request.DependentRequests.Remove(r);
            }

            if (hasRun)
            {
                //e.WebTest.AddCommentToResult("WebTestDependentFilter has run");
            }
        }
    }



    /// <summary>
    /// Service Manager Plugin
    /// </summary>
    [DisplayName("Service Manager Config")]
    [Description("(C) Copyright 2015 LIGHTS IN LINE AB\r\nSätter config värden i Service Manager instansen för hela testet, finns även som loadtest plugin och gäller då hela loadtestet.")]
    public class ServiceManagerWebTestPlugin : WebTestPlugin
    {
        [DisplayName("Use Expect 100 Behaviour"), DefaultValue(true)]
        public bool exp100 { get; set; }

        [DisplayName("Max Connection Idle Time"), DefaultValue(100)]
        public int maxIdle { get; set; }

        [DisplayName("TCP Keep Alive"), DefaultValue(false)]
        public bool keepAlive { get; set; }

        [DisplayName("TCP Keep Alive Timeout (ms)"), DefaultValue(5000)]
        public int timeOut { get; set; }

        [DisplayName("TCP Keep Alive Interval"), DefaultValue(1000)]
        public int interVal { get; set; }

        [DisplayName("Use Nagle Algorithm"), DefaultValue(false)]
        public bool useNagle { get; set; }

        [DisplayName("Force TLS 1.2"), DefaultValue(false)]
        [Description("Kräver .NET 4.5 samt att TLS1.2 är aktiverat i SChannel (använd bifogad schannel_high.reg)")]
        public bool useTls12 { get; set; }

        public override void PreWebTest(object sender, PreWebTestEventArgs e)
        {
            base.PreWebTest(sender, e);
            System.Net.ServicePointManager.Expect100Continue = exp100;
            System.Net.ServicePointManager.MaxServicePointIdleTime = maxIdle;
            System.Net.ServicePointManager.SetTcpKeepAlive(keepAlive, timeOut, interVal);
            System.Net.ServicePointManager.UseNagleAlgorithm = useNagle;
            if(useTls12) System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
        }

    }

    /// <summary>
    /// WebTest Plugin Template
    /// </summary>
    [DisplayName("Randomize each page")]
    [Description("(C) Copyright 2011 LIGHTS IN LINE AB\r\nVäljer en ny slumpmässig rad i din datasource vid varje sida/page i skriptet.")]
    public class randomOnEachPage : WebTestPlugin
    {
        string dataSourceName;
        string dataTableName;
        int datasourceSize = 0;
        Random RandomNumber = new Random(System.DateTime.Now.Millisecond);

        [DisplayName("Datakällans namn")]
        [Description("Ange namnet på datakällan i ditt webtest, tex DataSource1")]
        [DefaultValue("DataSource1")]
        public string DataSourceName
        {
            get { return dataSourceName; }
            set { dataSourceName = value; }
        }

        [DisplayName("Tabellens namn")]
        [Description("Ange namnet på den tabell som ska användas, tex Userdata#csv")]
        public string DataSourceTableName
        {
            get { return dataTableName; }
            set { dataTableName = value; }
        }

        public override void PrePage(object sender, PrePageEventArgs e)
        {
            base.PrePage(sender, e);
            if (datasourceSize == 0) {
                int size = e.WebTest.GetDataTableRowCount(dataSourceName, dataTableName);
                if(size > 0) 
                    datasourceSize = size;
                else
                    return;
            }
            if (datasourceSize > 0)
            {
                int index = RandomNumber.Next(0, datasourceSize - 1);
                e.WebTest.MoveDataTableCursor(dataSourceName, dataTableName, index);
                //e.WebTest.AddCommentToResult("Selected row number " + index + " from datasource " + dataSourceName + " and table " + dataTableName + ".");
            }
        }
    }


    ///<summary>
    ///WebTest Plugin Data Generator
    ///</summary>
    [DisplayName("Data Generator Timestamp")]
    [Description("(C) Copyright 2011 LIGHTS IN LINE AB\r\nGenererar en timestamp som context parameter")]
    public class dataGenTimestamp : WebTestPlugin
    {
        private string paramName;
        [DisplayName("Parameter namn")]
        [Description("Ange namnet på parametern i ditt webtest, tex TimeStampParameter1")]
        [DefaultValue("TimeStampParameter1")]
        public string ParamNameVal
        {
            get { return paramName; }
            set { paramName = value; }
        }

        private bool millis = false;
        [DisplayName("Använd millisekunder")]
        [Description("Sätt till true om du vill ha värdet i millisekunder istället för sekunder.")]
        [DefaultValue(false)]
        public bool MillisecondsVal
        {
            get { return millis; }
            set { millis = value; }
        }

        private bool prePage = false;
        [DisplayName("Uppdatera på varje Page")]
        [Description("Sätt till true om du vill ha värdet uppdaterat inför varje ny sida som laddas i testet.")]
        [DefaultValue(false)]
        public bool PrePageVal
        {
            get { return prePage; }
            set { prePage = value; }
        }

        private bool preTrans = false;
        [DisplayName("Uppdatera på varje Transaktion")]
        [Description("Sätt till true om du vill ha värdet uppdaterat inför varje ny transaktion i testet.")]
        [DefaultValue(false)]
        public bool PreTransactionVal
        {
            get { return preTrans; }
            set { preTrans = value; }
        }

        private bool preReq = false;
        [DisplayName("Uppdatera på varje Request")]
        [Description("Sätt till true om du vill ha värdet uppdaterat inför varje nytt request i testet.")]
        [DefaultValue(false)]
        public bool PreRequestVal
        {
            get { return preReq; }
            set { preReq = value; }
        }

        public override void PreWebTest(object sender, PreWebTestEventArgs e)
        {
            update(e.WebTest.Context);
            base.PreWebTest(sender, e);
        }

        public override void PrePage(object sender, PrePageEventArgs e)
        {
            if (prePage) update(e.WebTest.Context);
            base.PrePage(sender, e);
        }

        public override void PreRequestDataBinding(object sender, PreRequestDataBindingEventArgs e)
        {
            if (preReq) update(e.WebTest.Context);
            base.PreRequestDataBinding(sender, e);
        }

        public override void PreTransaction(object sender, PreTransactionEventArgs e)
        {
            if (preTrans) update(e.WebTest.Context);
            base.PreTransaction(sender, e);
        }

        private void update(WebTestContext context)
        {
            TimeSpan span = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc));
            if (millis) context[paramName] = ((Int64) span.TotalMilliseconds).ToString();
            else context[paramName] = ((Int64) span.TotalSeconds).ToString();
        }
    }


    /*
    /// <summary>
    /// WebTest Plugin Template
    /// </summary>
    [DisplayName("Plugin Namn")]
    [Description("(C) Copyright 2011 LIGHTS IN LINE AB\r\nFörklaring")]
    public class myPlugin : WebTestPlugin
    {
        public override void PreWebTest(object sender, PreWebTestEventArgs e)
        {
            base.PreWebTest(sender, e);
            e.WebTest.Context.CookieContainer = new myCookieContainer();
        }
    }
    */

}