SlideShare a Scribd company logo
ТЕСТИРОВАНИЕ JAVASCRIPT КОДА.
ИНСТРУМЕНТЫ, ПРАКТИКИ, ТРЕНДЫ
Евгений Сафронов
Senior developer
25.03.2017
evgeniy.safronov@outlook.com
skype: lambda.omega1
Тестирование, как инженерная
практика, появилось раньше чем
программирование
Здесь тоже есть своя философия
Здесь тоже есть своя философия
ЭДСГЕР ДЕЙКСТРА
«Тестирование программ можно
использовать для того, чтобы показать
наличие ошибок и никогда — для того чтобы
показать их отсутствие!»
Почему тестировать программы так важно?
Как правило, самые дорогостоящие
ошибки вызваны изменением
одного символа.
Ivan
Ivanov
i.ivanov
First name:
Last name:
Login:
0..255
0..255
0..20
a-z, A-Z
a-z, A-Z
a-z, A-Z, 0-9, . - % $
Количество возможных ситуаций > 52255
+ 52255
+ 3620
25.18% Структурные
22.14% Данных
16.19% Реализация функциональности
9.88% Конструирования
8.98% Интеграции
8.12% Функциональных требований
2.76% Определение и выполнение
тестов
1.14% Архитектура ПО
4.71% Другие
9
Типы ошибок в проектах
0%
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
2K 8K 32K 128K 512K
Конструирование Проектирование Выработка требований
Статистика ошибок на стадиях разработки
Правило Парето работает и в
тестировании ПО: 80% дефектов
локализированы лишь в 20%
вашего кода.
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практики, тренды
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практики, тренды
Т.е. если тестами покрыто 50%
кода нельзя утверждать, что
удалось предотвратить 50%
возможных дефектов
Тестирование - самая
популярная методика управления
качеством.
Классификация
Тестирование может выполнятся
разработчиками, тестировщиками,
заказчиками и т.д.
Тестирование
черного и белого
ящиков
Классификация по цели:
• Регрессионное
• Нагрузочное
• UX - тестирование
• Тестирование защищенности и надежности
• Обнаружение дефектов
Какие тесты пишут разработчики?
• Модульные тесты
• Функциональные тесты
• Интеграционные
• End-to-end
Модульное тестирование
• Быстрота (Fast) - Если тесты выполняются медленно, вам не захочется их
запускать.
• Независимость (Independent) - Один тест не должен создавать условия
для выполнения следующего теста. Все тесты должны выполняться
независимо и в любом порядке.
• Повторяемость (Repeatable) - Тесты должны давать повторяемые
результаты в любом окружении.
• Очевидность (Self-Validating) - Результатом выполнения теста должен быть
логический признак. Тест либо прошел либо нет. Тесты должны создаваться
своевременно.
• Своевременность (Timely)
F.I.R.S.T.
TDD и BDD
TDD процесс
suite('#factorial()', function (){
test('equals 1 for sets of zero length', function (){
assert.equal(1, factorial(0));
});
test('equals 1 for sets of length one', function (){
assert.equal(1, factorial(1));
});
test('equals 2 for sets of length two', function (){
assert.equal(2, factorial(2));
});
test('equals 6 for sets of length three', function (){
assert.equal(6, factorial(3));
});
});
TDD стиль написания тестов
describe('#factorial()', function (){
it('should return 1 when given 0', function (){
factorial(0).should.equal(1);
});
it('should return 1 when given 1', function (){
factorial(1).should.equal(1);
});
it('should return 2 when given 2', function (){
factorial(2).should.equal(2);
});
it('should return 6 when given 3', function (){
factorial(3).should.equal(6);
});
});
BDD стиль написания тестов
Особенности модульного тестирования
• дает возможность писать много тестов, причем
достаточно быстро
• необходимость изолировать участки кода
(mocks, stubs, spies)
• требует понимания кода, который нужно
тестировать (тестирование белого ящика)
Существует много инструментов
которые позволяют выполнять
модульное тестирование JS кода
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практики, тренды
QUnit
Это библиотека от разработчиков jQuery, позволяющая писать unit-
тесты в TDD стиле и имеющая свой механизм assert-ов.
QUnit.test( "hello test", function( assert ) {
assert.ok( 1 == "1", "Passed!" );
});
Mocha
Фреймворк для тестирования, позволяющий писать тесты в TDD и
BDD формате
describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna');
user.save(function(err) {
if (err) done(err);
else done();
});
});
});
});
Chai
Очень популярная библиотека assert’ов
assert.typeOf(foo, 'string');
assert.equal(foo, 'bar');
assert.lengthOf(foo, 3;
assert.property(tea, 'flavors');
assert.lengthOf(tea.flavors, 3);
expect(foo).to.be.a('string');
expect(foo).to.equal('bar');
expect(foo).to.have.lengthOf(3);
expect(tea).to.have.property('flavors').with.lengthOf(3);
foo.should.be.a('string');
foo.should.equal('bar');
foo.should.have.lengthOf(3);
tea.should.have.property('flavors').with.lengthOf(3);
Sinon
Инструмент для создания Mocks, stubs, spies
function () {
var myAPI = { method: function () {} };
var spy = sinon.spy();
var mock = sinon.mock(myAPI);
mock.expects("method").once().throws();
PubSub.subscribe("message", myAPI.method);
PubSub.subscribe("message", spy);
PubSub.publishSync("message", undefined);
mock.verify();
assert(spy.calledOnce);
}
Jasmine
Популярный в экосистеме Angular’a, BDD фреймворк
describe("A suite is just a function",
function() {
var a;
it("and so is a spec", function() {
a = true;
expect(a).toBe(true);
});
});
• Тестирование - это долго и дорого. Разумеется тестирование
увеличивает время на разработку, но уменьшает время,
затраченное на рефакторинг и багфикс.
• Писать тесты – это скучно и нудно. Написание тестов позволяет
еще раз взглянуть на вашу архитектуру и принять правильные
решения
• 100%-ое покрытия. Тестов необходимо ровно столько, сколько
достаточно для выпуска стабильного и надежного продукта.
• Тестирование не позволяет писать код без багов.
Мифы
• Заказчик не поддерживает и не принимает идею unit-тестов в
проекте
• Тесты пишутся только для наличия и метрик, а «чистоте» тестов
не уделяется должное внимание
• Вы пишите тесты намного позже создания кода. Тесты не
актуализируются
Ситуации бывают разные
?
Спасибо!
F O O T E R H E R E 38
Ad

Recommended

анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
Ruslan Shevchenko
 
Учим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTest
Rina Uzhevko
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
QA Dnepropetrovsk Community (Ukraine)
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
Sergey Platonov
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf Conference
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
CodeFest
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Sergey Platonov
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Sergey Platonov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 
бегун
бегун
HighLoad2009
 
Нескучное тестирование с pytest
Нескучное тестирование с pytest
Roman Imankulov
 
Эффективный C++
Эффективный C++
Andrey Karpov
 
бегун
бегун
HighLoad2009
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
модуль 14 введение в generics
модуль 14 введение в generics
Yevgeniy Gertsen
 
Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
Component Inspector
Component Inspector
Roman Dvornov
 
C++ refelection and cats
C++ refelection and cats
corehard_by
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
Groovy On Grails
Groovy On Grails
guest32215a
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
Anton Arhipov
 
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Oleg Poludnenko
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
 
JRebel
JRebel
Alex Tumanoff
 
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
GeeksLab Odessa
 
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
GeeksLab Odessa
 

More Related Content

What's hot (20)

Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 
бегун
бегун
HighLoad2009
 
Нескучное тестирование с pytest
Нескучное тестирование с pytest
Roman Imankulov
 
Эффективный C++
Эффективный C++
Andrey Karpov
 
бегун
бегун
HighLoad2009
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
модуль 14 введение в generics
модуль 14 введение в generics
Yevgeniy Gertsen
 
Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
Component Inspector
Component Inspector
Roman Dvornov
 
C++ refelection and cats
C++ refelection and cats
corehard_by
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
Groovy On Grails
Groovy On Grails
guest32215a
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
Anton Arhipov
 
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Oleg Poludnenko
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
 
JRebel
JRebel
Alex Tumanoff
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 
Нескучное тестирование с pytest
Нескучное тестирование с pytest
Roman Imankulov
 
Эффективный C++
Эффективный C++
Andrey Karpov
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
модуль 14 введение в generics
модуль 14 введение в generics
Yevgeniy Gertsen
 
Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
C++ refelection and cats
C++ refelection and cats
corehard_by
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
Groovy On Grails
Groovy On Grails
guest32215a
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
Anton Arhipov
 
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Oleg Poludnenko
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
 

Viewers also liked (15)

JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
GeeksLab Odessa
 
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
GeeksLab Odessa
 
JS Lab2017_Роман Якобчук_Почему так важно быть программистом в фронтенде
JS Lab2017_Роман Якобчук_Почему так важно быть программистом в фронтенде
GeeksLab Odessa
 
JS Lab2017_Юлия Пучнина_PhaserJS и что он умеет
JS Lab2017_Юлия Пучнина_PhaserJS и что он умеет
GeeksLab Odessa
 
JS Lab2017_Lightning Talks_React Perfomance
JS Lab2017_Lightning Talks_React Perfomance
GeeksLab Odessa
 
JS Lab2017_Алексей Заславский_React Fiber
JS Lab2017_Алексей Заславский_React Fiber
GeeksLab Odessa
 
JS Lab2017_Redux: время двигаться дальше?_Екатерина Лизогубова
JS Lab2017_Redux: время двигаться дальше?_Екатерина Лизогубова
GeeksLab Odessa
 
JS Lab2017_Lightning Talks_Рекрутинг.js
JS Lab2017_Lightning Talks_Рекрутинг.js
GeeksLab Odessa
 
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
GeeksLab Odessa
 
JS Lab2017_Lightning Talks_PostCSS - there is a plugin for that
JS Lab2017_Lightning Talks_PostCSS - there is a plugin for that
GeeksLab Odessa
 
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
GeeksLab Odessa
 
JS Lab2017_Андрей Кучеренко _Разработка мультипакетных приложения: причины, с...
JS Lab2017_Андрей Кучеренко _Разработка мультипакетных приложения: причины, с...
GeeksLab Odessa
 
JS Lab2017_Сергей Селецкий_System.js и jspm
JS Lab2017_Сергей Селецкий_System.js и jspm
GeeksLab Odessa
 
WebCamp 2016: Python.Максим Климишин.Типизированный Python
WebCamp 2016: Python.Максим Климишин.Типизированный Python
WebCamp
 
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
GeeksLab Odessa
 
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
GeeksLab Odessa
 
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
GeeksLab Odessa
 
JS Lab2017_Роман Якобчук_Почему так важно быть программистом в фронтенде
JS Lab2017_Роман Якобчук_Почему так важно быть программистом в фронтенде
GeeksLab Odessa
 
JS Lab2017_Юлия Пучнина_PhaserJS и что он умеет
JS Lab2017_Юлия Пучнина_PhaserJS и что он умеет
GeeksLab Odessa
 
JS Lab2017_Lightning Talks_React Perfomance
JS Lab2017_Lightning Talks_React Perfomance
GeeksLab Odessa
 
JS Lab2017_Алексей Заславский_React Fiber
JS Lab2017_Алексей Заславский_React Fiber
GeeksLab Odessa
 
JS Lab2017_Redux: время двигаться дальше?_Екатерина Лизогубова
JS Lab2017_Redux: время двигаться дальше?_Екатерина Лизогубова
GeeksLab Odessa
 
JS Lab2017_Lightning Talks_Рекрутинг.js
JS Lab2017_Lightning Talks_Рекрутинг.js
GeeksLab Odessa
 
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
GeeksLab Odessa
 
JS Lab2017_Lightning Talks_PostCSS - there is a plugin for that
JS Lab2017_Lightning Talks_PostCSS - there is a plugin for that
GeeksLab Odessa
 
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
GeeksLab Odessa
 
JS Lab2017_Андрей Кучеренко _Разработка мультипакетных приложения: причины, с...
JS Lab2017_Андрей Кучеренко _Разработка мультипакетных приложения: причины, с...
GeeksLab Odessa
 
JS Lab2017_Сергей Селецкий_System.js и jspm
JS Lab2017_Сергей Селецкий_System.js и jspm
GeeksLab Odessa
 
WebCamp 2016: Python.Максим Климишин.Типизированный Python
WebCamp 2016: Python.Максим Климишин.Типизированный Python
WebCamp
 
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
GeeksLab Odessa
 
Ad

Similar to JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практики, тренды (20)

Javascript testing
Javascript testing
TCS bank
 
Евгений Сафронов "Тестирование. точка зрения разработчика"
Евгений Сафронов "Тестирование. точка зрения разработчика"
DataArt
 
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QAFest
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.
Igor Shkulipa
 
50 оттенков красного
50 оттенков красного
Сергей Александрович
 
2015-03-07 03 Сергей Александрович. 50 оттенков красного
2015-03-07 03 Сергей Александрович. 50 оттенков красного
Омские ИТ-субботники
 
Unit тестирование
Unit тестирование
Maxim Volchenko
 
Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2
Technopark
 
Автоматизация.pptx
Автоматизация.pptx
MadirimovShohrux
 
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
Ontico
 
QAFest. Роль тестирования в Devops
QAFest. Роль тестирования в Devops
Анастасия Асеева
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QAFest
 
ClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDD
Club QA Kostroma
 
Unit testing and TDD
Unit testing and TDD
Iosif Itkin
 
AgileCamp’11 Новосибирск - Test Driven Development (TDD)
AgileCamp’11 Новосибирск - Test Driven Development (TDD)
Anton Katkov
 
Тестирование ПО
Тестирование ПО
seleznev_stas
 
BDD
BDD
Andrey Bibichev
 
Использование Mock-объектов в TDD на платформе .NET
Использование Mock-объектов в TDD на платформе .NET
Pavel Treshnikov
 
Test driven development in net
Test driven development in net
Alex Tumanoff
 
Автотесты и образ мышления
Автотесты и образ мышления
Andrei Zubov
 
Javascript testing
Javascript testing
TCS bank
 
Евгений Сафронов "Тестирование. точка зрения разработчика"
Евгений Сафронов "Тестирование. точка зрения разработчика"
DataArt
 
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QAFest
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.
Igor Shkulipa
 
2015-03-07 03 Сергей Александрович. 50 оттенков красного
2015-03-07 03 Сергей Александрович. 50 оттенков красного
Омские ИТ-субботники
 
Unit тестирование
Unit тестирование
Maxim Volchenko
 
Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2
Technopark
 
Автоматизация.pptx
Автоматизация.pptx
MadirimovShohrux
 
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
Ontico
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QAFest
 
ClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDD
Club QA Kostroma
 
Unit testing and TDD
Unit testing and TDD
Iosif Itkin
 
AgileCamp’11 Новосибирск - Test Driven Development (TDD)
AgileCamp’11 Новосибирск - Test Driven Development (TDD)
Anton Katkov
 
Тестирование ПО
Тестирование ПО
seleznev_stas
 
Использование Mock-объектов в TDD на платформе .NET
Использование Mock-объектов в TDD на платформе .NET
Pavel Treshnikov
 
Test driven development in net
Test driven development in net
Alex Tumanoff
 
Автотесты и образ мышления
Автотесты и образ мышления
Andrei Zubov
 
Ad

More from GeeksLab Odessa (19)

DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
GeeksLab Odessa
 
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
GeeksLab Odessa
 
DataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский Виктор
GeeksLab Odessa
 
DataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображение
GeeksLab Odessa
 
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
GeeksLab Odessa
 
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
GeeksLab Odessa
 
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
GeeksLab Odessa
 
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
GeeksLab Odessa
 
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
GeeksLab Odessa
 
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
GeeksLab Odessa
 
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
GeeksLab Odessa
 
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
GeeksLab Odessa
 
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
GeeksLab Odessa
 
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
GeeksLab Odessa
 
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
GeeksLab Odessa
 
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
GeeksLab Odessa
 
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
GeeksLab Odessa
 
DataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский Виктор
GeeksLab Odessa
 
DataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображение
GeeksLab Odessa
 
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
GeeksLab Odessa
 
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
GeeksLab Odessa
 
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
GeeksLab Odessa
 
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
GeeksLab Odessa
 
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
GeeksLab Odessa
 
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
GeeksLab Odessa
 
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
GeeksLab Odessa
 
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
GeeksLab Odessa
 
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
GeeksLab Odessa
 
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
GeeksLab Odessa
 
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
GeeksLab Odessa
 

JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практики, тренды

  • 1. ТЕСТИРОВАНИЕ JAVASCRIPT КОДА. ИНСТРУМЕНТЫ, ПРАКТИКИ, ТРЕНДЫ Евгений Сафронов Senior developer 25.03.2017 [email protected] skype: lambda.omega1
  • 2. Тестирование, как инженерная практика, появилось раньше чем программирование
  • 3. Здесь тоже есть своя философия
  • 4. Здесь тоже есть своя философия
  • 5. ЭДСГЕР ДЕЙКСТРА «Тестирование программ можно использовать для того, чтобы показать наличие ошибок и никогда — для того чтобы показать их отсутствие!»
  • 7. Как правило, самые дорогостоящие ошибки вызваны изменением одного символа.
  • 8. Ivan Ivanov i.ivanov First name: Last name: Login: 0..255 0..255 0..20 a-z, A-Z a-z, A-Z a-z, A-Z, 0-9, . - % $ Количество возможных ситуаций > 52255 + 52255 + 3620
  • 9. 25.18% Структурные 22.14% Данных 16.19% Реализация функциональности 9.88% Конструирования 8.98% Интеграции 8.12% Функциональных требований 2.76% Определение и выполнение тестов 1.14% Архитектура ПО 4.71% Другие 9 Типы ошибок в проектах
  • 10. 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% 2K 8K 32K 128K 512K Конструирование Проектирование Выработка требований Статистика ошибок на стадиях разработки
  • 11. Правило Парето работает и в тестировании ПО: 80% дефектов локализированы лишь в 20% вашего кода.
  • 14. Т.е. если тестами покрыто 50% кода нельзя утверждать, что удалось предотвратить 50% возможных дефектов
  • 15. Тестирование - самая популярная методика управления качеством.
  • 17. Тестирование может выполнятся разработчиками, тестировщиками, заказчиками и т.д.
  • 19. Классификация по цели: • Регрессионное • Нагрузочное • UX - тестирование • Тестирование защищенности и надежности • Обнаружение дефектов
  • 20. Какие тесты пишут разработчики? • Модульные тесты • Функциональные тесты • Интеграционные • End-to-end
  • 22. • Быстрота (Fast) - Если тесты выполняются медленно, вам не захочется их запускать. • Независимость (Independent) - Один тест не должен создавать условия для выполнения следующего теста. Все тесты должны выполняться независимо и в любом порядке. • Повторяемость (Repeatable) - Тесты должны давать повторяемые результаты в любом окружении. • Очевидность (Self-Validating) - Результатом выполнения теста должен быть логический признак. Тест либо прошел либо нет. Тесты должны создаваться своевременно. • Своевременность (Timely) F.I.R.S.T.
  • 25. suite('#factorial()', function (){ test('equals 1 for sets of zero length', function (){ assert.equal(1, factorial(0)); }); test('equals 1 for sets of length one', function (){ assert.equal(1, factorial(1)); }); test('equals 2 for sets of length two', function (){ assert.equal(2, factorial(2)); }); test('equals 6 for sets of length three', function (){ assert.equal(6, factorial(3)); }); }); TDD стиль написания тестов
  • 26. describe('#factorial()', function (){ it('should return 1 when given 0', function (){ factorial(0).should.equal(1); }); it('should return 1 when given 1', function (){ factorial(1).should.equal(1); }); it('should return 2 when given 2', function (){ factorial(2).should.equal(2); }); it('should return 6 when given 3', function (){ factorial(3).should.equal(6); }); }); BDD стиль написания тестов
  • 27. Особенности модульного тестирования • дает возможность писать много тестов, причем достаточно быстро • необходимость изолировать участки кода (mocks, stubs, spies) • требует понимания кода, который нужно тестировать (тестирование белого ящика)
  • 28. Существует много инструментов которые позволяют выполнять модульное тестирование JS кода
  • 30. QUnit Это библиотека от разработчиков jQuery, позволяющая писать unit- тесты в TDD стиле и имеющая свой механизм assert-ов. QUnit.test( "hello test", function( assert ) { assert.ok( 1 == "1", "Passed!" ); });
  • 31. Mocha Фреймворк для тестирования, позволяющий писать тесты в TDD и BDD формате describe('User', function() { describe('#save()', function() { it('should save without error', function(done) { var user = new User('Luna'); user.save(function(err) { if (err) done(err); else done(); }); }); }); });
  • 32. Chai Очень популярная библиотека assert’ов assert.typeOf(foo, 'string'); assert.equal(foo, 'bar'); assert.lengthOf(foo, 3; assert.property(tea, 'flavors'); assert.lengthOf(tea.flavors, 3); expect(foo).to.be.a('string'); expect(foo).to.equal('bar'); expect(foo).to.have.lengthOf(3); expect(tea).to.have.property('flavors').with.lengthOf(3); foo.should.be.a('string'); foo.should.equal('bar'); foo.should.have.lengthOf(3); tea.should.have.property('flavors').with.lengthOf(3);
  • 33. Sinon Инструмент для создания Mocks, stubs, spies function () { var myAPI = { method: function () {} }; var spy = sinon.spy(); var mock = sinon.mock(myAPI); mock.expects("method").once().throws(); PubSub.subscribe("message", myAPI.method); PubSub.subscribe("message", spy); PubSub.publishSync("message", undefined); mock.verify(); assert(spy.calledOnce); }
  • 34. Jasmine Популярный в экосистеме Angular’a, BDD фреймворк describe("A suite is just a function", function() { var a; it("and so is a spec", function() { a = true; expect(a).toBe(true); }); });
  • 35. • Тестирование - это долго и дорого. Разумеется тестирование увеличивает время на разработку, но уменьшает время, затраченное на рефакторинг и багфикс. • Писать тесты – это скучно и нудно. Написание тестов позволяет еще раз взглянуть на вашу архитектуру и принять правильные решения • 100%-ое покрытия. Тестов необходимо ровно столько, сколько достаточно для выпуска стабильного и надежного продукта. • Тестирование не позволяет писать код без багов. Мифы
  • 36. • Заказчик не поддерживает и не принимает идею unit-тестов в проекте • Тесты пишутся только для наличия и метрик, а «чистоте» тестов не уделяется должное внимание • Вы пишите тесты намного позже создания кода. Тесты не актуализируются Ситуации бывают разные
  • 37. ?
  • 38. Спасибо! F O O T E R H E R E 38