在C#/ Forwarding JS变量中读取JS变量到visual studio性能测试?

时间:2013-01-09 08:54:24

标签: c# javascript .net visual-studio-2010 performance

这里的人们正在使用visual studio进行性能测试。现在一些javascript部分存在一些小问题:他们无法使用visual studio web-performance testing来检查javascript部分的性能。

我从未使用过visual studio性能测试,所以我真的不知道如何在那里替补,但我看到有很多web + js性能检查的解决方案。我以为我们可以使用其他工具和框架,但不允许这样做。这里的人们想要将视觉工作室用于一切。所以这让事情变得更加棘手。

如果我必须检查javascript性能,我会轻易做到这样的事情:

var begin = new Date();
functionA();
functionB();
functionX();
var end = new Date();
var bench = end - begin;

最后,我可以在变量bench中看到我的结果。现在我只需要将这个变量“以某种方式”传递给visual studio性能测试?通过C#?或者这些东西是如何工作的?这是一个很好的解决方案吗?还有其他想法吗?

4 个答案:

答案 0 :(得分:5)

我认为这是不可能的,因为VS Performance Test Engine根本不运行任何客户端代码,它仅适用于HTTP级别。因此,您作为示例提供的代码永远不会运行。

在这里查看证明 - http://msdn.microsoft.com/en-us/library/ff520100.aspx

  

因为Web性能测试引擎在HTTP层工作,所以它   不运行JavaScript或ActiveX等客户端脚本   控制。 Web性能测试涉及生成负载   服务器..因此,客户端脚本只影响   Web页面的外观对Web性能并不重要   测试。设置参数值或结果的客户端脚本   其他HTTP请求(例如AJAX)确实会影响其上的负载   服务器,可能需要您手动修改Web性能   测试以模拟脚本。

     

一个常见的误解是因为录制发生在互联网上   资源管理器和Web性能测试结果查看器显示结果   在浏览器控件中,Web性能测试必须以某种方式执行使用   IE浏览器。不是这种情况。所有请求都已执行   直接使用Web性能测试引擎;没有互动   发生Internet Explorer或任何其他浏览器。网络性能   测试引擎使用直接与目标Web服务器通信   标准的HTTP请求/响应消息。

因此,唯一的方法是使用其他解决方案来检查javascript性能,或者基于Selenium实现自己的性能。我认为可以使用Selenium RC自动执行此类测量,Selenium RC可以作为构建的一部分从Visual Studio运行(如果您的要求是将Visual Studio用于所有内容)。

答案 1 :(得分:2)

当然这可行,但我不确定它是否能直接与VS性能测试相结合。如果你渴望与C#和VS集成,那么另一种选择就是创建自己的。

在这种情况下,问题将导致如何桥接JS和C#。如果您将JS嵌入页面然后使用WebBrowser控件运行它,则可以使用.NET平台完成此操作。在您的javascript中,您可以通过引用window.external将信息传递回C#应用程序。以下是javascript中的示例:

window.external.performanceCallback([yourdata]); 

在容纳WebBrowser控件的类中调用performanceCallback()方法。但是,在您可以这样做之前,您必须使您的班级对您的webbrowser正在打开的页面可见(window.external是您正在引用的实例类)。

所以,设置window.external,当你在C#中创建webBrowser时:

webBrowser1.ObjectForScripting = this;

此外,您必须使用ComVisible属性

标记该类
[ComVisible(true)]

提醒一下,WebBrowserControl 取决于您在计算机上安装的IE上的版本。所以在版本控制时要小心,javascript只会执行他/她的IE版本可以处理的程度。确保你的JS在所有合理的IE版本上运行。

答案 2 :(得分:1)

您无法直接监控JavaScript,但您可以定期使用JavaScript来调用带有时间详细信息的C#Web服务。 (当然,这会增加额外的开销,这肯定会使结果产生偏差,并且可能会使整个目的无效。如果您在局域网上进行此测试,则应该稍微减轻延迟。)

的JavaScript

var log = function (message) {
    $.ajax('/path/to/log', {
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({message:message})
    });
}
// then just call it like so in appropriate places: log('started foo at 12:34:56');

C#:

asmx服务或MVC控制器或接受ajax帖子的任何内容

答案 3 :(得分:0)