Заредете тестове, опитвайки се да генерирате произволни имена, но получавате еднакви имена за много виртуални потребители

Използвам тестове за производителност на 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}";
        }
    }
}

Проблемът ми е, че когато стартирам тест за натоварване с множество виртуални потребители, кодът на preRequest се изпълнява незабавно за първите няколко потребители, пренаписвайки контекстния параметър RandomName при всяко изпълнение. Така че, когато моите заявки действително се изпълняват, те използват едно и също произволно име, причинявайки конфликт в моя back-end код.

Въпросът ми е как мога да генерирам произволни имена за всяка моя заявка, дори когато потребителското натоварване е високо?


person gkatai    schedule 30.08.2018    source източник
comment
Моля, редактирайте въпроса, за да включите приставката като код (т.е. текст), а не като връзка към външен сайт. Промених заглавието, за да направя, надявам се, проблема по-ясен - моля, не се колебайте да го подобрите допълнително.   -  person AdrianHHH    schedule 02.09.2018


Отговори (1)


Мисля, че проблемът е, че стандартните процедури за произволни числа не са безопасни за нишки. Така всеки виртуален потребител (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, просто случайните числа са еднакви.

person AdrianHHH    schedule 30.08.2018
comment
Благодаря ви, това ми помогна много. - person gkatai; 31.08.2018