Подтвердить что ты не робот

Является ли JUnit правильным инструментом для написания тестов производительности?

На прошлой неделе я создал два класса, которые моя команда выразила некоторую обеспокоенность в отношении их производительности. Чтобы оценить мой код, я написал несколько простых тестов JUnit, которые выполняли эти классы, создавая богатые наборы тестовых данных, а затем загружая эти данные с помощью соответствующих методов для тысяч итераций. Я записал время выполнения каждой итерации, а затем выбил высокие, низкие и средние значения с помощью циклов и System.nanoTime(). Наконец, JUnit утверждал, что высокие и средние времена были в допустимых пределах. Этот подход к тестированию дал моей команде уверенность в этом коде.

Является ли JUnit правильным инструментом для проверки производительности таким образом? Существуют ли более эффективные инструменты для проверки производительности на уровне устройства (метода и класса)?

4b9b3361

Ответ 1

Там могут быть более эффективные подходы, но есть также некоторые рамки, которые помогают внедрить бенчмаркинг с JUnit. Некоторые полезные практики - это разминки, статистические оценки. Взгляните на JUnitBenchmarks и JUnitPerf

EDIT выглядит так: JUnitBenchmarks устарел, поскольку вопрос был указан. Сторонники проекта рекомендуют перейти на JMH. Спасибо, Барри НЛ за хедз-ап.

Ответ 2

Нет. JUnit предназначен для модульного тестирования. Есть много вещей, которые необходимо соблюдать при написании тестов производительности на Java. Используйте Google Caliper, который специально разработан для написания тестов с использованием микроконтроля.

Посмотрите Как написать правильный микро-тест в Java?

Ответ 3

Ваши тесты должны быть лучше определены как контрольные тесты. Да, JUnit можно использовать таким образом, хотя это не лучший выбор. Но вы можете, например, определить max. время оценки для теста, поэтому, если алгоритм изменен, что вызвало снижение производительности, тест завершился неудачно. Используйте @Test(timeout=12345) для настройки.

Если вам нужна реальная проверка производительности, подумайте о JMeter.

Ответ 4

JUnit больше предназначен для модульного тестирования, возможно, в этом случае лучшим вариантом будет TestNG, в частности, его функция @Dataprovider:

//This method will provide data to any test method that declares that its Data Provider
//is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
 return new Object[][] {
   { "Cedric", new Integer(36) },
   { "Anne", new Integer(37)},
 };
}

//This test method declares that its data should be supplied by the Data Provider
//named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
 System.out.println(n1 + " " + n2);
}

Вот конкретный документ.