Ну у меня была аналогичная проблема. Я хотел сообщить о некоторых дополнительных данных/отчетах/счетчиках из моих тестов в конечном результате теста, как это делает Visual Studio, и я нашел решение.
Во-первых, это невозможно сделать так, как вы пытаетесь. Между нагрузочным тестом и модульным тестом, где существует TestContext, нет прямой связи.
Во-вторых, вы должны понимать, как визуальная студия создает отчеты. Он собирает данные со счетчиков производительности . ОС. Вы можете редактировать эти счетчики, удалять ненужные и добавлять нужные.
Как редактировать счетчики
Конфигурация нагрузочного теста состоит из двух основных разделов, касающихся счетчиков. Это:
Counter Sets
. Это наборы счетчиков, например agent
, который добавляется по умолчанию. Если вы откроете этот набор счетчиков, вы увидите, что он собирает такие счетчики, как память, процессор, физический диск и т. д. Итак, в конце теста вы можете увидеть все эти данные со всех ваших агентов. Если вы хотите добавить больше счетчиков в этот набор счетчиков, вы можете дважды щелкнуть по нему (в редакторе нагрузочных тестов, см. рисунок ниже) и выбрать Add Counters
. Это откроет окно со всеми счетчиками вашей системы и выберите те, которые вы хотите.
Counter Set Mappings
. Здесь вы связываете наборы счетчиков с вашими машинами. По умолчанию [CONTROLLER MACHINE]
и [AGENT MACHINES]
добавляются с некоторыми наборами счетчиков по умолчанию. Это означает, что все счетчики, содержащиеся в наборах счетчиков, сопоставленных с [CONTROLLER MACHINE]
, будут собраны с вашего контроллера. То же самое относится ко всем вашим агентам.
Вы можете добавить больше наборов счетчиков и больше машин. Щелкнув правой кнопкой мыши на Counter Set Mappings
--> Manage Counter Sets...
, откроется новое окно, как показано ниже:
Как видите, я добавил дополнительную машину с именем db_1
. Это имя компьютера машины, и он должен находиться в одном домене с контроллером, чтобы иметь к нему доступ и собирать счетчики. Я также пометил его как database server
и выбрал набор счетчиков sql
(по умолчанию для счетчиков sql, но вы можете отредактировать его и добавить любой счетчик, который хотите). Теперь каждый раз, когда выполняется этот нагрузочный тест, контроллер будет обращаться к машине с именем компьютера db_1 и собирать данные, которые будут представлены в окончательных результатах теста.
Теперь кодовая часть
Хорошо, после этого (большого) вступления пришло время посмотреть, как добавить ваши данные в окончательные результаты теста. Для этого необходимо создать собственные пользовательские счетчики производительности а>. Это означает, что новая категория счетчика производительности должны быть созданы машины, необходимые для сбора этих данных. В вашем случае во всех ваших агентах, потому что именно здесь выполняются UnitTests.
После того, как вы создали счетчики в агентах, вы можете отредактировать набор счетчиков Agents
, как показано выше, и выбрать дополнительные настраиваемые счетчики.
Вот пример кода о том, как это сделать.
Сначала создайте счетчики производительности для всех ваших агентов. Запустите этот код только один раз на каждом компьютере с агентом (или вы можете добавить его в плагин загрузки теста):
void CreateCounter()
{
if (PerformanceCounterCategory.Exists("MyCounters"))
{
PerformanceCounterCategory.Delete("MyCounters");
}
//Create the Counters collection and add your custom counters
CounterCreationDataCollection counters = new CounterCreationDataCollection();
// The name of the counter is Delay
counters.Add(new CounterCreationData("Delay", "Keeps the actual delay", PerformanceCounterType.AverageCount64));
// .... Add the rest counters
// Create the custom counter category
PerformanceCounterCategory.Create("MyCounters", "Custom Performance Counters", PerformanceCounterCategoryType.MultiInstance, counters);
}
А вот код вашего теста:
[TestClass]
public class UnitTest1
{
PerformanceCounter OverallDelay;
PerformanceCounter PerDelay;
[ClassInitialize]
public static void ClassInitialize(TestContext TestContext)
{
// Create the instances of the counters for the current test
// Initialize it here so it will created only once for this test class
OverallDelay= new PerformanceCounter("MyCounters", "Delay", "Overall", false));
PerDelay= new PerformanceCounter("MyCounters", "Delay", "Per", false));
// .... Add the rest counters instances
}
[ClassCleanup]
public void CleanUp()
{
// Reset the counters and remove the counter instances
OverallDelay.RawValue = 0;
OverallDelay.EndInit();
OverallDelay.RemoveInstance();
OverallDelay.Dispose();
PerDelay.RawValue = 0;
PerDelay.EndInit();
PerDelay.RemoveInstance();
PerDelay.Dispose();
}
[TestMethod]
public void TestMethod1()
{
// Use stopwatch to keep track of the the delay
Stopwatch overall = new Stopwatch();
Stopwatch per = new Stopwatch();
overall.Start();
for (int i = 0; i < 5; i++)
{
per.Start();
doAction();
per.Stop();
// Update the "Per" instance of the "Delay" counter for each doAction on every test
PerDelay.Incerement(per.ElapsedMilliseconds);
Sleep(1000);
per.Reset();
}
overall.Stop();
// Update the "Overall" instance of the "Delay" counter on every test
OverallDelay.Incerement(overall.ElapsedMilliseconds);
}
}
Теперь, когда ваши тесты будут выполняться, они будут сообщать счетчику свои данные. В конце нагрузочного теста вы сможете увидеть счетчик на каждой машине агента и добавить его на графики. Это будет сообщено со значениями MIN, MAX и AVG.
Вывод
- Я думаю (после нескольких месяцев исследований), что это единственный способ добавить пользовательские данные из ваших тестов в окончательный отчет о нагрузочном тесте.
- Это может показаться слишком сложным. Ну если вы понимаете суть то оптимизировать не сложно. Я обернул эту функциональность в класс, чтобы было проще инициализировать, обновлять и, в конце концов, управлять счетчиками.
- Это очень очень полезно. Теперь я могу видеть статистику своих тестов, что было бы невозможно со счетчиками по умолчанию. Например, когда веб-запрос к веб-службе терпит неудачу, я могу поймать ошибку и обновить соответствующий счетчик (например, тайм-аут, ServiceUnavailable, RequestRejected...).
Надеюсь, я помог. :)
person
chaliasos
schedule
14.06.2013