...

вторник, 1 июля 2014 г.

Astrobench: тесирование производительности JavaScript кода

Bower version

Astrobench


Речь пойдёт о Astrobench, библиотеке, которая поможет сделать ваш код лучше.


Без перформанс тестов зачастую невозможно сделать качественный проект, будь то библиотека, или полноценное веб приложение. Скорость выполнения нашего кода важна. В конечном счёте, именно она влияет на положительный опыт использования вашего продукта.



Самым популярным на сегодняшний день сервисом для тестирования производительности JavaScript'а является jsperf. Главная его фишка в том, что вы легко можете поделиться своими тестами с сообществом, все тесты публичны, имеется базовая версионность, казалось бы все, что нужно. Основан он на той же библиотеке, что и Astrobench — Benchmark.js.


Но, как обычно бывает, главное преимущество jsperf — это же и его недостаток, не всегда нам нужно, чтобы наши тесты уходили в сеть, к тому же, при таком подходе мы не имеем доступа к файлам, находящимся в нашем локальном окружении.


Установка




Скачать библиотеку можно или из github репозитория, или же воспользовавшись пекедж менеджерами, npm или bower, последний вариант настоятельно рекомендую.

$ npm install astrobench --save




или соответственно:

$ bower install astrobench --save




Использование




Главный сценарий использования для меня — это тестирования низкоуровнего кода, который потенциально будет исполняться довольно большое количество раз, к примеру можно посмотреть на тесты для jBone.

Так же ничего не мешает вам писать тесты для целых сценариев, сравнивать производительность прототипов, технологий, подходов и так далее.


Начнём писать тесты




Скачаем astrobnech и создаём HTML документ, где подключим необходимые зависимости и сами тесты.

$ bower install astrobench --save-dev
$ touch test.js
$ EDITOR test.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Performance tests</title>
<!-- Необходимый CSS -->
<link rel="stylesheet" href="bower_components/astrobench/src/style.css">
</head>
<body>
<!-- Элемент для инициализации UI -->
<div id="astrobench"></div>

<!-- Путь к библиотеке -->
<script src="bower_components/astrobench/dist/astrobench.js"></script>

<!-- Список наших тестов -->
<script src="test.js"></script>
</body>
</html>


Теперь разберёмся, как же выглядят наши тесты, читайте между строк, в комментариях:



$ EDITOR test.js

// Набор тестов начинается с вызова глобальной функции `suite`, с двумя параметрами:
// строкой и функцией.
// Строка — это имя для набора тестов, обычно описывает то, что происходит внутри.
// Функция — блок кода, который определяет тесты.
suite('Habra suite', function(suite) {
var text;

// Для того, чтобы оставить наши тесты "чистыми" и избежать дублирования кода,
// имеется глобальная функция `setup`.
// Как следует из имени, функция выполняется единожды.
// Вы можете записать данные в объект suite, или просто использовать замыкания,
// объявив переменные в теле функции suite.
setup(function() {
suite.text = 'Hello world';
text = 'Hello world';
});

// Тест определяется вызовом функции `bench`,
// которая, как и `suite`, принимает строку и функцию.
// Строка — это заголовок, функция — сам тест.
bench('String#match', function() {
!! text.match(/o/);
});

// Пример асинхронного теста.
// Первым аргументом в вызываемую функцию передаётся Deferred объект,
// вызвав у которого метод .resolve() завершаем тест
bench('Deferred benchmark', function(deferred) {
!! /o/.test(suite.text);

setTimeout(function() {
deferred.resolve();
}, 100);
},
// Объект с параметрами для теста
// Больше смотрите на http://ift.tt/1vq9iCl
{
defer: true
});
});


В итоге мы получим хорошо структурированные тесты, которые можно запускать как по отдельности, так и все сразу:


Astrobench demo


Счастье




Таких наборов (suites) мы можем создавать необходимое количество, обычно тесты группируются логическими блоками, и всех их в один suite помещать не рекомендуется. Синтаксис у тестов предельно прост и позаимствован из BDD библиотек для тестирования, за что им большое спасибо :)

В результате у нас есть информация для размышления, почва для будущих оптимизаций и огромное количество утилит для профилирования нашего кода.


Делайте мир лучше, а код быстрее.


Github репозиторий.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий