性能测试与单元测试的区别

13

我正在阅读Osherove的《单元测试的艺术》,尽管他还没有涉及性能测试,但仍有两个想法浮现在我脑海中:

  • 通常性能测试不能是单元测试,因为性能测试通常需要长时间运行。
  • 通常性能测试不能是单元测试,因为性能问题往往在集成或系统级别上表现出来(或者至少需要单元测试的逻辑重现集成环境的性能,这将太复杂而无法成为单元测试)。

特别是针对上述第一个原因,我怀疑性能测试是否由单元测试框架(如NUnit)处理是没有意义的。

我的问题是:我的发现/倾向是否与社区的想法相符?

8个回答

6

我同意你的发现和学习成果。真正的单元测试只测试系统的一部分,而忽略、模拟或伪造其他部分的必要性。集成测试(或回归测试)测试大多数或所有单位之间的协作,这才是真正的性能衡量标准。


1
我经常将系统范围的测试称为“功能测试”。我不知道这是否符合“行业”的标准,但在我们公司中,这个术语已经被使用了。然而,要实现这一点有些棘手,因为我们需要一些“外部”系统来驱动应用程序。该应用程序运行在专用硬件上,输入来自于定制端口,这些端口无法直接从主机PC驱动。但最终它绝对是值得的。 - dash-tom-bang

4

在某些情况下,您可以使用单元测试来确保操作在一定时间内完成。如果您想向操作添加更多功能,但不想牺牲性能,您可以使用单元测试来断言。当然,这些单元测试是依赖于机器的,但您可以将一些额外的变量或配置加入方程中。


3

性能测试很可能由单元测试组成。

例如,一个单元测试可以将多个不同的参数传递给一个方法,并验证该方法返回预期的输出。性能测试可以执行该单元测试1000次(或者您认为有意义的其他值),同时记录从CPU和内存计数器到每个测试所需时间的所有内容。


3
我同意性能测试不能作为单元测试,但我们可以有另一组被称为性能测试的测试。总体来说,这些测试分为两类:
a) 单元测试
b) 集成测试
我们对真实数据库运行集成测试(而不是在内存中),以确保 SQL 脚本和 Hibernate 存储库按预期工作。
我的想法是,我们可以添加另一组名为性能测试的测试,这些测试是每晚构建的一部分,用于测试某些函数的性能。这很重要,以跟踪代码重构后的统计数据,或者评估应用程序的一个部分的更改是否会对另一个部分产生意外后果。
我了解到 JunitPerf 可能会帮助我实现这个目标。

2

单元测试应该在很短的时间内执行,因为您只测试一个非常具体的单元/系统。比如,如果您要测试的系统是ClassA:IClassA,则进行模拟/存根并仅测试ClassA的行为,而不应测试除ClassA之外的其他行为,例如ClassA是否使用ClassB。您应该注入ClassB的模拟而不是具体实现以实现此目的。

就性能测试而言,仍然有必要使用像NUnit / MBUnit / MavenThought这样的测试框架,只需将这些测试保存在单独的程序集中,并且不要将其作为单元测试的一部分调用。

因此,如果您使用Rake来调用测试,则其中一些任务可能如下所示:

Rake Test:All         #Run all unit tests
Rake Test:Acceptance  #Run all acceptance tests
Rake Test:Performance #Run all performance tests
Rake Test:Integration #Run all integration tests

在您的持续集成中,成功构建后总是会调用Test:All进行测试,而Test:Performance则每天在凌晨12点调用。


我喜欢你说的话,但是我需要运行的性能测试实际上是集成测试,比如客户端和服务器之间的通信速度。请纠正我,但是我认为单元测试框架并没有准备好部署客户端和服务器代码,分别启动它们,并提供客户端在打击服务器时所看到的结果。 - Brent Arias
你可以将服务器实现构建并部署到指定位置(虚拟机或远程服务器),然后所有性能/集成测试将针对该位置执行。有用于部署安装的软件包。 - Sean B

1

一切都取决于你所谓的性能测试。当微调特定代码时,我通常使用非常类似于单元测试的东西(我应该称其为单元性能测试吗?)。这基本上就是我在这个question中所做的事情(尽管在那里并不真正关心使用单元测试框架)。但我也会在BOOST单元测试框架中优化我的C++生产代码。

实际上,在不同级别和不同目的下有许多种性能测试(重载压力测试、分析、微调)。你在问题中提到的性能测试似乎是在功能测试级别进行的。对于这个级别,你可能不会使用单元测试框架。


0

单元测试和性能测试之间存在明显的差异。首先,单元测试是针对应用程序的功能要求进行的测试。例如,你希望确保点击“主页”选项卡时网页会导航到主页。而性能测试则是一种非功能性测试。在这里,你关注的是应用程序在特定用户负载和一定时间内的稳定性和响应能力。


0

我记得多年前,微软倡导程序员使用Visual Studio Net Application Center Test (ACT) 对他们的单个asp进行性能测试。有一个完整的方法论用于对单个asp执行事务成本分析(TCA)。(现在可能还在使用中)。

即使使用Web driver,也可以使用这种方法来测试这些asps,并使用可选的模拟对象来隔离要测试的代码(例如模拟数据库访问,如果尚未开发)。

只要您有一个驱动程序,以及可选的模拟对象框架来处理任何尚未编写的依赖项,就可以使用任何单元测试遵循此方法。这种方法也变得流行起来,如SOAPUI\LOADUI。

另外,我建议将可以针对给定数据库设计进行测试(优化)的单个SQL语句隔离出来。这(DB)SQL单元性能测试可以在SDLC早期进行,它会发现查询优化机会。

就成本和价值而言:我发现在SDLC早期使用适当的模拟对象进行早期单元性能测试将识别出内存泄漏、过度CPU使用和磁盘IO,但我会为高风险项目选择测试代码。


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