.NET通用性能测试框架

10
我有一个用C#/.NET 3.5编写的客户端/服务器应用程序,我想对其进行一些性能测试。我一直在寻找一个通用框架来帮助我,但没有太多运气。我想要一个可以管理一组客户端并根据某些设置为它们执行随机操作的东西,并记录相关数据以帮助我确定系统的粗略阈值,例如:我可以支持每秒执行x个动作的n个用户。
我会编写特定于我的应用程序的代码来执行以下任务:
- 登录/注销客户端。 - 向服务器发送消息以执行各种操作。 - 记录服务器的确认和其他消息。 - 测量特定于系统的统计信息。
我希望该框架能够采取一组参数来描述测试场景,例如:
- 在给定时间内登录的客户端数量。 - 为每个客户端执行给定数量的操作。
然后它将运行场景,管理和跟踪所有用户和操作,并汇总所有数据。(这是我试图避免编写的无聊部分...)理想情况下,它应该有一些通用的测量功能,例如消息发送和接收响应之间的时间间隔,但如果没有,我也可以自己编写。
我不想对我的代码进行任何分析,我可以在以后运行这些测试时附加分析器。相反,我想对我的系统做出一些粗略的结论,即在它崩溃之前可以扔多少用户。 (如果有比“性能测试”更好的术语,请告诉我...也许是压力测试?)
我意识到我在这里没有给出太多具体信息。我认为这是一个相当普遍的情况-我相信有很多客户端/服务器系统需要进行类似的测试。我找到了许多用于执行类似操作的基于Web的框架,但它们似乎非常依赖于Web且不容易适用于非HTTP的系统。

有人知道有什么可以帮忙的吗?我的搜索还没有找到任何东西。需要指出的是,我在可预见的未来将被困在Visual Studio 2008专业版中,因此如果2010可以做到这一点,对我来说就不合适了。我猜它不一定是.NET框架,只要我仍然可以相对容易地插入我的.NET代码即可。

编辑为了明确,我的应用程序不是网站,而是一个Windows窗体客户端应用程序,通过自定义协议连接到.NET服务。我可以编写代码执行相关的客户端操作,我只需要一个框架来放置它。


你看过关于 .Net Profilers 的这个问题吗?https://dev59.com/FnVD5IYBdhLWcg3wXaYd - TheLukeMcCarthy
我不想进行分析,如果我发现有问题,我以后可以做。我更关心的是测量我的系统可以承载多少用户。 - MrKWatkins
7个回答

6
您要查找的关键词是“分布式测试”。Smart Bear有一个名为TestComplete的产品,支持分布式测试。不过,我认为它不能在单台机器上运行多个客户端实例(也许可以,但我猜这样做不是一个好主意,因为它会影响性能结果)。他们还有一个名为LoadUI的开源项目,它是为了与SoapUI集成而构建的,但是您可能能够将其连接到自己的客户端测试工具上。我不知道这需要花费多少努力。
这些是我所知道的工具,但是还有更多分布式测试工具可用。虽然大部分确实是用于基于Web的测试,但它们通常足够可扩展,可以启动不同的(基于GUI的)测试框架(我最喜欢的是QAliber),以在客户端应用程序上运行测试。

很棒 - 现在知道更好的术语,找东西容易多了!我会看看TestComplete - 根据他们网站上的介绍,它似乎可以做我想要的事情。 - MrKWatkins
看起来TestComplete可能不太适合我,因为它似乎更适用于记录点击等操作,而我需要一些客户端通过API连接。我会继续寻找,但可能会退而求其次,自己编写代码...还是感谢您的答案-正中要害。 - MrKWatkins

4
据我的了解,目前不存在这样的框架(并且很可能不会有,因为每个人和不同项目的情况都是如此不同)。因为“性能”对于不同的人和不同的项目意味着不同的事情,所以你通常需要自己开发。值得庆幸的是,随着.NET4和TPL的出现,这比以往任何时候都更容易了。
性能测试需要涵盖三个方面:
1. 定义“负载”; 2. 测量“性能”; 3. 评估结果。
正如你可以想象的那样,这两个都是非常灵活的定义。负载可以用每秒请求、已登录用户等来衡量... 性能可以通过响应时间、内存使用等来衡量... 你懂的。
因此,你的第一步是定义一个“单元负载”,以便你可以轻松地扩展它。例如,你可以创建一个ClientUnitLoad类,模拟客户端,并定期执行针对你的服务的操作。TPL使得缩放你的ClientUnitLoad变得容易(当然,你受到硬件限制的约束)。
下一步是测量性能。如何测量很大程度上取决于您想要收集的指标:简单的秒表计时在90%的情况下都可以,但只能测量时间。构建自定义跟踪和指标收集基础设施绝对值得,因为您在生产中也需要它来验证您的系统在真实世界中的表现是否符合预期。
最后一步是评估您的指标。性能测试的最大问题是:a)它们速度慢,b)不可靠。这是无法避免的。通常,您需要大样本量(重复测试运行)和某种统计分析来忽略异常值。然后应将处理后的结果与可配置的性能基线进行比较。
根据所需的复杂程度,该性能基线可能具有简单的接受标准(例如:响应时间低于100ms)或高级、特定的标准(例如:当登录用户数量为10 vs. 1时,响应时间不会降低超过10%)。

遗憾的是,这正是我试图避免编写的全部内容!(我知道我很懒...)鉴于有许多网络框架可以放置特定于您的应用程序的代码,我希望有一个非网络框架可供使用,可以为我完成大部分工作。 - MrKWatkins

1

这只是用于测试网站的,我的是一个Windows窗体应用程序。 - MrKWatkins

1

很难说是否有针对这种特定目的的测试框架,但也许您可以使用一个简单的控制台应用程序(因为主要想法是测试服务器性能)?您可以在不同的线程中多次调用服务器,并使用例如 Stopwatch类来测量响应时间。

或者,您可以尝试通过增加调用次数来超载服务(可能服务会在线程池耗尽线程之前变慢?)。


我可以自己编写代码来进行测量,但我希望有一个已经完成这项工作的框架。 - MrKWatkins

0

我之前在一个客户端/服务器应用程序中使用Microsoft Visual Studio Load Test进行了一些性能测试。

当你将单元测试添加到负载测试中时,你可以测试非基于 Web 的服务器组件的性能。

你必须将你的负载生成器编码为“Visual Studio 单元测试”,这样以后才能将它们添加到负载测试项目中。


0

你发给我的链接只适用于网站性能测试,而我的应用程序并不是一个网站。 - MrKWatkins
如果有帮助的话,请查看这个链接:http://msdn.microsoft.com/en-us/library/ms243153.aspx 这里是框架使用的示例:http://blogs.msdn.com/b/edglas/archive/2006/02/06/525614.aspx - Mohit Bhandari
1
我也没有终极版。 :( - MrKWatkins

0

我目前不需要代码层面的剖析,而是更一般性的度量,比如“我的系统能够承载多少用户”。 - MrKWatkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接