Я использую Java в этом вопросе, но это действительно относится ко всем современным разработкам приложений.Наш «конвейер среды», как и многие из них, выглядит следующим образом:
- Песочница для разработчиков
- Непрерывная интеграция и тестирование
- QA / Staging
- Производство
Аппаратное обеспечение, доступный ОЗУ и ЦП в каждой из этих сред различны: мой ноутбук представляет собой двухъядерный Windows-компьютер объемом 2 ГБ.Тестирование выполняется на машине 4 ГБ.Производство - это два (с балансировкой нагрузки) 8-гигабайтных четырехъядерных сервера.
Очевидно, что один и тот же код будет работать по-разному при работе на этих разных машинах (средах).
Я думал о написанииавтоматические тесты производительности для некоторых из моих классов, которые будут иметь вид:
private static final long MAX_TIME = 8000;
@Test
public final void perfTestSomething() {
long start = System.currentTimeInMillis();
// Run the test
long end = System.currentTimeInMillis();
assertTrue((end - start) < MAX_TIME);
}
Таким образом, автоматический тест производительности не выполняется, если тест занимает, скажем, более 8 секунд.
Но затем меня осенило, что код будет работать по-разному в разных средах и работать по-разному в зависимости от состояния JVM и GC.Я мог бы выполнить один и тот же тест 1000 раз на своей машине и получить совершенно разные результаты.
Поэтому я спрашиваю: как можно точно / надежно определять и оценивать автоматизированные тесты производительности при продвижении кода из одной среды в другую??
Заранее спасибо!