[visual-studio]是否可以在 Visual Studio 中创建单元测试/LoadTest 的自定义 TestContext 计时器吗?

标签: Visual-Studio
发布时间: 2014/3/1 4:00:38
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我的 UnitTests 只有少数有睡一觉,在一个循环中定义。我想不只是每个配置文件的测试,但是为了显示任何非线性缩放的所有迭代的总体时间迭代。例如,如果我配置文件"整体",它包括睡眠的时间。我可以使用 Stopwatch 启动停止使其只包含 doAction()。然而,我不能将秒表结果写入 TestContext 结果。

[TestMethod]
    public void TestMethod1()
    {
        TestContext.BeginTimer("Overall");
        for (int i = 0; i < 5; i++)
        {
            TestContext.BeginTimer("Per");
            doAction();
            TestContext.EndTimer("Per");
            Sleep(1000);
        }
        TestContext.EndTimer("Overall");
    }

看来 TestContext 可以进行继承和重新定义。然而,我不看任何例子,说明如何写这回的交易记录存储。

这个可以参考,或另一个想法是没有实现。我想看到它在同一报告中,Visual Studio 显示为 LoadTest。否则我要写我自己的报告。

另外,我曾尝试嗅探的 SQL 写这些到 LoadTest 的数据库,但不是成功的在弄清楚如何。应该有存储过程调用,但我想这所有的数据在测试结束。

解决方法 1:

我有一个类似的问题。我想要报告一些额外的数据/报告/计数器从我的测试中,最终的测试结果中,像 Visual Studio 不会和发现了一种解决方案。

第一,这不能与您尝试的方式完成。有负载测试和单元测试 TestContext 存在的地方之间没有直接的联系。

第二,你要明白如何 visual studio 创建报告。它从性能计数器的操作系统收集数据。您可以编辑这些计数器,删除那些你不想要和添加其他你想要的人。

如何编辑计数器

负载测试配置有两个基本部分关于计数器。这些都是:

  • Counter Sets。这些都是集的计数器,例如 agent ,默认添加。如果你打开你会看到它收集计数器 (例如内存、 处理器、 物理磁盘等此计数器集所以,在测试结束你可以看到所有这些数据从您的所有代理。如果您想要添加更多计数器到此计数器设置你可以双击它 (从负载测试编辑器中,见下面的图片),并选择 Add Counters 。这将打开一个窗口,与您的系统的所有计数器和选择你想要的那些。

  • Counter Set Mappings。在这里你用你的机器将关联的计数器集。默认情况下 [CONTROLLER MACHINE][AGENT MACHINES] 与一些默认的计数器集添加。这意味着,所有的计数器中的计数器集,映射到包含 [CONTROLLER MACHINE] 将从您的控制器机器收集。这同样适用于您的所有代理。

enter image description here

您可以添加更多的计数器集和更多的机器。通过右击 Counter Set Mappings --> Manage Counter Sets... 打开一个新窗口,如下所示:

enter image description here

正如您所看到的我已经添加额外的机器名称 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);
     }
}

现在,您的测试执行时,他们将报告向柜台他们的数据。在负载测试结束时,你将能够看到每个代理计算机中的计数器并将其添加到关系图。它将与最小、 最大和平均客房租金值报告。

结论

  1. 我认为 (经过数月的研究) 这是唯一的方法,以将自定义数据从您的测试添加到最终负载测试报告。
  2. 它可能似乎很难做到的。嗯,如果你明白点不难它进行优化。一类的要容易些,初始化,更新并在所有管理计数器之后,我有换行此功能。
  3. 这是非常非常有用。我现在可以从我的测试中它将不可能与默认的计数器来查看统计信息。这种美国到 web 服务的 web 请求失败时,我可以捕获错误,并更新相应的计数器 (例如超时,ServiceUnavailable,RequestRejected...)。

我希望我的帮助。:)

官方微信
官方QQ群
31647020