性能测试与单元测试

时间:2010-05-20 00:24:33

标签: performance unit-testing

我正在阅读Osherove的“单元测试艺术”,尽管我还没有看到他对性能测试说些什么,但我仍然想到了两个想法:

  • 性能测试通常不能进行单元测试,因为性能测试通常需要长时间运行。
  • 性能测试通常不能进行单元测试,因为性能问题经常出现在集成或系统级别(或者至少重新创建集成环境性能所需的单个单元测试的逻辑也是如此参与单元测试。)

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

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

8 个答案:

答案 0 :(得分:5)

我同意你的发现/学习。真正的单元测试只测试系统的一部分,根据需要忽略,嘲弄或伪造其余部分。集成测试(或回归测试)测试大多数或所有单元协同工作,这是性能的真正衡量标准。

答案 1 :(得分:4)

在某些情况下,您可以使用单元测试来确保操作在特定时间段内完成。如果要为操作添加更多功能,但又不想牺牲性能,可以使用单元测试来断言。当然,这些单元测试与机器有关,但您可以在等式中添加一些额外的变量或配置。

答案 2 :(得分:3)

我同意性能测试不能进行单元测试,但我们没有理由不能进行另一组称为性能测试的测试。 从广义上讲,测试分为两类

a)单元测试

b)整合测试

我们再次运行集成测试真实数据库(而不是内存)以确保sql脚本,hibernate存储库按预期工作

我的想法是我们可以添加另一组称为性能测试的测试,这些测试是夜间构建的一部分,用于测试某些功能的性能。这对于在代码重新分解后跟踪统计信息或评估应用程序的某个部分的更改是否会对另一个部分产生意外后果非常重要。

我遇到了JunitPerf这可能有助于我实现这一目标。

答案 3 :(得分:2)

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

例如,单元测试可能会将几个不同的参数抛出到方法中,并验证该方法是否返回预期的输出。性能测试可能会执行1000次单元测试(或任何对你有意义的值),同时记录从CPU和内存计数器到每次测试所花费的时间。

答案 4 :(得分: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点调用一次。

答案 5 :(得分:1)

所有这些都取决于您所谓的性能测试。当微优化特定代码时,我通常使用与单元测试非常相似的东西(我应该称之为单元性能测试?)。这基本上就是我在question中做的事情(尽管不关心真正使用单元测试框架)。但我也在BOOST单元测试框架中优化我的C ++生产代码。

确实存在多种不同级别和不同目的的性能测试(重载压力测试,分析,微优化)。您在问题中谈到的性能测试似乎处于功能测试级别。无论如何,您可能不会使用单元测试框架的级别。

答案 6 :(得分:0)

我记得多年前微软主张程序员使用Visual Studio Net Application Center Test(ACT)对他们的个人asp进行性能测试。 (可能还有)用于对各个asp执行交易成本分析(TCA)的整个方法。也就是说,可以使用Web驱动程序和可能的模拟对象来测试这些asps,以隔离测试中的代码(如果没有开发,则模仿数据库访问)。

如果您有一个驱动程序,并且可选地还有一个模拟对象框架来处理尚未编写的任何依赖项,则可以使用任何单元测试。这种方法在SOAPUI \ LOADUI中也很流行。此外,我建议隔离可针对给定数据库设计进行测试(优化)的单个SQL语句。这个(DB)SQL单元性能测试可以在SDLC的早期完成,它将发现查询优化机会。

在成本和价值方面:我发现早期的UNIT性能测试,在适当的情况下使用模拟对象,将在SDLC的早期识别内存泄漏和过多的CPU使用率和磁盘IO,但我会在测试中“挑选”代码对于风险较高的物品。

答案 7 :(得分:0)

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