Node.js для SDET

Довольно частый вопрос, который я задаю на собеседовании - Самые частые сценарии в практике автотестов - это работа с фаилами и путями в ОС (node:fs и node:path соответственно). Какие еще встроенные модули в node.js ты знаешь? (кроме path и fs). Часто этот вопрос остается без ответа, даже для senior SDET. Что-ж ,- пора закрывать этот гештальт на этом канале и рассказать про модули.

Итак, начнем с того, что встроенных модулей очень много - 62 в документации к node.js v23(latest). Самые полезные или те, с которыми можно встретиться на практике в реальных проектах (fs и path я исключил)

  • process
  • events
  • url
  • utilities
  • timers
  • child process
  • os

Давайте по порядку разберемся(в краце) с каждым из них.

Process - отвечает за текущий запущенный node.js процесс. И самое частый кейс использования модуля - использование env переменных (process.env), и cwd (current working dir) - информация, из какого пути был запущен процесс. Кстати объект process является еще и реализацией Events, поэтому двигаем сразу к нему.

Events - события. Здесь полезно будет знать то, что все репортеры в ваших фреимворках (playwright, cypress, jest, vitest) используют события, которые передают информацию о тесте. Из недавнего - мы для тестов делали универсальное решение для WebSocket. И WebSocket по сути это и есть события между клиентом и сервером. Для фронтенд разработчиков(если такие читают этот канал) - события вешаются на DOM узлы. Например отправить что-то по клику на кнопку - и есть реализация Events.

URL - позволяет работать с URL по стандарту WHATWG API. Т.е. как в браузере.

`const myURL = new URL('/foo', 'https://example.org/');<br>// [https://example.org/foo](https://example.org/foo)`
` ``` `
`**Utilities** - помимо полезных проверок(как например на буффер, UInt8Array, Map, Proxy, Set). Есть еще и такие полезности, как format - форматирует строку также, как и в питоне f или в C - printf. А еще есть inspect(аналог console.dir, но на стероидах). И не забудем про deprecate - который позволяет управлять сложностью проектов. promisify - это вообще отвал башки ,- любая синхронная фукнция теперь может стать асинхронной!`

`**Timers** - казалось, setTimeout и так есть в глобальном объекте. А что если я скажу вам, что setTimeout может рабоать также, как если бы вы написали свой delay. Как, спросите вы меня? Легко - отвечу я.` ```js
import {setTimeout} from 'node:timers/promises'  
await setTimeout(2000) // wait 2 seconds  

Сhild process - позволяет порождать новые процессы внутри уже запущенного процесса. Например вы все работаете на windows, и для поднятия прокси сервера вам выдали exe фаил (не выдуманная история, благо не я работал на этом проекте). Как его вызвать? проще простого! ```js import {exec} from 'node:child_process'<br><br>exec('./proxy.exe') ``` Помните про utils? Так вот, **Child Process** полностью синхронный, но его легко можно превратить в асинхронный

import { promisify } from 'node:util';  
import child_process from 'node:child_process';  
const exec = promisify(child_process.exec);  
  
const { stdout, stderr } = await exec('ls');  
console.log('stdout:', stdout);  
console.error('stderr:', stderr);  

OS - информация о текущей операционной системе. Полезно, когда вы работаете с selenium webdriver и для эмуляции клавиш копирования вызывается разная комдинация клавиш (cmd+C - macos; ctrl+C - windows). А как узнать какая у вас ОС?_ _```js `import os from 'node:os'

function copy() { if(os.platform() === 'darwin') { selenium.sendKeys('cmd', 'c') } else { selenium.sendKeys('ctrl', 'c') } }

А еще, с помощью фукнции cpus можно узнать, сколько у вас ядер у процессора. Часто в настройках параллелизма узказывается значение, равным или кратным значениям от исходного количеству ядер.  
  
Фух, постарался кратко по самым частым модулям пройтись и их использованиям. Пишите в комментарии, какие модули вы не знали или не использовали до этого.  
  
\#nodejs #javascript #sdet #selenium  
@haradkou_sdet_