Ответ 1
Хорошо, у меня была аналогичная проблема. Я хотел сообщить некоторые дополнительные данные/отчеты/счетчики из моих тестов в итоговый результат теста, как это сделала Visual Studio, и я нашел решение.
Во-первых, это невозможно сделать так, как вы пытаетесь. Прямой связи между испытанием нагрузки и Unit Test, где существует TestContext, нет прямой связи.
Во-вторых, вы должны понять, как визуальная студия создает отчеты. Он собирает данные из счетчиков производительности ОС. Вы можете редактировать эти счетчики, удалять те, которые не хотите, и добавлять другие, которые вы хотите.
Как редактировать счетчики
Конфигурация тестового теста нагрузки имеет два основных раздела относительно счетчиков. Это:
-
Counter Sets
. Это набор счетчиков, напримерagent
, который добавляется по умолчанию. Если вы откроете этот счетчик, вы увидите, что он собирает счетчики, такие как Memory, Processor, PhysicalDisk e.t.c. Итак, в конце теста вы можете увидеть все эти данные у всех ваших агентов. Если вы хотите добавить больше счетчиков в этот счетчик, вы можете дважды щелкнуть по нему (из редактора тестовых нагрузок, см. Рисунок ниже) и выбрать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.
Заключение
- Я думаю (после нескольких месяцев исследований), что это единственный способ добавить пользовательские данные из ваших тестов в отчет об окончательной нагрузке.
- Это может показаться слишком трудным. Ну, если вы понимаете, что это не сложно оптимизировать. Я обернул эту функциональность в классе, чтобы легче было инициализировать, обновлять и в конце концов управлять счетчиками.
- Это очень полезно. Теперь я могу видеть статистические данные из моих тестов, что это будет невозможно с помощью счетчиков по умолчанию. Такие, когда веб-запрос к веб-службе терпит неудачу, я могу поймать ошибку и обновить соответствующий счетчик (например, Timeout, ServiceUnavailable, RequestRejected...).
Надеюсь, я помог.:)