38
ТЕСТИРОВАНИЕ JAVASCRIPT КОДА. ИНСТРУМЕНТЫ, ПРАКТИКИ, ТРЕНДЫ Евгений Сафронов Senior developer 25.03.2017 [email protected] skype: lambda.omega1

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

Embed Size (px)

Citation preview

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

ТЕСТИРОВАНИЕ JAVASCRIPT КОДА. ИНСТРУМЕНТЫ, ПРАКТИКИ, ТРЕНДЫ

Евгений Сафронов

Senior developer

25.03.2017

[email protected]

skype: lambda.omega1

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

Тестирование, как инженерная практика, появилось раньше чем программирование

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

Здесь тоже есть своя философия

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

Здесь тоже есть своя философия

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

ЭДСГЕР ДЕЙКСТРА

«Тестирование программ можно использовать для того, чтобы показать наличие ошибок и никогда — для того чтобы показать их отсутствие!»

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

Почему тестировать программы так важно?

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

Как правило, самые дорогостоящие ошибки вызваны изменением одного символа.

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

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 + 52

255 + 3620

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

25.18% Структурные

22.14% Данных

16.19% Реализация функциональности

9.88% Конструирования

8.98% Интеграции

8.12% Функциональных требований

2.76% Определение и выполнение тестов1.14% Архитектура ПО

4.71% Другие

9

Типы ошибок в проектах

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

0%

10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

2K 8K 32K 128K 512K

Конструирование Проектирование Выработка требований

Статистика ошибок на стадиях разработки

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

Правило Парето работает и в тестировании ПО: 80% дефектов локализированы лишь в 20% вашего кода.

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

Т.е. если тестами покрыто 50% кода нельзя утверждать, что удалось предотвратить 50% возможных дефектов

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

Тестирование - самаяпопулярная методика управлениякачеством.

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

Классификация

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

Тестирование может выполнятся разработчиками, тестировщиками, заказчиками и т.д.

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

Тестирование черного и белого ящиков

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

Классификация по цели:

• Регрессионное

• Нагрузочное

• UX - тестирование

• Тестирование защищенности и надежности

• Обнаружение дефектов

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

Какие тесты пишут разработчики?

• Модульные тесты

• Функциональные тесты

• Интеграционные

• End-to-end

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

Модульное тестирование

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

• Быстрота (Fast) - Если тесты выполняются медленно, вам не захочется их

запускать.

• Независимость (Independent) - Один тест не должен создавать условия

для выполнения следующего теста. Все тесты должны выполняться

независимо и в любом порядке.

• Повторяемость (Repeatable) - Тесты должны давать повторяемые

результаты в любом окружении.

• Очевидность (Self-Validating) - Результатом выполнения теста должен быть

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

своевременно.

• Своевременность (Timely)

F.I.R.S.T.

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

TDD и BDD

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

TDD процесс

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

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 стиль написания тестов

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

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 стиль написания тестов

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

Особенности модульного тестирования

• дает возможность писать много тестов, причем

достаточно быстро

• необходимость изолировать участки кода

(mocks, stubs, spies)

• требует понимания кода, который нужно

тестировать (тестирование белого ящика)

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

Существует много инструментов которые позволяют выполнять модульное тестирование JS кода

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

QUnit

Это библиотека от разработчиков jQuery, позволяющая писать unit-

тесты в TDD стиле и имеющая свой механизм assert-ов.

QUnit.test( "hello test", function( assert ) {assert.ok( 1 == "1", "Passed!" );

});

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

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();

});});

});});

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

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);

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

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);

}

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

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);

}); });

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

• Тестирование - это долго и дорого. Разумеется тестирование

увеличивает время на разработку, но уменьшает время,

затраченное на рефакторинг и багфикс.

• Писать тесты – это скучно и нудно. Написание тестов позволяет

еще раз взглянуть на вашу архитектуру и принять правильные

решения

• 100%-ое покрытия. Тестов необходимо ровно столько, сколько

достаточно для выпуска стабильного и надежного продукта.

• Тестирование не позволяет писать код без багов.

Мифы

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

• Заказчик не поддерживает и не принимает идею unit-тестов в

проекте

• Тесты пишутся только для наличия и метрик, а «чистоте» тестов

не уделяется должное внимание

• Вы пишите тесты намного позже создания кода. Тесты не

актуализируются

Ситуации бывают разные

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

?

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

Спасибо!

F O O T E R H E R E 38