【问题标题】:Execution time of junit test case varies every time. Why?junit 测试用例的执行时间每次都不一样。为什么?
【发布时间】:2015-06-02 08:10:57
【问题描述】:

我有一套 196 测试方法。这些测试用例的执行时间在我每次运行时都会有所不同。它已经在受控环境中运行,比如说,对于垃圾回收,我将null 包含在teardown() 中。

每次执行测试之前,我还要确保每次启动时 CPU 使用率、内存使用率、磁盘空间、系统负载都相同。

另外,时间变化没有任何特定的顺序。我需要知道为什么我们在再次执行相同的测试用例时没有获得 stable execution time

我在课堂上设置了热身期,使 93 例病例稳定下来。其他情况与数据库连接(读取数据或更新数据库中的数据)有关。每次我运行这些测试用例时是否有可能有相同的执行时间。 (执行时间指junit测试用例执行时间)

【问题讨论】:

  • 还有更多的参数和影响。例如。 CPU 缓存、操作系统缓存……最好重复测试多次并测量总时间。
  • 此主题的必填链接:stackoverflow.com/questions/504103/…
  • 40 秒中有多少?另外,当您说“应用程序服务器的连接”时 --- 是在攻击网络吗?
  • 如果它访问网络,应用服务器的负载是否也是恒定的?您只使用本地网络还是通过 Internet 进行通信?即使它只使用本地网络,它仍然可能受到远程服务器负载/网络负载/交换机/路由器负载/...的高度影响...
  • @tps 你不应该把所有的东西都写在 cmets 中。它属于您的问题,只需编辑它。

标签: java performance junit4 performance-testing


【解决方案1】:

关于 Java 性能,我想到了两个主要方面:

  • 您需要预热 JVM,您的测试被解释为字节码并且受 JVM 支配。这意味着在同一运行期间执行相同的测试多达数千次。
  • JUnit 测试的测量精度不高。事实上,几乎不可能获得准确的性能读数,即使是专门为此构建的库。这就是为什么通常建议对多个样本进行平均的原因。

然而,Reto 建议的这个和其他那些正是可能导致 Java 出现差异的原因。毫秒的变化超出预期。例如,创建一个单元测试,它接受一个线程并将其休眠 10 毫秒。观察您在 7 毫秒到 13 毫秒到 17 毫秒或更长时间内获得的结果。这不是衡量事物的可靠方法。

如果您要连接到网络、将数据上传到数据库等。我不能代表这些,但您还需要考虑这些系统的差异。

我建议将您的三个具有最大差异的测试分成更小的块。尝试找出最大的瓶颈在哪里,然后集中精力优化该操作或一组操作。我认为连接到数据库花费的时间最多,旁边可能是执行查询。但是您应该隔离这些操作的测量以确保这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2015-11-05
    • 2016-02-08
    相关资源
    最近更新 更多