Модульное тестирование Java с ограничением потребления памяти

Я хочу иметь возможность написать модульный тест в наборе тестов производительности, который отличается от быстрых функциональных тестов, которые моделируют проблему и дает сбой, исправить проблему так, чтобы тест прошел. Например, если ограничение по времени выполнения составляет 20 миллисекунд, тест должен завершиться неудачей, если в противном случае пройдет более 20 мсек. А что, если я хочу установить ограничение на потребление памяти, а если потребление превышает ограничение, тест должен завершиться неудачей. Возможно ли, что я могу написать тест с ограничением потребления памяти?

2 ответа

Решение

Для ограничения времени вы можете использовать @org.junit.rules.Timeout (хотя это, вероятно, не то, для чего предназначено правило) или напишите свой собственный вариант. Для ограничения памяти вы можете написать org.junit.rules.TestRule который сравнивает использование памяти до и после теста. Два способа измерения использования памяти являются java.lang.Runtime класс и JMX.

Поскольку производительность зависит от многих факторов (загрузка CI-сервера, объем кода, который был заменен и т. Д.), Еще неизвестно, будут ли результаты достаточно убедительными / стабильными. Это может быть хорошей идеей, чтобы запустить тесты много раз и сравнить средние значения.

Общая используемая / свободная память программы может быть получена в программе через 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);
  }
} 
Другие вопросы по тегам