6

这里的人们正在使用 Visual Studio 进行性能测试。现在一些 javascript 部分存在一些小问题:他们无法通过 Visual Studio Web 性能测试来检查 javascript 部分的性能。

我从未使用过 Visual Studio 性能测试,所以我真的不知道如何在那里进行测试,但我看到有很多用于 web + js 性能检查的解决方案。我以为我们可以使用其他工具和框架,但这是不允许的。这里的人们想在所有事情上都使用 Visual Studio。所以这让事情变得更加棘手。

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

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

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

4

4 回答 4

5

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

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

因为 Web 性能测试引擎在 HTTP 层工作,所以它不会像 JavaScript 或 ActiveX 控件那样运行客户端脚本。Web 性能测试与在服务器上产生负载有关。因此,仅影响网页外观的客户端脚本对 Web 性能测试并不重要。设置参数值或导致额外 HTTP 请求(如 AJAX)的客户端脚本确实会影响服务器上的负载,并且可能需要您手动修改 Web 性能测试以模拟脚本。

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

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

于 2013-01-13T01:33:14.127 回答
2

当然这可以工作,但我不确定它是否可以直接与 VS 性能测试桥接。如果您渴望与 C# 和 VS 集成,另一种选择可能只是创建自己的。

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

window.external.performanceCallback([yourdata]); 

在包含 WebBrowser 控件的类中调用 performanceCallback() 方法。但是,在您这样做之前,您必须使您的类对您的网络浏览器正在打开的页面可见(window.external 是您正在引用的实例类)。

因此,要设置 window.external,当您在 C# 中创建 webBrowser 时:

webBrowser1.ObjectForScripting = this;

此外,您必须使用 ComVisible 属性标记该类

[ComVisible(true)]

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

于 2013-01-13T06:57:47.640 回答
1

您无法直接监控 JavaScript,但您可以让 JavaScript 定期调用具有计时详细信息的 C# Web 服务。(当然,这会增加额外的开销,这肯定会扭曲结果,并可能否定整个目的。如果您在 LAN 上进行此测试,延迟应该会有所缓解。)

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 帖子的东西

于 2013-01-19T18:52:39.063 回答
0

不可能,请检查http://msdn.microsoft.com/en-us/library/ff520100.aspx

于 2013-01-18T07:50:02.463 回答