Является ли JUnit правильным инструментом для написания тестов производительности? - PullRequest
41 голосов
/ 07 февраля 2012

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

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

Ответы [ 4 ]

41 голосов
/ 07 февраля 2012

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

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

21 голосов
/ 07 февраля 2012

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

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

6 голосов
/ 07 февраля 2012

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

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

0 голосов
/ 07 февраля 2012

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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...