1

我希望能够在一组性能测试中编写一个单元测试,该测试与模拟问题并失败的快速功能测试不同,纠正问题以使测试通过。例如,当执行时间限制为 20 毫秒时,如果超过 20 毫秒,则测试必须失败,否则通过。如果我想设置内存消耗限制并且如果消耗超过限制,那么测试必须失败。我是否可以编写具有内存消耗约束的测试?

4

2 回答 2

3

一个程序的总使用/空闲内存可以在程序中通过java.lang.Runtime.getRuntime().

运行时有几个与内存相关的方法。

以下编码示例演示了它的用法。

package test;

import java.util.ArrayList;
import java.util.List;

public class PerformanceTest {
  private static final long MEGABYTE = 1024L * 1024L;

  public static long bytesToMegabytes(long bytes) {
    return bytes / MEGABYTE;
  }

  public static void main(String[] args) {
    // I assume you will know how to create a object Person yourself...
    List<Person> list = new ArrayList<Person>();
    for (int i = 0; i <= 100000; i++) {
      list.add(new Person("Jim", "Knopf"));
    }
    // Get the Java runtime
    Runtime runtime = Runtime.getRuntime();
    // Run the garbage collector
    runtime.gc();
    // Calculate the used memory
    long memory = runtime.totalMemory() - runtime.freeMemory();
    System.out.println("Used memory is bytes: " + memory);
    System.out.println("Used memory is megabytes: "
        + bytesToMegabytes(memory));
  }
} 

用于System.currentTimeMillis()获取开始时间和结束时间并计算差值。

class TimeTest1 {
  public static void main(String[] args) {

    long startTime = System.currentTimeMillis();

    long total = 0;
    for (int i = 0; i < 10000000; i++) {
      total += i;
    }

    long stopTime = System.currentTimeMillis();
    long elapsedTime = stopTime - startTime;
    System.out.println(elapsedTime);
  }
} 
于 2013-03-16T17:08:03.930 回答
2

对于时序约束,您可以使用@org.junit.rules.Timeout(尽管它可能不是规则的含义)或编写您自己的变体。对于内存限制,您可以编写一个org.junit.rules.TestRule比较测试前后的内存使用情况。衡量内存使用情况的两种方法是java.lang.Runtime类和 JMX。

由于性能取决于许多因素(CI 服务器的负载、已jit 多少代码等),因此结果是否足够具有决定性/稳定性还有待观察。多次运行测试并比较平均值可能是个好主意。

于 2013-02-18T10:46:53.513 回答