Правильный способ автоматического тестирования производительности в Python (для всех разработчиков)? - PullRequest
16 голосов
/ 01 апреля 2011

Наше приложение Python (классный веб-сервис) имеет полный набор тестов (модульные тесты, интеграционные тесты и т. Д.), Которые все разработчики должны выполнить перед фиксацией кода.
Я хочу добавить некоторые тесты производительности в комплект дляубедитесь, что никто не добавляет код, который заставляет нас работать слишком медленно (для некоторого довольно произвольного определения замедления).
Очевидно, я могу собрать некоторую функциональность в тест, рассчитать время и сравнить с некоторым заранее заданным порогом.

Хитрые требования:

  1. Я хочу, чтобы каждый разработчик мог протестировать код на своем компьютере (зависит от мощности процессора, ОС (! Linux и некоторых Windows) и внешних конфигураций - версия Python,библиотеки и модули одинаковы).Тестовый сервер, хотя и хорошая идея, не решает эту проблему.
  2. Я хочу, чтобы тест был ДЕТЕРМИНИСТИЧЕСКИЙ - независимо от того, что происходит на машине, на которой выполняются тесты, я хочу несколькозапускает тест, чтобы вернуть те же результаты.

Мои предварительные мысли:

  • Используйте timeit и тестируйте систему каждый раз, когда я запускаю тесты.Сравните результаты теста производительности с эталонным тестом.
  • Используйте cProfile, чтобы настроить интерпретатор на игнорирование "внешнего шума".Я не уверен, что знаю, как читать структуру pstats, но уверен, что это выполнимо.

Другие мысли?

Спасибо!

Tal.

Ответы [ 2 ]

5 голосов
/ 01 апреля 2011

Check funkload - это способ запуска ваших юнит-тестов как функциональных, так и нагрузочных тестов, чтобы оценить, насколько хорошо работает ваш сайт.

Еще один интересный проект, который можно использовать вместе с funkload, - это codespeed . Это внутренняя панель инструментов, которая измеряет «скорость» вашей кодовой базы для каждого коммита, который вы делаете в своем коде, представляя графики с течением времени. Это предполагает, что у вас есть ряд автоматических тестов, которые вы можете запустить, но это может быть полезным способом авторитетного учета производительности с течением времени. Лучшее использование кодовой скорости, которое я видел до сих пор, - это сайт speed.pypy.org .

Что касается вашего требования к детерминизму - возможно, лучший подход к этому - использовать статистику в ваших интересах? Автоматически запустить тест N раз, вывести минимальное, максимальное, среднее и стандартное отклонение для всех ваших прогонов? Прочтите статью о бенчмаркинге , чтобы узнать, как это сделать.

2 голосов
/ 01 апреля 2011

Я хочу, чтобы тест был ДЕТЕРМИНИСТИЧЕСКИМ - независимо от того, что происходит на машине, на которой выполняются тесты, я хочу, чтобы несколько прогонов теста возвращали одинаковые результаты.

Ошибка.Более или менее по определению это совершенно невозможно в многопроцессорной системе с несколькими пользователями.

Либо переосмыслите это требование, либо найдите новую среду для запуска тестов, в которых не задействованы какие-либо современныеОбработка операционных систем.

Кроме того, ваше работающее веб-приложение не является детерминированным, поэтому навязывание какого-то «детерминированного» тестирования производительности не сильно поможет.

Когда мы выполняли обработку, критичную ко времени (в радаре, где «реальное время» фактически означало реальное время), мы не предпринимали попытки детерминистского тестирования.Мы провели проверку кода и провели простые тесты производительности, которые включали простые средние и максимальные значения.

Используйте cProfile, чтобы настроить интерпретатор для игнорирования «внешнего шума».Я не уверен, что знаю, как читать структуру pstats, но уверен, что это выполнимо.

Объект Stats, созданный профилировщиком, - это то, что вы ищете.

http://docs.python.org/library/profile.html#the-stats-class

Сосредоточьтесь на 'pcalls', подсчете примитивных вызовов, в статистике профиля, и вы получите что-то примерно детерминированное.

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