tldr: мы сделали это: jest-os-detection

Контекст

В Doctolib мы пишем собственный код, чтобы наше веб-приложение взаимодействовало с собственным программным обеспечением, которое используют наши пользователи. Мы поддерживаем MacOS и Windows для этого продукта. Этот собственный код, написанный на Node.js (в пакете PKG) и C ++, следует тому же жесткому правилу, что и остальная часть нашей кодовой базы: непроверенный код - это незаконченный код!

Чтобы эти тесты выполнялись на всех поддерживаемых нами ОС, мы используем Azure Devops. Это позволяет нам запускать одни и те же тесты на компьютерах с Windows и Mac. Во время разработки эти тесты запускаются на наших собственных компьютерах (в основном Mac, но также и Linux).

В большинстве случаев это нормально. Для модульных тестов вы можете имитировать системные вызовы, чтобы имитировать ответы, поэтому нет необходимости быть зависимой от ОС. Но в нашем случае у нас также есть сквозное тестирование, и мы даже тестируем результат выполнения нашего установщика программного обеспечения! Поэтому мы должны протестировать использование нами конкретных функций ОС (таких как реестр Windows). Это привело нас к ситуации, когда нам приходилось писать специальные тесты для Windows или MacOS, все они являются частью одного набора тестов, чтобы они не выходили из строя при работе на неправильной платформе.

Есть разные подходы к решению этой проблемы. Я опишу несколько здесь и объясню, как мы решили решить эту проблему здесь, в Doctolib.

Первое решение: разделить тесты

Один из простых способов решить эту проблему - использовать разные наборы тестов. Один глобальный работает на всех хостах, один для Windows и один для MacOS. Это нормально работает. Например, у нас есть специальный набор тестов для тестов установщика. Но вы получите дублированную архитектуру. При поддержке Mac и Windows у вас будет три папки:

Это работает, но мы потеряем возможность группировать тесты так, как мы хотим: по функциям. Поэтому мы решили пойти другим путем.

Немного лучше: использование операторов if

Вы также можете просто отключить тесты на основе операторов if. Если вы хотите, чтобы ваш тест запускался только в Windows, вы можете написать что-то вроде:

Действительно, немного лучше, но это уже много шаблонов. Кроме того, тест не будет отображаться в ваших результатах. Наихудший случай был бы, если бы вам пришлось инкапсулировать все файлы в тестовом файле следующим образом: jest просто вылетит из строя, потому что он откажется запускаться с файлом, не содержащим тестов.

В идеале: динамический пропуск тестов

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

Уже лучше, правда? Ваш отчет о тестировании будет содержать пропущенный тест на Mac, и он будет запущен в Windows. И на этот раз шутка не выйдет из строя, если пропустить весь ваш тестовый файл!

Теперь давайте немного уменьшим шаблон.

Обнаружение Jest OS

Очевидно, что если вы хотите применить это к любой ОС и ко всем возможным методам, экспортируемым из Jest, это будет утомительно и приведет к появлению большого количества избыточного кода. К счастью, мы сделали это за вас.

Все, что вам нужно сделать, это установить jest-os-detect и добавить его в свою конфигурацию (следуйте инструкциям readme), после чего вы сможете написать такой код, как:

Поддерживается большинство функций Jest. Вы можете просто добавить skipWindows или onWindows (или любую другую платформу) к вызову jest, и мы обязательно перенаправим его только на нужную ОС.

Ясно, что это всего лишь синтаксический сахар, но он помогает сделать код более читабельным. А поскольку он может быть полезен другим, мы подумали, что опубликуем его на npm.

Хотите получить доступ к большему техническому контенту? Не стесняйтесь подписаться на информационный бюллетень docto-tech-life, чтобы читать нашу еженедельную подборку технических сообщений!