4_Сабирянов.pptx
- Количество слайдов: 13
Тестирование в Java. Script больше не жесть, а Jest npm install --save-dev jest
Установка и настройка Тесты повышают надежность системы Это не моя работа — тестировать код
Простой пример function sum(a, b) { return a + b; } describe('add()', function() { test('adds 1 + 2 to equal 3', () => { // Arrange const var 1 = 1; const var 2 = 2; const expected = 3; // Act const actual = sum(var 1, var 2); // Assert expect(actual). to. Be(expected); }); Тесты ускоряют разработку PM сказал на юнит тесты нет времени!
Немного об API Expect • Сравнение объектов expect(data). to. Equal({one: 1, two: 2}); • to. Be. Null, to. Be. Undefined, to. Be. Truthy, to. Be. Falsy • Сравнение чисел to. Be. Greater. Than, to. Be. Less. Than, to. Be • Сравнение строк с помощью регулярок • Работа с массивами • Ожидиние исключений expect(compile. Android. Code). to. Throw(); Тесты дают уверенность, что ваши коллеги не сломают ваш код Я всегда могу проверить код вручную!
Тестируем асинхронный код test('the data is peanut butter', done => { function callback(data) { expect(data). to. Be('peanut butter'); done(); } fetch. Data(callback); } ); Тесты влияют на архитектуру проекта. SOLID Мой код слишком сложно тестировать!
Тестируем асинхронный код. Promise test('the data is peanut butter', () => { expect. assertions(1); return fetch. Data(). then(data => { expect(data). to. Be('peanut butter'); }); Запуск юнит-тестов занимает слишком много времени
Моки. describe('product. Data. Context tests', () => { test('get. Products with filter', () => { const api = require('infrastructure/api'); let mock. Func = api. v 1(). retailpoint(). catalog(). inventory(). get; UI компонент Бизнес логика let retail. Point. Id = 1; let start = 0; Http let count = 50; let filter = 'name'; return data. Context. get. Products(retail. Point. Id, start, count, {filter}). then((actual. Result) => { expect(actual. Result). to. Be. Truthy(); expect(mock. Func). to. Be. Called. With({start: start, count: count, q: ': quick. Search="name"'}); }) Пфф. . Мне проще дергать API Тесть проверяет только }) в тесте. Заодно и сервер код с которым }); проверю! взаимодействует
Тестируем компоненты. Снепшоты test('Infinate default class on loading=false', () => { const loading = false; const component = renderer. create( <Infinate. Scroll load. Next={load. Next} total. Count={items. Length} list. Length={50} loading={loading}/> ); let tree = component. to. JSON(); expect(tree). to. Match. Snapshot(); }); Уф. . А как же кроссбраузерность?
Тестируем компоненты. Снепшоты exports[`Infinate default class on loading=false 1`] = ` <div class. Name="table_row" style={null} > <span style={ Object { "font. Size": 0, } } /> Я не могу протестировать </div> код, потому что я точно не `; знаю, как он должен работать
Тестируем компоненты. DOM test('Call open. Product', ()=>{ const product = get. New. Product. Item(); const selected. Point = '1'; const open. Product = jest. fn(); const rendered. Component = shallow( <Product. Item item={ product } key={product. invent. Code} on. Product. Click={open. Product}/> ); rendered. Component. find('div. row_link'). simulate('click', product. invent. Code, selected. Point); expect(open. Product). to. Have. Been. Last. Called. With(product. invent. Code, selected. Point); });
Отчеты, покрытие
Итоги. Какие плюшки? • Удивительно прост в интеграции в проект • Умеет запускать каждый тест в отдельном процессе • Умеет работать с асинхронным кодом и тестировать код, использующий таймеры • Умеет автоматически создавать «заглушки» для импортируемых компонентов • Умеет работать в интерактивном watch-режиме • Умеет собирать coverage • Содержит jsdom и умеет запускать тесты без браузера Ну ок, я • Snapshots попробую…может быть…когда будет время
Спасибо за внимание https: //vk. com/ufadevcom https: //www. facebook. com/Ufa. Dev. Com/ r. sabiryanov@modulbank. ru
4_Сабирянов.pptx