среда, 15 октября 2014 г.

BEM


XHR Long polling amd Post to hidden iFrame


Работа над проектом

Работа над проектом
- Сбор требований и составление ТЗ
- Проектирование макета и дизайн
- Верстка
- Программирование
- Тестирование
- Релиз-деплой
- Следующая итерация

Всё начинается с таска
- Bugzilla, GitHub, JIRA, Mantis, Redmine, …
- Позволяют отслеживать статус выполнения задачи и затраченное не неё время
- Получать оповещения об изменениях
- Составлять план ведения работ и релизов

Проектирование макета
- Начинайте с эскиза
- Используйте сетки
- Разбивайте всё на отдельные слои
- Учитывайте разные длины слов в разных языках. Например: Скачать, Завантажити, Download, Indir
- Не злоупотребляйте с кастомными шрифтами

Верстка
Заводите отдельные таски для верстки и программирования
- Требуйте реальные тексты для рыбы
- Используйте сервера приложения с моками
- Среда разработки должна быть доступна в виртуальных машинах
- Автоматизируйте процесс сборки html, css и js файлов: grunt, bash, make-файлы, …
- Используйте готовые сетки: anygrid, bootstrap, …
- Используйте динамические сниппеты (emmet, шаблоны в редакторе)
- Выделяйте общие блоки
- Делайте блоки максимально независимыми

Программирование
- Разворачивайте на виртуальной машине систему аналогичную продакшин
- Процесс «разворачивания» приложения должен быть максимально автоматизирован и документирован
- Данные из хранилища должны быть легко заменяемы на моки
- Используйте готовые фреймворки
- Выделяйте общие компоненты в независимые модули
- Покрывайте тестами основные страницы и компоненты
- Создавайте API с автогенерируемой документацией
- Версионируйте API и до последнего поддерживайте обратную совместимость
- Создавайте рабочее окружение удобное для всех членов команды разработки
- Именуем ветки в соответствии с номерами тасков
- Много коммитим в форк / ветку, после завершения сквошим
- Финальный коммит берем из "Commit message"
- Автоматически собираем ченжлог со списком тасков-коммитов перед релизом

Тестирование
- Тестирование должно проходить на отдельном инстансе приложения, доступному по отдельному URL
- Тестовый сервер должен быть полностью аналогичен продакшн
- Приложение развернутое на тестовом сервере должно вспоследствие "as is" с точностью до байта переноситься в продакшн

Релиз-деплой
- Автоматизировать можно как угодно: grunt, bash, make-файлы,  мы используем deb-пакеты
- Собираем автоматически пулл-реквесты через Teamcity
- Travis CI, Jenkins, GitHub Web-hooks, …
- Изменения должны разворачиваться в продакшине максимально атомарно

Резюме
- Принимайте участие в обсуждении ТЗ, дизайна и технических моментов
- Бейте задачу на подзадачи и создавайте дерево тасков
- Старайтесь держать чистой, но полной историю изменений
- Севера разработки должны быть легко поднимаемы и требовать минимальной настройки
- Упрощайте процесс сборки и релиза до максимума

Методы регулярных выражений

- экземпляры RegExp:
        /regexp/.exec('строка')
                        null или массив ['всё совпадение', $1, $2, ...]
        /regexp/.test('строка')
                        false или true
                   
- экземпляры String:
        'str'.match(/regexp/)
        'str'.match('\\w{1,3}')
                        - эквивалент /regexp/.exec, если нет флага g;
                        - массив всех совпадений по строке, если есть флаг g
(внутренние группировки игнорируются)
                   
        'str'.search(/regexp/)
        'str'.search('\\w{1,3}')
                 позиция первого совпадения или -1

- экземпляры String:
'str'.replace(/old/, 'new');
   
В строке замены поддерживаются следующие спецсимволы:
   $$   вставляет значок доллара "$"
    $&   подстрока, совпавшая с регэкспом
    $`   подстрока до $&
    $'   подстрока после $&
    $1, $2, $3 и т.д.: cтрока, совпавшая с соответствующей
скобочной группировкой
   
'str'.replace(/(r)(e)gexp/g,
    function(matched, $1, $2, offset, sourceString) {
        // чем заменить matched на этом шаге?
        return 'замена';
});

Устройство HTTP

<схема>://<логин>:<пароль>@<хост>:<порт>/<URL‐путь>?<параметры>#<якорь>

Структура протокола

<Метод> <URI> HTTP/1.1
<Заголовки>
    Referer: http://www.yandex.ru/
</Заголовки>
<Тело сообщения>
    param=value&a=1&b=2&c=3
</Тело сообщения>

Коды состояния HTTP
- (1xx) Информационные ответ
- (2xx) Ответы успеха
- (3xx) Ответы перенаправления
- (4xx) Ошибки клиента
- (5xx) Ошибки сервера

Заголовки HTTP
- General Headers
- Request Headers
- Response Headers
- Entity Headers

HTTP/1.1 200 OK!
Date: Mon, 17 Sep 2012 13:05:11 GMT!
Transfer-Encoding: chunked!
Connection: keep-alive!
Pragma: no-cache!
Cache-Control: no-cache, no-store, max-age=0,
must-revalidate!
Server: nginx!
Vary: X-Real-SSL-Protocol!
Content-Type: text/html; charset=UTF-8!
Expires: Mon, 17 Sep 2012 13:05:11 GMT!
Content-Encoding: gzip!

Про тестирование

Unit-тесты – тесты, проверяющие корректность работы отдельных модулей программы.

Плюсы unit-тестов
- Можно запустить сразу после внесения изменений в код – позволяют найти дефект сразу после его создания.
- Могут служить документацией к коду.
- Упрощают процесс рефакторинга.

Минусы unit-тестов
- Их надо писать.
- Их надо уметь писать.
- Их надо поддерживать.

Но даже если все компоненты по отдельности работают правильно, то это ещё ничего не значит.

Интеграционные тесты – тесты,  проверяющие корректность взаимодействия отдельных модулей друг с другом.

Плюсы интеграционных тестов
- Находят баги, которые не могут быть обнаружены unit-тестами.
- Запускаются после сборки проекта и позволяют быстро обнаружить проблемы взаимодействия.

Минусы интеграционных тестов
- Все минусы unit-тестов

Приёмочные тесты – тесты, проверяющие работоспособность системы целиком. В реальном окружении, с реальными данными, на реальных сценариях.

Плюсы приёмочных тестов
- Находят баги, которые не могут быть обнаружены unit- и интеграционными тестами.
- Позволяют оценить работоспособность продукта целиком.
- На этом уровне с продуктом могут ознакомиться будущие пользователи.

Минусы приёмочных тестов
- Самые высокоуровневые – сложнее локализовывать проблему
- Занимают больше времени
- Обнаруживают проблемы с некоторой задержкой

Функциональное тестирование – проверка работы кода/продукта на соответствие требованиям. Проверка логики работы.

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

Нагрузочное тестирование – проверка работоспособности под нагрузкой (одновременная обработка большого потока запросов).

Тестирование производительности – проверка скорости работы системы.
Причём:
- Необходимо измерить длительность полного цикла «запрос-ответ». Оценить общее время, обратить внимание на отдельные этапы.
- То же самое – под нагрузкой
- В пользовательских условиях (сетевые условия).

Тестирование безопасности.

Тестирование юзабилити – тестирование удобства использования.

Тестирование стабильности – тестирование стабильности работы под нагрузкой, длительное время.

До кучи:
– Volume тестирование
– Stress/Recovery тестирование
– Spike тестирование
– Localization тестирование
– Compatibility тестирование
– и т. д. и т. п.

Способы тестирования
Ручное тестирование – выполнение тестов вручную или с помощью скриптов. Ручной анализ результатов.

Плюсы ручного подхода
- Более информативно – замечаются дефекты рядом

Минусы ручного подхода
- Долго
- Дорого

Автоматическое тестирование – выполнение с помощью скриптов или инструментов. Оценка результатов проводится автоматически.

Плюсы неручного подхода
- Удобно и легко

Минусы неручного подхода
- Тесты нужно писать и поддерживать
- Тесты выполняются «в лоб»
- Сами тесты/скрипты/инструменты могут содержать баги и порождать ложные результаты

Инструменты

Функциональное, приемочное тестирование:
- Selenium
- TestComplete

Функциональное, unit тестирование
- подбирается под используемый язык

Нагрузочное тестирование/тестирование производительности:
- Яндекс.Танк
- Jmeter:

Как сымитировать плохую сеть:
- Fiddler
- Charles
- Утилита tc: man tc

среда, 1 октября 2014 г.

Как остановить браузер перед переходом на другую страницу через JavaScript

Для того, чтобы Chrome или другой браузер не очищал Network debugger необходимо в консоли браузера выполнить следующий код:

window.addEventListener("beforeunload", function() { debugger; }, false);

Это код поставит Chrome на паузу перед загрузкой новой страницы и перенесет вас на точку остановки в debugger.