Тестирование JS API Яндекс.Карт

Денис Хананеин, Яндекс.

Тестирование JS API Яндекс.Карт

Денис Хананеин, разработчик интерфейсов, Яндекс

Зачем нужно unit-тестирование?

Коротко о JS API

История

© Matt Groening, 20th Century Fox, Futurama

История

Подключение окружения

			<script src="../../test/yui3combo/combo.js">
		    <link href="../../test/yui3combo/combo.css"/>
		    // helper
		    <script src="../../test/run-test-case.js">
		

Копировать — вставить

Тесты выглядели примерно так

			testMapEvent: () => {
			  // какие-нибудь действия
			  Y.assert(
			     res == '256,256/0,0/328,228' && aliasRes == res,
			     'Координаты вычислены неправильно, получено: ' + res
			  );
            }
		

В чем проблема

Асинхронные

            ymaps.geocode('174.184804,77.380152').then(res => {
              this.resume(() => {
                Y.assert(len == 34,'неверное количество геообъектов');
              });
            }, this);
			this.wait(// Y.error);
		
© Matt Groening, 20th Century Fox, Futurama

Переезд

Хотим

Масштабы

Стратегии

© Matt Groening, 20th Century Fox, Futurama

Вариант #1. Всей командой

Плюсы Минусы
быстро дорого
вся команда понимает,
как писать тесты
у всех есть задачи
все любят писать тесты…

Вариант #2. Найдем крайнего

Плюсы Минусы
команда работает человека жалко
есть ответственный долго
если стажер или практикант —
хорошее знакомство с проектом
команде сложно начать
писать тесты

Вариант #3. Демократично

Плюсы Минусы
переписывание выполняется в фоне долго
есть время разобраться и понять,
как что работает
очень-очень долго
быстро привыкается к хорошему в проекте две версии тестов

Демократия

© Matt Groening, 20th Century Fox, Futurama

Правила

Если рефакторинг ломает много старых тестов,
допускается просто поправить их.

© Matt Groening, 20th Century Fox, Futurama

Map.test.js

			ymaps.modules.define('test.Map', [
			  'Map',
			  'util.bounds'
			], function (provide, Map, utilBounds) {
			  // Тесты
			});
		

Тест

			describe('Map', function () {
			  it('Должен изменить центр карты', done => {
			    myMap.setCenter([55, 37]).done(newCenter => {
			      expect(newCenter).to.be('55,37');
			      done();
			    });
		

Тесты простые, для асинхронных интерфейсов нужно просто вызвать done

Сейчас

Готово

© Matt Groening, 20th Century Fox, Futurama

Тестирование асинхронных интерфейсов

© Matt Groening, 20th Century Fox, Futurama
© Matt Groening, 20th Century Fox, Futurama

Проблема

Часто в проекте есть зависимость от какой-либо библиотеки. Ещё она сама может загрузить за что-нибудь. В Mocha окружение у тестов всегда одно — скрипты один раз подгрузились и всё.

Например

Несколбко тест-кейсов создают в BODY инпут и что-то с ним делает. Может оказаться, что инпут уже есть, ID не уникальный и т.д.

После склейки запускается одновременно N процессов mocha-phantomjs (остальные ставятся в очередь), в которые утилита передает страницу и имя теста с параметром в качестве URL.

server.ru/tests.html?module=test.control.Button

Парсинг в tests.html

			// Получим список модулей.
			let module = util.get('module', 'all');
			// Подгрузим и запустим необходимые.
			ymaps.modules.require(module, () => {
			  // Run mocha
			});
		

Map.test.js

			ymaps.modules.define('test.Map', [
			  'Map',
			  'util.bounds'
			], (provide, Map, utilBounds) => {
			  // Тесты
			});
		
			passing: 107
				  'test.LoadingObjectManager'
				  'test.ObjectManager'
				  'test.RemoteObjectManager'
			
				  'test.objectManager.overlays'
			 
			failing: 0
		
© Matt Groening, 20th Century Fox, Futurama

Да, но…

Планы

zloy.me/talks/tests/

Информация об API

Тестирование JS API Яндекс.Карт

Денис Хананеин, разработчик интерфейсов