JS Lab2017, 25 марта, Одесса
Евгений Сафронов (Senior developer at DataArt)
Тестирование Javascript кода. Инструменты, практики, тренды
О тестах и качестве с различных точек зрения и ракурсов. Тестирование, выполняемое разработчиками. Основные тренды, методы и инструменты для тестирования Javascript кода. Лучшие практики и подходы.
Все материалы: http://jslab.in.ua/
Организаторы: http://geekslab.org.ua/
9. 25.18% Структурные
22.14% Данных
16.19% Реализация функциональности
9.88% Конструирования
8.98% Интеграции
8.12% Функциональных требований
2.76% Определение и выполнение
тестов
1.14% Архитектура ПО
4.71% Другие
9
Типы ошибок в проектах
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)
• требует понимания кода, который нужно
тестировать (тестирование белого ящика)
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();
});
});
});
});
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-тестов в
проекте
• Тесты пишутся только для наличия и метрик, а «чистоте» тестов
не уделяется должное внимание
• Вы пишите тесты намного позже создания кода. Тесты не
актуализируются
Ситуации бывают разные