Поделиться через


Практическое руководство. Создание подключаемого модуля записи

Подключаемый модуль WebTestRecorderPlugin позволяет изменять записанные веб-тесты производительности.Изменение происходит после выбора Остановить на панели инструментов записи веб-теста производительности, но до теста, сохраненными и представления в редакторе веб-тестов производительности.

Основная проблема, которую помогает устранить подключаемый модуль, заключается в выполнении пользовательской корреляции динамических параметров.Используя встроенные функции корреляции, веб-тесты производительности обнаруживают динамические параметры в веб-записи после ее завершения или при нажатии кнопки Преобразование динамических параметров в параметры веб-теста на панели инструментов редактора веб-тестов производительности.Дополнительные сведения см. в разделе Практическое руководство. Устранение проблем воспроизведения веб-тестов производительности, вызванных динамическими параметрами.Однако встроенные функции обнаружения не всегда позволяют найти все динамические параметры.Например, не удается определять идентификатор сеанса, который, как правило, изменяет свое значение каждые 5–30 минут.Поэтому приходится вручную выполнять процесс корреляции.Дополнительные сведения см. в разделе Практическое руководство. Повышение уровня динамических параметров до параметров веб-тестов производительности.

WebTestRecorderPlugin позволяет написать код для пользовательского подключаемого модуля.С помощью этого подключаемого модуля можно выполнять корреляцию или изменять веб-тест производительности самыми различными способами до его сохранения и отображения в редакторе веб-тестов производительности.Поэтому если пользователь определяет, что корреляцию некоторой динамической переменной следует выполнить для множества записей, он может автоматизировать процесс корреляции.

Подключаемый модуль записи можно также использовать для других целей, например для добавления правил извлечения и проверки, параметров контекста, а также для преобразования комментариев в транзакции в веб-тесте производительности.

В следующих процедурах описываются процессы создания элементарного кода для подключаемого модуля записи, развертывания этого подключаемого модуля и его выполнения.В примере кода, который представлен после описания процедур, демонстрируется использование Visual C# для создания пользовательского подключаемого модуля записи для корреляции динамических параметров.

Требования

  • Visual Studio Ultimate

Создание подключаемого модуля записи

Создание подключаемого модуля записи

  1. Открытие решения, содержащего проект веб-сайта и производительность нагрузочного теста с веб-тестом производительности, для которого нужно создать подключаемого модуля записи.

  2. В обозревателе решений щелкните решение правой кнопкой мыши, выберите Добавить, а затем выберите Создать проект.

    Откроется диалоговое окно Добавление нового проекта.

  3. В области Установленные шаблоны выберите Visual C#.

  4. В списке шаблонов выберите значение Библиотека классов.

  5. В текстовом поле Имя введите имя подключаемого модуля записи.

    В обозреватель решений добавляется библиотека классов, а в редакторе кода открывается новый класс.

  6. В обозревателе решений щелкните правой кнопкой мыши папку Ссылки в папке проекта библиотеки классов и выберите команду Добавить ссылку.

    СоветСовет

    В качестве примера используется папка нового проекта библиотеки классов RecorderPlugins.

    Появится диалоговое окно Добавление ссылки.

  7. Выберите вкладку .NET.

  8. Прокрутите вниз и выберите Microsoft.VisualStudio.QualityTools.WebTestFramework, а затем выберите команду ОК.

    Microsoft.VisualStudio.QualityTools.WebTestFramework добавляется в папку Ссылки в обозревателе решений.

  9. Напишите код подключаемого модуля записи.Сначала создайте открытый класс, производный от класса WebTestRecorderPlugin.

  10. Переопределите метод PostWebTestRecording.

    public class Class1 : WebTestRecorderPlugin
        {
            public override void PostWebTestRecording(object sender, PostWebTestRecordingEventArgs e)
            {
                base.PostWebTestRecording(sender, e);
            }
        }
    

    Аргументы события предоставляют два объекта, доступных для работы: записанный результат и записанный веб-тест производительности.Это позволяет перебирать объекты результата для поиска определенных значений и затем переходить к тому же запросу в веб-тесте производительности для выполнения изменений.Если необходимо добавить параметр контекста или параметризовать части URL-адреса, можно непосредственно изменить веб-тест производительности.

    ПримечаниеПримечание

    После внесения изменений в веб-тест производительности необходимо также установить для свойства RecordedWebTestModified значение true: e.RecordedWebTestModified = true;

  11. Добавьте дополнительный код в соответствии с задачами, которые должен выполнять подключаемый модуль записи после завершения веб-записи.Например, можно добавить код для обработки пользовательской корреляции, как показано в расположенном ниже примере.Можно также создать подключаемый модуль записи для таких операций, как преобразование комментариев в транзакции или добавление правил проверки в веб-тест производительности.

  12. В меню Построение выберите конструкцию <class library project name>.

  13. После этого необходимо развернуть подключаемый модуль записи для его регистрации в Visual Studio Ultimate.

Ff400224.collapse_all(ru-ru,VS.110).gifРазвертывание подключаемого модуля записи

После компилировать подключаемого модуля записи, необходимо разместить результирующую библиотеку DLL в одном из трех расположений: 2

  • %ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies\WebTestPlugins

  • %USERPROFILE%\My Documents\Visual Studio 2012\WebTestPlugins

Предупреждающее замечаниеВнимание

После копирования подключаемого модуля записи в одну из этих двух папок необходимо перезапустить Visual Studio Ultimate для регистрации подключаемого модуля записи.

Ff400224.collapse_all(ru-ru,VS.110).gifВыполнение подключаемого модуля записи

При создании нового веб-теста производительности открывается диалоговое окно Включить WebTestRecorderPlugins.В диалоговом окне Включить WebTestRecorderPlugins отображаются все подключаемые модули, доступные для выполнения.

Выполнение подключаемого модуля записи

  1. Создайте новый веб-тест производительности.Дополнительные сведения см. в разделе Практическое руководство. Создание веб-теста производительности с помощью средства записи веб-тестов производительности.

    Откроется диалоговое окно Включить WebTestRecorderPlugins.

  2. Выделите флажок для подключаемого модуля записи и нажмите кнопку " ОК ", чтобы.

    После завершения записи веб-теста производительности выполняется новый подключаемый модуль записи.

    Предупреждающее замечаниеВнимание

    При запуске веб-теста производительности или нагрузочного теста, использующего данный подключаемый модуль, может появиться ошибка примерно следующего вида:

    Request failed: Exception in <plug-in> event: Could not load file or assembly '<"Plug-in name".dll file>, Version=<n.n.n.n>, Culture=neutral, PublicKeyToken=null' or one of its dependencies.The system cannot find the file specified.

    Это происходит, если в один из подключаемых модулей внесены изменения кода и создана новая версия библиотеки DLL (Version=0.0.0.0), однако подключаемый модуль по-прежнему ссылается на исходную версию подключаемого модуля.Чтобы устранить эту проблему, выполните следующие действия.

    1. В проекте веб-сайта и производительность нагрузочного теста отобразится предупреждение в документах.Удалите и вновь добавьте ссылку на библиотеку DLL подключаемого модуля.

    2. Удалите подключаемый модуль из теста или соответствующего расположения, а затем снова добавьте его.

Пример

В этом примере демонстрируется создание настраиваемого подключаемого модуля записи веб-теста производительности для выполнения пользовательской корреляции динамических параметров.

ПримечаниеПримечание

Полный текст этого примера кода расположен в конце данного раздела.

Обзор примера кода

Перебор объектов результата для поиска первой страницы с параметром ReportSession

В этой части примера кода перебираются все записанные объекты и выполняется поиск параметра ReportSession в теле ответа.

           foreach (WebTestResultUnit unit in e.RecordedWebTestResult.Children)
            {
                WebTestResultPage page = unit as WebTestResultPage; 
                if (page != null)
                {
                    if (!foundId)
                    {
                        int indexOfReportSession = page.RequestResult.Response.BodyString.IndexOf("ReportSession");
                        if (indexOfReportSession > -1)
                        {

Добавление правила извлечения

После обнаружения ответа необходимо добавить правило извлечения.В этой части примера кода создается правило извлечения с помощью класса ExtractionRuleReference, а затем выполняется поиск соответствующего запроса в веб-тесте производительности для добавления в него правила извлечения.К каждому объекту результата добавляется новое свойство DeclarativeWebTestItemId, которое используется в коде для получения соответствующего запроса из веб-теста производительности.

           ExtractionRuleReference ruleReference = new ExtractionRuleReference();
           ruleReference.Type = typeof(ExtractText);
           ruleReference.ContextParameterName = "SessionId";
           ruleReference.Properties.Add(new PluginOrRuleProperty("EndsWith", "&ControlID="));
           ruleReference.Properties.Add(new PluginOrRuleProperty("HtmlDecode", "True"));
           ruleReference.Properties.Add(new PluginOrRuleProperty("IgnoreCase", "True"));
           ruleReference.Properties.Add(new PluginOrRuleProperty("Index", "0"));
           ruleReference.Properties.Add(new PluginOrRuleProperty("Required", "True"));
           ruleReference.Properties.Add(new PluginOrRuleProperty("StartsWith", "ReportSession="));
           ruleReference.Properties.Add(new PluginOrRuleProperty("UseRegularExpression", "False"));

           WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
           if (requestInWebTest != null)
           {
               requestInWebTest.ExtractionRuleReferences.Add(ruleReference);
               e.RecordedWebTestModified = true;
           }

Замена параметров строки запроса

Теперь выполняется поиск параметров строки запроса, которым присвоено имя ReportSession, и изменяется значение на {{SessionId}}, как показано в следующей части примера кода:

           WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
           if (requestInWebTest != null)
           {
               foreach (QueryStringParameter param in requestInWebTest.QueryStringParameters)
               {
                    if (param.Name.Equals("ReportSession"))
                    {
                        param.Value = "{{SessionId}}";
                    }
                }
            }
using System.ComponentModel;
using Microsoft.VisualStudio.TestTools.WebTesting;
using Microsoft.VisualStudio.TestTools.WebTesting.Rules;

namespace RecorderPlugin
{
    [DisplayName("Correlate ReportSession")]
    [Description("Adds extraction rule for Report Session and binds this to querystring parameters that use ReportSession")]
    public class CorrelateSessionId : WebTestRecorderPlugin
    {
        public override void PostWebTestRecording(object sender, PostWebTestRecordingEventArgs e)
        {
            //first find the session id
            bool foundId = false;
            foreach (WebTestResultUnit unit in e.RecordedWebTestResult.Children)
            {
                WebTestResultPage page = unit as WebTestResultPage;
                if (page != null)
                {
                    if (!foundId)
                    {
                        int indexOfReportSession = page.RequestResult.Response.BodyString.IndexOf("ReportSession");
                        if (indexOfReportSession > -1)
                        {
                            //add an extraction rule to this request
                            // Get the corresponding request in the Declarative Web performance test
                            ExtractionRuleReference ruleReference = new ExtractionRuleReference();

                            ruleReference.Type = typeof(ExtractText);
                            ruleReference.ContextParameterName = "SessionId";
                            ruleReference.Properties.Add(new PluginOrRuleProperty("EndsWith", "&ControlID="));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("HtmlDecode", "True"));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("IgnoreCase", "True"));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("Index", "0"));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("Required", "True"));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("StartsWith", "ReportSession="));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("UseRegularExpression", "False"));

                            WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
                            if (requestInWebTest != null)
                            {
                                requestInWebTest.ExtractionRuleReferences.Add(ruleReference);
                                e.RecordedWebTestModified = true;
                            }
                            foundId = true;

                        }
                    }
                    else
                    {
                        //now update query string parameters
                        WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
                        if (requestInWebTest != null)
                        {
                            foreach (QueryStringParameter param in requestInWebTest.QueryStringParameters)
                            {
                                if (param.Name.Equals("ReportSession"))
                                {
                                    param.Value = "{{SessionId}}";
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

См. также

Задачи

Практическое руководство. Создание кодированного веб-теста производительности

Практическое руководство. Изменение существующего веб-теста производительности с помощью редактора веб-тестов производительности

Ссылки

WebTestRequestPlugin

PostWebTestRecording

ExtractionRuleReference

PostWebTestRecording

Другие ресурсы

Создание и применение пользовательских подключаемых модулей для нагрузочных тестов и веб-тестов производительности