Загрузите тесты, пытаясь генерировать случайные имена, но получая одинаковые имена для многих виртуальных пользователей. - PullRequest
0 голосов
/ 30 августа 2018

Я использую тесты производительности Visual Studio. Я хочу создать случайное имя перед каждым моим запросом. Я использую этот WebTestRequestPlugin для этого:

using System;
using System.ComponentModel;
using System.Linq;
using Microsoft.VisualStudio.TestTools.WebTesting;

namespace TransCEND.Tests.Performance.Plugins
{
    public class RandomStringContextParameterWebRequestPlugin : WebTestRequestPlugin
    {
        [Description("Name of the Context Paramter that will sotre the random string.")]
        [DefaultValue("RandomString")]
        public string ContextParameter { get; set; }

        [Description("Length of the random string.")]
        [DefaultValue(10)]
        public int Length { get; set; }

        [Description("Prefix for the random string.")]
        [DefaultValue("")]
        public string Prefix { get; set; }

        private readonly string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        private Random _random = new Random();

        public RandomStringContextParameterWebRequestPlugin()
        {
            ContextParameter = "RandomString";
            Prefix = "";
            Length = 10;
        }

        public override void PreRequestDataBinding(object sender, PreRequestDataBindingEventArgs e)
        {
            e.WebTest.Context[ContextParameter] = CreateNewRandomString();            

            base.PreRequestDataBinding(sender, e);
        }

        private string CreateNewRandomString()
        {
            var randomString = new string(Enumerable.Repeat(_chars, Length).Select(s => s[_random.Next(s.Length)]).ToArray()).ToLower();
            return $"{Prefix}{randomString}";
        }
    }
}

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

У меня вопрос, как я могу генерировать случайные имена для каждого из моих запросов, даже если пользовательская нагрузка высока?

1 Ответ

0 голосов
/ 31 августа 2018

Я думаю, что проблема в том, что стандартные подпрограммы со случайными числами не являются потокобезопасными. Таким образом, каждый виртуальный пользователь (VU) получает одинаковое случайное начальное значение и, следовательно, одинаковые случайные числа. См. здесь и здесь для более подробных объяснений.

Код для CreateNewRandomString не показан в вопросе, но он, вероятно, использует основной код случайного числа C #, который имеет проблему, описанную выше. Решение состоит в том, чтобы использовать более безопасное случайное число. Этот вопрос дает некоторые идеи о лучших генераторах случайных чисел.

Я использовал код, основанный на следующем, в нескольких тестах производительности:

public static class RandomNumber
{
    private static Random rand = new Random(DateTime.Now.Millisecond);
    private static object randLock = new object();

    /// <summary>
    /// Generate a random number.
    /// </summary>
    /// <param name="maxPlus1">1 more than the maximum value wanted.</param>
    /// <returns>Value between 0 and maxPlus1-1 inclusive. Ie 0 .le. returned value .lt. maxPlus1</returns>
    public static int Next(int maxPlus1)
    {
        int result;

        lock (randLock)
        {
            result = rand.Next(maxPlus1);
        }

        return result;
    }
}

В приведенный выше код должно быть просто добавить метод создания строки, который генерирует искомую строку в операторе lock{ ... }.

Часть вопроса, в которой говорится «перезаписывать параметр контекста RandomName при каждом запуске. Поэтому, когда мои запросы фактически выполняются, они используют одно и то же случайное имя» неправильно понимает, что происходит. Каждый VU получает свой собственный набор CP, просто случайные числа одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...