JMeter - нагрузочный тест пользовательского сценария

Я также хотел перегрузить Enums и создал смесь ответа «Семь» на этой странице и на ответ «Мерлин Морган-Грэм» на дубликат сообщения этого , плюс несколько улучшений. Основные преимущества моего решения по сравнению с другими:

  • автоматическое приращение базового значения int
  • автоматическое именование

является готовым решением и может быть непосредственно вставлено в ваш проект. Это связано с моими потребностями, поэтому, если вам не нравятся некоторые его части, просто замените их собственным кодом.

Во-первых, есть базовый класс CEnum, что все пользовательские перечисления должны наследовать. Он имеет базовую функциональность, аналогичную типу .net Enum:

public class CEnum
{
  protected static readonly int msc_iUpdateNames  = int.MinValue;
  protected static int          ms_iAutoValue     = -1;
  protected static List    ms_listiValue     = new List();

  public int Value
  {
    get;
    protected set;
  }

  public string Name
  {
    get;
    protected set;
  }

  protected CEnum ()
  {
    CommonConstructor (-1);
  }

  protected CEnum (int i_iValue)
  {
    CommonConstructor (i_iValue);
  }

  public static string[] GetNames (IList i_listoValue)
  {
    if (i_listoValue == null)
      return null;
    string[] asName = new string[i_listoValue.Count];
    for (int ixCnt = 0; ixCnt < asName.Length; ixCnt++)
      asName[ixCnt] = i_listoValue[ixCnt]?.Name;
    return asName;
  }

  public static CEnum[] GetValues ()
  {
    return new CEnum[0];
  }

  protected virtual void CommonConstructor (int i_iValue)
  {
    if (i_iValue == msc_iUpdateNames)
    {
      UpdateNames (this.GetType ());
      return;
    }
    else if (i_iValue > ms_iAutoValue)
      ms_iAutoValue = i_iValue;
    else
      i_iValue = ++ms_iAutoValue;

    if (ms_listiValue.Contains (i_iValue))
      throw new ArgumentException ("duplicate value " + i_iValue.ToString ());
    Value = i_iValue;
    ms_listiValue.Add (i_iValue);
  }

  private static void UpdateNames (Type i_oType)
  {
    if (i_oType == null)
      return;
    FieldInfo[] aoFieldInfo = i_oType.GetFields (BindingFlags.Public | BindingFlags.Static);

    foreach (FieldInfo oFieldInfo in aoFieldInfo)
    {
      CEnum oEnumResult = oFieldInfo.GetValue (null) as CEnum;
      if (oEnumResult == null)
        continue;
      oEnumResult.Name = oFieldInfo.Name;
    }
  }
}

Во-вторых, вот 2 производных класса Enum. Все производные классы нуждаются в некоторых базовых методах для работы, как ожидалось. Это всегда один и тот же шаблонный код; Я еще не нашел способ передать его в базовый класс. Код первого уровня наследования немного отличается от всех последующих уровней.

public class CEnumResult : CEnum
{
  private   static List  ms_listoValue = new List();

  public    static readonly CEnumResult Nothing         = new CEnumResult (  0);
  public    static readonly CEnumResult SUCCESS         = new CEnumResult (  1);
  public    static readonly CEnumResult UserAbort       = new CEnumResult ( 11);
  public    static readonly CEnumResult InProgress      = new CEnumResult (101);
  public    static readonly CEnumResult Pausing         = new CEnumResult (201);
  private   static readonly CEnumResult Dummy           = new CEnumResult (msc_iUpdateNames);

  protected CEnumResult () : base ()
  {
  }

  protected CEnumResult (int i_iValue) : base (i_iValue)
  {
  }

  protected override void CommonConstructor (int i_iValue)
  {
    base.CommonConstructor (i_iValue);

    if (i_iValue == msc_iUpdateNames)
      return;
    if (this.GetType () == System.Reflection.MethodBase.GetCurrentMethod ().DeclaringType)
      ms_listoValue.Add (this);
  }

  public static new CEnumResult[] GetValues ()
  {
    List listoValue = new List ();
    listoValue.AddRange (ms_listoValue);
    return listoValue.ToArray ();
  }
}

public class CEnumResultClassCommon : CEnumResult
{
  private   static List ms_listoValue = new List();

  public    static readonly CEnumResult Error_InternalProgramming           = new CEnumResultClassCommon (1000);

  public    static readonly CEnumResult Error_Initialization                = new CEnumResultClassCommon ();
  public    static readonly CEnumResult Error_ObjectNotInitialized          = new CEnumResultClassCommon ();
  public    static readonly CEnumResult Error_DLLMissing                    = new CEnumResultClassCommon ();
  // ... many more
  private   static readonly CEnumResult Dummy                               = new CEnumResultClassCommon (msc_iUpdateNames);

  protected CEnumResultClassCommon () : base ()
  {
  }

  protected CEnumResultClassCommon (int i_iValue) : base (i_iValue)
  {
  }

  protected override void CommonConstructor (int i_iValue)
  {
    base.CommonConstructor (i_iValue);

    if (i_iValue == msc_iUpdateNames)
      return;
    if (this.GetType () == System.Reflection.MethodBase.GetCurrentMethod ().DeclaringType)
      ms_listoValue.Add (this);
  }

  public static new CEnumResult[] GetValues ()
  {
    List listoValue = new List (CEnumResult.GetValues ());
    listoValue.AddRange (ms_listoValue);
    return listoValue.ToArray ();
  }
}

Классы успешно протестированы с помощью следующего кода:

private static void Main (string[] args)
{
  CEnumResult oEnumResult = CEnumResultClassCommon.Error_Initialization;
  string sName = oEnumResult.Name;   // sName = "Error_Initialization"

  CEnum[] aoEnumResult = CEnumResultClassCommon.GetValues ();   // aoEnumResult = {testCEnumResult.Program.CEnumResult[9]}
  string[] asEnumNames = CEnum.GetNames (aoEnumResult);
  int ixValue = Array.IndexOf (aoEnumResult, oEnumResult);    // ixValue = 6
}

0
задан TheAutomator 1 March 2019 в 23:11
поделиться

1 ответ

Я могу вспомнить две ситуации:

  1. JMeter не способен отправлять запросы достаточно быстро. Если это так:

    • Обязательно следуйте JMeter Best Practices
    • Попробуйте увеличить число потоков / виртуальных пользователей
    • Если вы не можете выполнить требуемую нагрузку от одного генератора нагрузки - рассмотрите возможность перехода к распределенному тестированию
  2. Тестируемое приложение не может реагировать достаточно быстро , Причины могут быть следующими:

    • Вашему приложению не хватает ресурсов (ЦП, ОЗУ, сеть, диск, своп и т. Д.). Рассмотрите возможность мониторинга его базовых показателей работоспособности, используя, например, JMeter PerfMon Plugin
    • Конфигурация промежуточного программного обеспечения вашего приложения не подходит для высоких нагрузок. Проверьте конфигурацию балансировщика нагрузки, сервера приложений, базы данных, чтобы узнать, достаточно ли они настроены для ожидаемой нагрузки. Ознакомьтесь с советами по оптимизации веб-производительности , чтобы получить первоначальную идею. Обычно производители серверов приложений, баз данных и т. Д. Предоставляют инструкции по масштабированию.
    • Код вашего приложения недостаточно эффективен, то есть использует плохие алгоритмы. Вы можете использовать инструменты профилирования , чтобы проверить, какие функции являются самыми медленными и / или часто вызываемыми, самыми большими объектами и т. Д.
0
ответ дан Dmitri T 1 March 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: