Found 12 bookmarks
Custom sorting
Test Assertion Styles in JavaScript
Test Assertion Styles in JavaScript

Короткая заметка про разные стили работы тестовых фреймворков в JS (в целом актуально и не только для JS)

Есть 2 типа тестовых тулзов: spec и tap. Spec - это когда мы тесты обозначаем специальной функцией и когда она выкидывает исключение - мы считаем что тест упал. Если же исключение не было выкинуто - тест прошел. Tap - это когда есть специальное API для проверок и проверки либо проходят либо нет.

Типичный пример в spec-подходе:

describe('account', () => { it('has a balance of zero when first created', () => { // if this throws, the test fails expect(new Account().balance).to.equal(0) }) it('has an empty list of initial addresses', () => { expect(new Account().addresses).to.match([]) }) })

Типичный пример в tap-подходе: t.test('account', async t => { const a = new Account() t.equal(a.balance, 0, 'balance of zero when first created') t.match(a.addresses, [], 'empty list of addresses') t.test('credits', async t => { a.credit(100) t.equal(a.balance, -100, 'negative balance after credit') a.debit(200) t.equal(a.balance, 100, 'positive balance after debit') }) })

В первом сниппете кода границы тесты - это describe и it.

Во втором же сниппете используется объект t, который умеет делать проверки и композировать их через test. При этом "тестов" в привычном понимании там нет, только проверки. Минимальный tap тест выглядит так t.ok(cond, message)

То есть, разница подходов - разница в абстракции, вокруг которых они крутятся. Для spec - это тесты, для tap - проверки.

Автор также указывает на разницу, что в spec-подходе it и describe определяются тест-ранером (а значит нельзя запустить тесты на чисто nodejs) и обязательно нужно выделять describe => it, но, кажется что в реальности это не так (т.к. все таки есть тулы, где эти функции нужно импортировать явно, а тесты могут запускаться без отдельного тест-ранера)

·blog.izs.me·
Test Assertion Styles in JavaScript
A compilation of outstanding testing articles (with JavaScript)
A compilation of outstanding testing articles (with JavaScript)

Подборка статей про автоматическое тестирование от консультанта в этой сфере. Подборка содержит 10 статей, обязательных к прочтению (по мнению автора) + 10 ссылок на полезные материалы

Список статей весьма хороший. Часть из них я уже читал (и вероятно они даже есть где-то в этом канале), часть, видимо, прочту в скором времени

Рекомендую к ознакомлению

·practica.dev·
A compilation of outstanding testing articles (with JavaScript)
Testing the dark scenarios of your Node.js application
Testing the dark scenarios of your Node.js application
Обычно nodejs разработчики пишут авто-тесты на функционал: обрабатывают позитивные и негативные сценарии работы логики. Однако разработчики часто забывают про простые тесты, которые проверяют работу приложения вне конкретной функциональности В статье описываются, какие простые и короткие тесты стоит писать на любое node.js приложение. Хотя в целом это касается не только node.js, но эта статья посвящена именно node.js и есть несколько специфичных кейсов Какие тесты следует писать: - The zombie process test: проверка, что приложение закрывает текущий процесс, если случилось что-то непредвиденное. Если приложение не убивает свой процесс в случае, когда оно не смогло инициализироваться, то может сложится ложное впечатление, что приложение работает (процесс то запущен), когда оно не смогло стартовать - The observability test: проверка, на то что ошибки корректно уходят в логгер - The 'unexpected visitor' test - проверка на обработку непойманных исключений (`uncaughtException`) - The 'hidden effect' test - мы часто проверяем, что в случае успеха мы делаем какой-то сайдэффект (например, записываем данные в БД), но мы часто упускаем проверку, что в случае неуспеха мы НЕ выполняем этот сайдэффект - The 'overdoing' test - проверка, что функционал не делает лишний сайдэффект. Очень близко к предыдущему кейсу, но немного про другое: проверка, что в случае успеха, делаются только нужные сайдэффекты, а ненужные - не делаются - The 'slow collaborator' test - обработка таймаутов - The 'poisoned message' test - проверка на обработку "сломанной" структуры данных. Часто мы предполагаем, что у нас есть контракт и все ему следуют, но что если это не так? - Test the package as a consumer - мы пишем юнит-тесты на свои npm-пакеты, но это не гарантирует нам, что у пользователя все будет работать корректно. Например, мы можем криво сконфигурировать сборку. Поэтому следует проверять работу пакета с точки зрения пользователя - делая импорт пакета или вызывая его cli - The 'broken contract' test - еще 1 тест на сломанный контракт. Когда я описывал "poisoned message" я сразу поднял уровень абстракции до сломанного контракта. Эти 2 пункта про сломанный контракт, но немного различны в нюансах (там - про сообщения из шины событий, здесь - про доверие OpenAPI спеке)
·practica.dev·
Testing the dark scenarios of your Node.js application
Dependency Composition
Dependency Composition
Очень хорошая статья в блоге Мартина Фаулера одновременно про проектирование через TDD и выделение зависимостей в коде без фреймворков. Код написан на typescript (все чаще в блоге Мартина Фаулера фигурирует код на javascript или typescript) Автор пытается решить следующую историю: пользователь хочет получить список лучших ресторанов, по мнению других пользователей. Автор последовательно, без фреймворков и следуя TDD, по немногу заводит сущности и сразу проектирует, как они должны друг с другом взаимодействовать. Сначала описывает верхнеуровневые детали, затем по-немногу погружается в домен и описывает зависимости, необходимые бизнес-логике для работы. Также автор следует бест-практисам, разделяя инфраструктурный код и бизнес-логику приложения. Код, который ищет лучшие рестораны, не знает ни о HTTP, ни о базах данных. Очень интересна реализация DI - автор просто берет и примяеняет Partial Application в создании хендлера запроса, в который кидаются зависимости (например, функция получения списка ресторанов) и которая возвращает обработчик запроса. Статья очень хороша по следующим причинам: - Очень хорошо объясняется, как применять прицнипы чистой архитектуры при проектировании сервиса - Очень хорошо объясняется, как использовать TDD при проектировании сервиса и его зависимостей - Автор не задается вопросом, а какой способ делать DI (pure, IoC container, etc) или какая библиотека для DI лучше - он его просто делает. В Javascript есть возможность применять Partial Application - этого УЖЕ достаточно для реализации DI - Объясняются концепции хорошего кода Рекомендую к прочтению
·martinfowler.com·
Dependency Composition
Trying Node.js Test Runner
Trying Node.js Test Runner
Хороший обзор нового встроенного в nodejs test runner'а. В обзора сравниванются функциональные возможности ранера по сравнению с существующими. В целом, node:test выглядит достаточно неплохо: - Есть watch режим - Можно приладить кастомные репортеры, которые умеют обрабатывать Tap репорт - Есть базовые асерты, но вывод ошибок в консоль неудобен. Ошибка есть, но где именно разница - непонятно. - Есть возможность распаралеллить тесты в рамках 1го файла. - Есть функционал для мокирования. Как функций так и целых модулей - Есть возможность указать отдельный лоадер для запуска, например, ts файлов - Немного странное решение с выполнением определенных тестов через `only` - по умолчанию раннер игнорирует эту опцию и учитывает её только с определенным флагом. Это расходится с уже устоявшимся паттерном "если в файле есть only - то только они и запускаются, на прекомите запрещаем комитить only" - Есть сбор code coveraage В общем, выглядит достаточно неплохо и не требует установки кучи пакетов, что уже плюс.
·glebbahmutov.com·
Trying Node.js Test Runner
Make Your React Tests Easier to Write, Understand and Maintain
Make Your React Tests Easier to Write, Understand and Maintain
Статья про то, как отделить реализацию тестов на компонент от реализации самих компонентов. Автор предлагает делать отдельный API для тестов, который инкапсулирует в себе взаимодействие с компонентом. Вообще такой паттерн уже есть и называется Page Object (название, победившее все другие варианты в далеких 200х годах), но автор зачем-то вводит новое понятие Component Object Model (далее COM), который полностью повторяет смысл. На примере простого компонента, который нужно протестировать, автор вводит для него COM описывающий, как взаимодействовать с компонентом (заполнять форму) и как получать его текущее состояние (например, текст с верстки) Это удобно по нескольким причинам: - Изменения в коде приложения не влияют на код тестов. Максимум, что потребуется поменять - код COM. Это достигается тем, что COM инкапсулирует в себе знания о реализации компонента - Код тестов читается легче. Вместо "кликни на кнопку с селектором таким-то" в коде теста видно "отправь форму" - COM может быть переиспользован между разными тестами У меня про это даже доклад был на одной из конференций, но я это называл просто Page Object. Мы в проекте активно использовали эти абстракции. В идеале, один интерфейс Page Object может быть использован и для браузерных тестов и для тестов на jsdom. В более идеальном случае Page Object можно написать единый для двух видов тестов (однако тут есть свои требования к стеку и, возможно, есть ограничения, которых я не вижу). В целом идея делать удобное API для тестирования функционала - это правильно. Даже в обычных юнит-тестах разработчики, когда им надоедает писать один и тот же бойлерплейт, выносят внутренние тестовые утилки. Иногда даже идут дальше - готовят кастомные асерты. Но обычно всем лень сделать шаг дальше - выделять API для тестирования субъекта, которое сделает тесты читаемыми, защитит тесты от рефакторинга и сделает создание тестов более легким. Статью рекомендую к прочтению т.к. она очень коротко и ясно показывает плюсы создания Page Object.
·itnext.io·
Make Your React Tests Easier to Write, Understand and Maintain
Using Github Copilot for unit testing
Using Github Copilot for unit testing
В статье описывается, как с помощью Copilot писать юнит-тесты. Пример достаточно простой, но тем не менее выглядит впечатляюще. Автор покрывает тестами простую чистую функцию. Автор описывает название сценария, а сам код теста описывает Copilot. Copilot понимает, что от него хотят и генерирует корректный jest-код. При этом автор сначала описал тесты с помощью coplilot, а только потом пошел делать реализацию.
·strictmode.io·
Using Github Copilot for unit testing
Code coverage with Storybook test runner
Code coverage with Storybook test runner
Сначала storybook добавили для историй поле play, в которое можно складывать необходимые взаимодействия с компонентом Потом они добавили возможность писать там асерты и использовать истории как тесты Теперь же выходит статья про то, как собирать test coverage с этих тестов. В общем-то по ссылке доступна очень короткая инструкция про сбор test coverage у storybook тестов. Достаточно интересная возможность. Радует, что команда развивает storybook не только как песочницу или витрину для компонентов, но и как инструмент тестирования. О том что storybook - инструмент тестирования в первую очередь, я говорил на своих докладах последние пару лет. Но теперь storybook сам делает удобное API для тестирования и костылить что-то самому нужно намного реже.
·storybook.js.org·
Code coverage with Storybook test runner
HTTP Testing with Hurl in node.js
HTTP Testing with Hurl in node.js
Статья про hurl - инструмент на rust для тестирования http серверов. Hurl позволяет писать тесты вида: - сделай запрос - проверь его заголовки - сделай дополнительный запрос - проверь его Автор приводит в плюс скорость его работы, хотя я пока не сталкивался с ситуацией, чтобы тестирование через http-запросы было медленным. Также автор говорит, что его студентам было легче писать тесты, используя hurl. В целом выглядит интересно и стоит запомнить, что есть вот такой инструмент для тестирования, который подходит для интеграционного тестирования и контрактного тестирования. Пример теста на hurl ``` # 1. Get the GitHub user info for @Orange-OpenSource GET https://api.github.com/users/Orange-OpenSource # 2. We expect to get back an HTTP/2 200 response. Also, assert # various things about the Headers and JSON body. Finally # capture the value of the `blog` property from the body into # a variable, so we can use that in the next step. HTTP/2 200 [Asserts] header "access-control-allow-origin" == "*" jsonpath "$.login" == "Orange-OpenSource" jsonpath "$.public_repos" = 286 jsonpath "$.folowers" isInteger jsonpath "$.node_id" matches /^[A-Za-z0-9=]+$/ [Captures] blog_url: jsonpath "$.blog" # 3. Get the blog URL we received earlier, GET it, and make # sure it's an HTML page GET {{blog_url}} HTTP/2 200 [Asserts] header "Content-Type" startsWith "text/html" ```
·blog.humphd.org·
HTTP Testing with Hurl in node.js
What Cypress E2E testing has taught us about our code
What Cypress E2E testing has taught us about our code
Статья, рассказывающая про опыт использования cypress для написание е2е-тестов, а конкретно про проблемы, с которыми столкнулась команда и как она их решала и, заодно, делала продукт лучше в плане доступности
·dev.to·
What Cypress E2E testing has taught us about our code
Release v1.22.0 · microsoft/playwright
Release v1.22.0 · microsoft/playwright
Вышел playwright 1.22 в котором добавили супер крутую фичу - возможность тестировать компоненты в playwright. Если вы следите за cypress, то у них давно был описан концепт вида "просто импортируй в код файл компонента, отрендери его и пользуйся cypress для тестирования компонента". Сейчас, если я правильно помню, этот концепт находится в бете. И вот playwright реализует ту же самую идею у себя. Но, в отличии от cypress - playwright более низкоуровневый и быстрый (мое имхо) инструмент. Возможность, пока что, добавлена как экспериментальная. Мое мнение, что тестирование вида - импортируем компонент, рендерим его в браузере, взаимодействуем с ним - это очень крутая схема, если удасться добиться стабильности и большой скорости работы таких тестов.
·github.com·
Release v1.22.0 · microsoft/playwright
A Journey in Test Engineering Leadership: Applying Session-Based Test Management
A Journey in Test Engineering Leadership: Applying Session-Based Test Management
Статья про Session-Based Test Management. Метод был описан еще в нулевых. Если коротко, то метод предлагает ставить процесс тестирования примерно так: - Лид группы определяет стратегию и план тестирования - Тестировщики тестируют - В конце тестирования создается отчет, в котором, в том числе, указываются сколько времени ушло на само тестирование, сколько на поиск багов и сколько на административную рутину - После этого мы можем анализировать, как бы улучшить процесс тестирования На мой взгляд достаточно бюрократизированная схема, но она хотя бы имеет цикл обратной связи. И кажется она подходит для бучения джунов-тестеров.
·infoq.com·
A Journey in Test Engineering Leadership: Applying Session-Based Test Management