Multi-thread testing for web-service

В работе постоянно приходится тестировать с помощью NUnit различные web-службы. Но я делаю не банальный одиночный вызов или серию последовательных вызовов, а создаю серию потоков вплоть до максимально разрешенного на текущей машине, каждый из которых по команде начинает делать запрос в web-службу. В случае, если на сервере IIS разрешено более одного процесса, для обслуживания ApplicationPool, то это может выявить неожиданные блокировки ресурсов, которые нужно уметь отлавливать.
Эмитация такого многопоточного обращения к одному сервису сделана как показано ниже:
Copy Source | Copy HTML
  1. public class MainTests
  2. {
  3.     //количество ошибок по результату выполнения
  4.     public static int iErrors = 0;
  5.  
  6.     private static ManualResetEvent[] resetEvents;
  7.  
  8.     /// <summary>
  9.     /// Запускаем одновременно NumThreads потоков
  10.     /// </summary>
  11.     /// <param name="NumThreads">Число потоков</param>
  12.     public void QueueFewRequests(int NumThreads, AskTo whereto)
  13.     {
  14.         ManualResetEvent oStart = new ManualResetEvent(false);
  15.         Debug.WriteLine("-------------QueueFewRequests = " + NumThreads.ToString() + " " + whereto.ToString() + "----------");
  16.         resetEvents = new ManualResetEvent[NumThreads];
  17.         for (int i = 0; i < NumThreads; i++)
  18.         {
  19.             resetEvents[i] = new ManualResetEvent(false);
  20.             if (!ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(MakeSingleSearch),
  21.                 new ThreadParam()
  22.                 {
  23.                     number = i,
  24.                     oEvent = resetEvents[i],
  25.                     oWhenStart = oStart,
  26.                     askto = whereto
  27.                 }))
  28.             {
  29.                 MainTests.iErrors++;
  30.                 System.Diagnostics.Debug.WriteLine("Cant Queue request!");
  31.                 break;
  32.             }
  33.         }
  34.         //let it go!
  35.         oStart.Set();
  36.         if (NumThreads < 64)
  37.         {
  38.             ManualResetEvent.WaitAll(resetEvents);
  39.         }
  40.         else
  41.         {
  42.             //если элементов меньше 64, то можно использовать ManualResetEvent.WaitAll(resetEvents);
  43.             Array.ForEach(resetEvents, new Action<ManualResetEvent>(WaitFinish));
  44.         }
  45.         Assert.AreEqual(0, MainTests.iErrors);
  46.     }
  47.  
  48.     private void WaitFinish(ManualResetEvent oEvent)
  49.     {
  50.         oEvent.WaitOne();
  51.     }
  52.  
  53.     /// <summary>
  54.     /// Передаем один запрос в службу
  55.     /// </summary>
  56.     /// <param name="stateInfo"></param>
  57.     static void MakeSingleSearch(Object stateInfo)
  58.         {
  59.             Random rand = new Random(DateTime.Now.Millisecond + ((ThreadParam)stateInfo).number);
  60.  
  61.             if (stateInfo != null)
  62.             {
  63.                 //дождемся команды начала работы    
  64.                 ((ThreadParam)stateInfo).oWhenStart.WaitOne();
  65.                 int iRand = (int)Math.Floor(rand.NextDouble() * 1000)+100;
  66.                 try
  67.                 {
  68.                     DSTLCode dCode;
  69.                     PerformanceTimer timer = new PerformanceTimer();
  70.                     timer.StartTimer();
  71.                     //определимся с запросом
  72.                     AskTo whatwedo = ((ThreadParam)stateInfo).askto;
  73.                     switch (whatwedo)
  74.                     {
  75.                         ...
  76.                     }
  77.                      Debug.WriteLine("Thread " +
  78.                         ((ThreadParam)stateInfo).number + " - " + dCode.ToString() + " " +
  79.                         " for '" + iRand.ToString() + "' successed in " + timer.StopTimer().ToString() + " sec");
  80.  
  81.  
  82.                 }
  83.                 catch(Exception e1)
  84.                 {
  85.                     iErrors++;
  86.                     Debug.WriteLine("Thread " +
  87.                         ((ThreadParam)stateInfo).number + " - Ошибка обработки: " + e1.Message);
  88.                 }
  89.                 finally
  90.                 {
  91.                     //передаем информацию о том, что мы завершили работу
  92.                     ((ThreadParam)stateInfo).oEvent.Set();
  93.                 }
  94.             }
  95.         }
  96.     }
Соответственно, для тестирования нужно использовать следующие строки:
Copy Source | Copy HTML
  1. /// <summary>
  2.     /// Проверим, доступны ли сервисы и работают ли они как положено
  3.     /// </summary>
  4.     [TestFixture]
  5.     public class WebTests : MainTests
  6.     {
  7.  
  8.         [Test]
  9.         public void SingleSearch()
  10.         {
  11.             QueueFewRequests(1, AskTo.SM_QUEUE);
  12.         }
  13.  
  14.         [Test]
  15.         public void MultiSearch_Max()
  16.         {
  17.             int workers;
  18.             int currs;
  19.             ThreadPool.GetMaxThreads(out workers,out currs);
  20.             QueueFewRequests(workers, AskTo.SM_QUEUE);
  21.         }
  22.  
  23.     }

Метки:   Категории:S-c.me | Code


blog comments powered by Disqus

Добавить комментарий

Кто я?

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

Последние комментарии

Не отображать

Topbot at FeedsBurner

Облако тэгов

Мои Твиты

Twitter августа 16, 21:21
программа instagramliker обновлена 2018г еще раз http://dlvr.it/Qg7KPW

Twitter августа 15, 18:33
Разбор 2 сезона Рассказ служанки http://dlvr.it/Qg0Qxv https://twitter.com/f1ashr/status/1029798147676037121/photo/1

Twitter августа 14, 10:28
Юпитер для Америки (Юмор от НАСА) http://dlvr.it/QfqqTP https://twitter.com/f1ashr/status/1029313699054477312/photo/1

Twitter августа 14, 10:28
Мелькает число 35 в международных новостях http://dlvr.it/QfqqXV

Twitter августа 10, 23:41
Рейтинг каналов и ботов Телеграмм http://dlvr.it/QfVknB https://twitter.com/f1ashr/status/1028063721153691648/photo/1

Twitter августа 10, 23:41
Facebook потерял спутник во взрыве SpaceX http://dlvr.it/QfVklq https://twitter.com/f1ashr/status/1028063716946792448/photo/1

Twitter августа 10, 23:09
Интернет мемы победили Иисуса http://dlvr.it/QfVdXj https://twitter.com/f1ashr/status/1028055673823670272/photo/1

Twitter августа 10, 23:09
Японское аниме в российских кинотеатрах http://dlvr.it/QfVdV3 https://twitter.com/f1ashr/status/1028055668341661696/photo/1

Twitter августа 10, 23:09
Карта из 500млн. чекинов http://dlvr.it/QfVdQG https://twitter.com/f1ashr/status/1028055661697875968/photo/1

Twitter августа 10, 22:35
Медведь открывает дверь http://dlvr.it/QfVWZY https://twitter.com/f1ashr/status/1028047110791299072/photo/1

Twitter августа 10, 22:01
На батуте в космос http://dlvr.it/QfVNw3

Twitter августа 10, 21:29
Российские дирижабли покарят мир в 2035 году http://dlvr.it/QfVGwd https://twitter.com/f1ashr/status/1028030497220259840/photo/1

Twitter августа 10, 21:29
Skype and Baidu links http://dlvr.it/QfVGyS

Twitter августа 10, 21:29
7 лет аккаунту в твиттере http://dlvr.it/QfVGz9

Twitter августа 8, 09:51
Разбор сериала Экспансия (Пространство) http://dlvr.it/QfBHV6 https://twitter.com/f1ashr/status/1027130062976372736/photo/1

Twitter июля 29, 17:51
Добыча криптовалюты в браузере посетителей сайта http://dlvr.it/Qd94p4 https://twitter.com/f1ashr/status/1023626972050518016/photo/1

Twitter июля 29, 04:45
Танцы человека с роботом http://dlvr.it/Qd6Zmn

Twitter июля 29, 04:45
Казахстан переходит на 2-й этап к демократии http://dlvr.it/Qd6Zmt

Twitter июля 29, 04:45
Проблема монетизации на Ютубе http://dlvr.it/Qd6ZfV https://twitter.com/f1ashr/status/1023429180506009600/photo/1

Twitter июля 29, 04:12
Двенадцать часов на сценарной карте http://dlvr.it/Qd6VJL https://twitter.com/f1ashr/status/1023420876362895361/photo/1

Мой твиттер

Копирайт

Все мысли, высказанные в блоге, являются моим мнением и за это мнение меня никто не забанит! Кроме того, никто не имеет право копировать материалы блога без использования ctrl+C/V!

© Copyright 2008