嗯,我遇到了类似的问题。我想在测试结果中报告一些额外的数据/报告/计数器,就像Visual Studio一样,我找到了一个解决方案。
首先,你正在尝试的方式是行不通的。负载测试和单元测试之间没有直接链接,而TestContext存在于单元测试中。
其次,你需要了解Visual Studio如何创建报告。它会收集来自操作系统的性能计数器数据。你可以编辑这些计数器,删除你不想要的,添加你想要的。
如何编辑计数器
负载测试配置有两个基本部分与计数器相关。它们是:
计数器集合。这些是计数器的集合,例如默认添加的agent
。如果您打开此计数器集,您将看到它收集了内存、处理器、物理磁盘等计数器。因此,在测试结束时,您可以看到所有代理的所有这些数据。如果您想向此计数器集添加更多计数器,则可以双击它(从负载测试编辑器中,见下图),选择添加计数器
。这将打开一个窗口,其中包含您系统中的所有计数器,并选择您想要的计数器。
计数器集映射。在此处,您将计数器集与您的计算机关联起来。默认情况下,[控制器计算机]
和[代理计算机]
添加了一些默认的计数器集。这意味着将从您的控制器计算机中收集映射到[控制器计算机]
的计数器集中包含的所有计数器。对于所有代理也适用同样的规则。
![enter image description here](https://istack.dev59.com/3Ms4l.webp)
你可以添加更多的计数器集和更多的机器。通过右键单击
计数器集映射
-->
管理计数器集...
打开一个新窗口,如下所示:
![enter image description here](https://istack.dev59.com/9tKYj.webp)
如您所见,我添加了一个名为
db_1
的额外机器。这是该计算机的计算机名称,必须与控制器处于同一域中,以便访问它并收集计数器。我还将其标记为
数据库服务器
并选择了
sql
计数器集(适用于sql计数器的默认值,但您可以编辑它并添加任何计数器)。现在每次执行此负载测试时,控制器都会转到具有计算机名称db_1的计算机,并收集数据,这些数据将在最终测试结果中报告。
现在是编程部分
好的,在这个(庞大的)介绍之后,现在是时候看看如何将您的数据添加到最终的测试结果中了。为了做到这一点,您必须创建自己的自定义性能计数器。这意味着必须在需要收集这些数据的机器上创建一个新的性能计数器类别。在您的情况下,这是在所有代理商中,因为这是执行UnitTests的地方。
在代理商创建计数器后,您可以像上面所示编辑Agents
计数器集,并选择您的额外自定义计数器。
以下是如何执行此操作的示例代码。
首先,为所有代理商创建性能计数器。仅在每个代理机器上运行此代码一次(或者您可以将其添加到负载测试插件中):
void CreateCounter()
{
if (PerformanceCounterCategory.Exists("MyCounters"))
{
PerformanceCounterCategory.Delete("MyCounters");
}
CounterCreationDataCollection counters = new CounterCreationDataCollection();
counters.Add(new CounterCreationData("Delay", "Keeps the actual delay", PerformanceCounterType.AverageCount64));
PerformanceCounterCategory.Create("MyCounters", "Custom Performance Counters", PerformanceCounterCategoryType.MultiInstance, counters);
}
这是你测试的代码:
[TestClass]
public class UnitTest1
{
PerformanceCounter OverallDelay;
PerformanceCounter PerDelay;
[ClassInitialize]
public static void ClassInitialize(TestContext TestContext)
{
OverallDelay= new PerformanceCounter("MyCounters", "Delay", "Overall", false));
PerDelay= new PerformanceCounter("MyCounters", "Delay", "Per", false));
}
[ClassCleanup]
public void CleanUp()
{
OverallDelay.RawValue = 0;
OverallDelay.EndInit();
OverallDelay.RemoveInstance();
OverallDelay.Dispose();
PerDelay.RawValue = 0;
PerDelay.EndInit();
PerDelay.RemoveInstance();
PerDelay.Dispose();
}
[TestMethod]
public void TestMethod1()
{
Stopwatch overall = new Stopwatch();
Stopwatch per = new Stopwatch();
overall.Start();
for (int i = 0; i < 5; i++)
{
per.Start();
doAction();
per.Stop();
PerDelay.Incerement(per.ElapsedMilliseconds);
Sleep(1000);
per.Reset();
}
overall.Stop();
OverallDelay.Incerement(overall.ElapsedMilliseconds);
}
}
现在,当您的测试被执行时,它们将向计数器报告其数据。在负载测试结束时,您将能够在每个代理机器中查看计数器并将其添加到图表中。它将报告最小值、最大值和平均值。
结论
- 经过数月的研究,我认为这是将测试自定义数据添加到最终负载测试报告中的唯一方法。
- 这可能看起来很难做到。好吧,如果您理解了要点,优化它并不难。我将此功能封装成一个类,以便更容易地初始化、更新和管理计数器。
- 它非常实用。现在我可以看到从默认计数器无法看到的测试统计信息,例如,当 Web 服务的 Web 请求失败时,我可以捕获错误并更新适当的计数器(例如超时、服务不可用、请求被拒绝...)。
希望我能帮到您。:)