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_