SlideShare a Scribd company logo
1 of 51
Тестирование фронтенда
миф или реальность?
Чернобров Михаил
Проблемы
• Работает ли в браузере (пример .bind() и IE 8)?
• Изменили компонент – все вместе не завелось;
• Сделали новую задачу – сломали старый код;
• Устал от ctrl + r
• Добавьте свое
2
Время === ₽
• Время затраченное на ручную проверку кода
• … обновление браузера
• … написание кода
• … написание тестов
3
Решение
4
TDD
Разработка через тестирование (англ. test-
driven development, TDD) — техника разработки
программного обеспечения. Сначала пишется
тест, затем пишется код.
5
Ожидания
• Уменьшилось – Время на обновление
страницы
• Уменьшилось – Время на написание кода
• Уменьшилось – Время на ручную проверку
• Выросла – Вероятность нахождения ошибки
6
Концепции
๏ Юнит = функция -> результат
๏ Интеграционные – (Юнит + Юнит) ->
результат
๏ UI/UX – (Интеграционные + Верстка) ->
результат
7
Визуализируем
UNIT
Интеграционные
UI/UX
8
В деталях
Первая итерация
• Сборка проекта: Webpack
• Запуск тестов: Karma (+ 6 плагинов)
• Описание поведения: Jasmine
• Отчеты: Mocha
• Ожидания: Chai
• Окружение: PhantomJS
10
11
12
Определяемся с
инструментами
Внедряем
ОптимизируемПишем тесты
План
13
Результат
• Сборка проекта: Webpack
• Запуск тестов: Testem
• Описание поведения: Mocha
• Отчеты: Mocha
• Ожидания: Chai
• Окружение: PhantomJS
14
Инструменты
Webpackhttps://github.com/webpack/webpack
16
Testemhttps://github.com/testem/testem
17
Mochahttps://github.com/mochajs/mocha
18
Chaihttps://github.com/chaijs/chai
19
https://github.com/ariya/phantomjs/
20
Окружение
Режим CI
22
npm run test-ci
/app/**/__tests__/*.spec.js
testemwebpack
mochaphantom.jsreport
23
Режим TDD
24
npm run test
/app/**/__tests__/*.spec.js
testem
webpack-dev-
server
mocha
phantom.jsreport
webpack
http://localhost:8081
http://localhost:7357
25
Внедрение
Подготовка
• Установить зависмости
• Создадим папку .bin
• Положить 2 файла build-test.js и testem.js
27
package.json
{
"scripts": {
…
"build-test": "node .bin/build-test",
"test": "NODE_ENV=tdd npm run build-test",
"test-ci": "NODE_ENV=test-ci testem ci”
…
},
}
}
28
testem.json
{
"framework": "mocha",
"before_tests": "npm run build-test",
"after_tests": "rm -rf testing/",
"serve_files": [
"testing/*.js"
],
"launch_in_dev": [
"phantomjs"
],
"launch_in_ci": [
"phantomjs"
]
}
29
./bin/testem.js
function Testem() {}
Testem.prototype.start = function(options, finalizer) {
this.options = options || {};
this.config = new Config('dev', this.options);
this.app = new App(this.config, finalizer);
this.app.start();
};
Testem.prototype.restart = function() {
this.app.triggerRun('Api: restart');
};
module.exports = Testem;
30
.bin/build-test.js
glob('app/**/__tests__/*.spec.js', function(err, files) {
config.entry = {
a: dependencies,
};
files.forEach(function(file) {
config.entry[path.basename(file, '.js')]
= path.join(__dirname, '..', file);
});
// vendors
config
.plugins
.push(new webpack.optimize
.CommonsChunkPlugin('a', 'a.js'));
// check NODE_ENV
process && process.env && process.env.NODE_ENV === 'tdd'
? startServer(config)
: createCompiller(config);
});
31
.bin/build-test.js (2)
var startTestem = function(stat) {
var options = {
framework: 'mocha',
launch_in_dev: [
'phantomjs'
],
serve_files: stat.compilation.chunks.map(value => {
return `http://${host}:${port}/${value.files[0]}`;
})
};
var Instance = new Testem;
Instance.start(options, function() {});
return Instance;
};
32
.bin/build-test.js (3)
var createCompiller = function(endConfig) {
return webpack(endConfig, function() {});
};
var startServer = function(endConfig) {
var testemInstance = false;
var compiler = webpack(endConfig);
compiler.plugin('done', stat => {
!testemInstance && typeof testemInstance === 'boolean'
? testemInstance = startTestem(stat)
: testemInstance.restart();
});
return new WebpackDevServer(compiler, {
noInfo: true
}).listen(port, host);
};
33
Цель достигнута
npm run test
/app/**/__tests__/*.spec.js
testem
webpack-dev-
server
mocha
phantom.jsreport
webpack
http://localhost:8081
http://localhost:7357
34
Реализация
Формальные тесты
• Проверяют данные
• Проверяют результат работы функции
• Хранят представление о методах класса
• Решают большую часть поставленных задач
36
Прогрессивные
• Проверка производительности операций
• Углубленная проверка логики
• Проверка ассинхронных вызовов
• Тесты на быстродействие (benchmarks)
• Пользовательские действия и их результат
• Другие сценарии которые нужно автоматизировать
37
Подопытный
'use strict';
var Backbone = require('backbone');
var Model = require('./models/message');
module.exports = Backbone.View.extend({
el: document.getElementById('body'),
tagName: 'header',
className: 'example',
template: require('./templates/hello.jade'),
model: new Model,
initialize: function() {
this.render();
},
render: function() {
this.$el.append(this.template());
}
}); 38
TDD режим
npm run test
39
'use strict';
const Module = require('_modules/boilerplate');
const expect = require('chai').expect;
describe('App.modules.boilerplate', function() {
let Instance = new Module();
it('Should be an function', function() {
expect(Module).to.be.an('function');
});
it('Instance should be an object', function() {
expect(Instance).to.be.an('object');
});
it('Instance should contains few el and $el properties', function() {
expect(Instance).to.have.property('el');
expect(Instance).to.have.property('$el');
});
it('Instance should contains render() function', function() {
expect(Instance).to.have.property('render').an('function');
});
});
Формальный тест
40
Запустим
41
Ожидаемый функционал
'use strict';
// Depends
const $ = require('jquery');
const Module = require('_modules/boilerplate');
const expect = require('chai').expect;
describe('App.modules.boilerplate', () => {
let $el = $('<div>', { class: 'test-div' });
let Instance = new Module($el);
it('Click at logo should load ip data', done =>{
Instance.model.on('change:ip', () => done(), this);
Instance.$el.find('#rambler-logo').click();
});
it('Instance should contain .ip element', () => {
expect(Instance.$el.find('.ip')).to.have.length(1);
});
});
Покрываем тестами
43
Это норма
44
Напишем функционал
'use strict';
module.exports = Backbone.View.extend({
…
initialize: function() {
this.model.on('change:ip', () => this.update(), this);
this.render();
},
load: function(e) {
this.model.fetch();
e.preventDefault();
},
update: function() {
this.$el.append(
$('<div/>', { class: 'ip' })
.text(`YourIP: ${this.model.get('ip')}`)
);
}
});
45
Успех!
46
Режим CI
npm run test-ci
47
Наблюдаем статус
48
Еще раз успех!
49
Литература
50
http://bit.ly/1N8HYSu
Тестирование JS

More Related Content

What's hot

Эльдар Марков
Эльдар МарковЭльдар Марков
Эльдар Марков
alarin
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
e-Legion
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
Anton Arhipov
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
Technopark
 

What's hot (20)

Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?
 
Эльдар Марков
Эльдар МарковЭльдар Марков
Эльдар Марков
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтенд
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
 
Component Inspector
Component InspectorComponent Inspector
Component Inspector
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать Makeup
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
Запуск тестов с tox и Docker
Запуск тестов с tox и DockerЗапуск тестов с tox и Docker
Запуск тестов с tox и Docker
 
Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0
 
Bytecode
BytecodeBytecode
Bytecode
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 

Viewers also liked

Viewers also liked (15)

Визначні міcця ірландії
Визначні міcця ірландіїВизначні міcця ірландії
Визначні міcця ірландії
 
Occupation
OccupationOccupation
Occupation
 
Overpass PD P-15
Overpass PD P-15Overpass PD P-15
Overpass PD P-15
 
US8632975
US8632975US8632975
US8632975
 
LEAP ELA IG - www.lumoslearning.com
LEAP ELA IG - www.lumoslearning.comLEAP ELA IG - www.lumoslearning.com
LEAP ELA IG - www.lumoslearning.com
 
Climate ChangeMonitoring Guide_Final
Climate ChangeMonitoring Guide_FinalClimate ChangeMonitoring Guide_Final
Climate ChangeMonitoring Guide_Final
 
Master diploma small size
Master diploma small sizeMaster diploma small size
Master diploma small size
 
Зима дивує святами
Зима дивує святамиЗима дивує святами
Зима дивує святами
 
Kate Le Masurier Academic portfolio 6.5mb
Kate Le Masurier Academic portfolio 6.5mbKate Le Masurier Academic portfolio 6.5mb
Kate Le Masurier Academic portfolio 6.5mb
 
Yueda Real Estate Report Final
Yueda Real Estate Report FinalYueda Real Estate Report Final
Yueda Real Estate Report Final
 
Cloudgene - A MapReduce based Workflow Management System
Cloudgene - A MapReduce based Workflow Management SystemCloudgene - A MapReduce based Workflow Management System
Cloudgene - A MapReduce based Workflow Management System
 
Portfolio
Portfolio Portfolio
Portfolio
 
Plantilla 4
Plantilla 4Plantilla 4
Plantilla 4
 
Jaime sinchiguano trabajo
Jaime sinchiguano trabajoJaime sinchiguano trabajo
Jaime sinchiguano trabajo
 
C2 tochuc
C2 tochucC2 tochuc
C2 tochuc
 

Similar to Tdd webpack + testem + mocha + chai

Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
Technopark
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
 

Similar to Tdd webpack + testem + mocha + chai (20)

iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Plugin for plugin, or extending android new build system
Plugin for plugin, or extending android new build systemPlugin for plugin, or extending android new build system
Plugin for plugin, or extending android new build system
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с Kubernetes
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter..."Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 

Tdd webpack + testem + mocha + chai