От автора: я уверен, что вы читаете это и думаете: «Уже существует миллион шаблонов для того, чтобы делать тестирование JavaScript. Зачем миру нужен еще один?»
Это была и моя первая мысль. Я работал над проектом и решил, что хочу добавить некоторые модульные тесты. Я попробовал AVA. Потом попробовал Tape. Потом Mocha. Тогда Jest. Через три часа я вернулся к тому, с чего начал. Ничего не получилось. Я застрял в борьбе с настройками Babel, модули ES6 не могли быть импортированы / обработаны, внешние зависимости, тестовые конфигурации и т. д. Я все больше и больше расстраивался.
Как человек, который уже давно пишет программное обеспечение, я могу только представить, что должны были чувствовать новички, если у меня возникли такие проблемы. Я подозреваю, что многие люди сдаются и заканчивают тем, что вообще не пишут никаких тестов.
Разнообразие инструментов
Теперь читатели должны были бы возразить: «Но сэр, очевидно, вы идиот. Я использую эти фреймворки, и их так легко настроить. Чтобы поставить их и запустить, требуется несколько минут».
Мои поздравления. Я рад за вас. Я не говорю, что мой опыт разделяют все. Это зависит от конкретного проекта, над которым вы работаете.
В любом случае, вы должны, по крайней мере, согласиться с тем, что различные инструменты сборки JavaScript делают выполнение тестов для вашего проекта более сложным, чем должно быть.
Karma, Mocha, Jasmine, Jest, Sinon, Chai, AVA, Babel, Gulp, Grunt, Webpack, Buble, Rollup, jsdom, это только некоторые из них.
Существуют разнообразные наборы кодов шаблона, которые вы должны написать, прежде чем сможете создать один тест. Я подсчитал более 50 вариантов конфигурации в документации Karma, и многие из них имеют свой собственный набор подпараметров! Тот факт, что Karma является инструментом для запуска других инструментов для запуска модульных тестов и что вступительное видео длится около 15 минут, должно рассказать вам все, что вам нужно знать.
Для большинства систем тестирования требуются плагины или другие инструменты, чтобы делать простые вещи, такие как охват кода. Их не всегда сложно добавить, но это еще один лишний шаг, который вы должны предпринять.
В некоторых средах проводить тестирование с помощью браузера нелегко или даже невозможно, несмотря на то, что большинство JavaScript-кода написано для запуска в браузере. Подумайте об этом на секунду. Они предлагают вам использовать jsdom, инструмент node , который имитирует DOM браузера на стороне сервера. Конечно, это может подходить для некоторых ситуаций, но не следует ли устанавливать тесты для браузера по умолчанию?
Решение
В последнее время я много писал о go, и мне очень нравится, как тестирование go встроено непосредственно в язык. Вы можете буквально создать файл, добавить некоторые тесты и запустить их, не устанавливая никаких внешних зависимостей.
Это часть того, что вдохновило меня на создание Luna. Я искал единую тестовую платформу, которая бы просто работала и не требовала каких-либо сумасшедших настроек или внешних библиотек. Я хотел бы иметь возможность добавлять тестовую функцию в любом месте своего кода, запускать тест и видеть результат. В результате у Luna нет никаких настроек.
Чтобы достичь этого, она делает некоторые предположения о среде, в которой вы работаете. Ваши тесты должны быть написаны как модули ES6, и ваш код тоже. Luna не транспилирует никакой исходный код, за исключением JSX. Это означает, что если вы используете Coffeescript или Typcript, вам пока не повезло.
Как это работает?
Luna ищет любые функции, чьи имена начинаются с test, которые экспортируются из любых файлов и каталогов, которые вы ей укажете. Затем она использует API Rollup для динамического создания тестового запущенного пакета в памяти. Каждая тестовая функция вызывается и ей передается экземпляр объекта с одним методом assert. Результаты передаются обратно в основной процесс, используя console log.
Это означает, что все самодостаточно, и глобальные переменные не требуются. Кроме того, вам не нужно импортировать какие-либо пользовательские библиотеки для запуска тестов, так как сами тестовые функции извлекаются из вашего кода.
Другие преимущества
Из-за того, как работает Luna, вы можете включать тестовые функции в любом месте, в том числе в самих исходных файлах. Примечание. Это рекомендуется только в том случае, если вы используете tree shaking, когда вы создаете свои рабочие пакеты, чтобы вычистить тестовый код.
Тестирование в браузере встроено и выполняется по умолчанию. Она использует puppeteer, чтобы работать в последней версии Chromium.
Она поддерживает параллелизм с применением очереди обратного ввода, чтобы тесты могли выполняться параллельно. Это полезно, если в некоторых тестах интенсивно используется процессор или для их запуска требуется некоторое время.
Она автоматически генерирует отчеты об охвате кода без необходимости установки каких-либо дополнительных библиотек (передайте флаг -no-coverage, чтобы отключить их).
Luna будет автоматически переводить и применять карты источников для получения отчетов об охвате кода и отслеживания стека, когда ваши тесты выдают ошибку, хотя Puppeteer не поддерживает их.
Функция assert, используемая Luna, вдохновлена power-assert, поэтому, если ваш тест не проходит, вы можете увидеть, какая именно часть оператора дала сбой, вместо общего сообщения типа: Failed asserting that false is true. Ниже приведен пример вывода неудачного теста:
test/test-assert.js ❌ testGetData 24 25 t.assert(data3.message === 'Something should be false'); 26 | "Something should be true"
Она поддерживает сравнение с массивами и объектами без использования какого-либо настраиваемого синтаксиса (просто используйте == или != для сравнения):
t.assert(list == ['one', 'two', 'three']);
Она автоматически компилирует код JSX в синтаксис React.createElement.
Тесты Luna запускаются Luna. Как здорово!
Заключение
Я уверен, что это не идеальная платформа, потому что нет серебряной пули, которая подойдет для всех, особенно учитывая состояние JavaScript разработки на сегодняшний день, но я считаю, что это шаг в правильном направлении, и я надеюсь, что другие люди тоже так думают и найдут это полезным для себя!
Вы можете узнать больше и прочитать полную документацию на GitHub. Также обязательно ознакомьтесь с страницей введения проекта.
Автор: Craig Campbell
Источник: https://itnext.io/
Редакция: Команда webformyself.