Async pipe не чистий: розвінчуємо міф
Якщо ви працювали з Angular, то напевно знайомі з async pipe — зручним способом підписки на Observable прямо в шаблоні. Але в певний момент ви могли почути фразу: “Async pipe не чистий”. Що це означає і чи справді є підстави для занепокоєння? Розбираємось по-людськи.
Що таке pure та impure pipes в Angular
У Angular pipes поділяються на “чисті” (pure) та “нечисті” (impure). Чиста pipe виконується лише тоді, коли змінюється вхідне значення. Нечиста — щоразу, коли Angular запускає зміну детекції (а це часто).
У декларації pipe:
@Pipe({
name: 'customPipe',
pure: false
})
Якщо pure: false, Angular буде викликати цю pipe набагато частіше.
Async pipe і її поведінка
Async pipe виглядає зручним:
<p>{{ user$ | async }}</p>
Вона автоматично:
- підписується на Observable;
- повертає останнє значення;
- відписується при знищенні компонента.
Однак за капотом async pipe є нечистою. Вона викликається кожного разу, коли Angular виконує change detection, щоб перевірити, чи не змінилось значення Observable.
Чи це погано?
Не зовсім. Angular оптимізований для роботи з таким шаблоном, і більшість змін не є критичними. Але якщо:
- ваш компонент часто оновлюється (через
setInterval, події чи сторонні тригери);
- є велика кількість async pipe в одному шаблоні;
- ваші Observables складні, потребують перерахунку;
…ви можете помітити погіршення продуктивності.
Альтернативи та підходи
- Передплата в компоненті:
ngOnInit() {
this.user$?.subscribe(user => this.user = user);
}
Але потрібно не забути unsubscribe.
- Push ChangeDetectionStrategy + сигналізація: Використання OnPush та Subject’ів/Signal’ів для більш контрольованих оновлень.
- Memoization та кастомні pipes: Якщо ви точно знаєте, що значення не змінюється щодня — кешуйте.
Висновок
Async pipe — зручний, безпечний і загалом ефективний інструмент. Але варто пам’ятати, що він не є “чистим” у сенсі Angular. Це означає, що для критично навантажених компонентів чи у високочастотних потоках даних його краще замінювати або контролювати.
Знання про “нечистоту” async pipe не має лякати — воно допоможе писати більш ефективний код, коли це справді потрібно.
Vue: Composables та TypeScript — це не Mixins і точно не просто JS
Світ Vue значно еволюціонував: від звичних нам Options API та Mixins — до Composition API з Composables, де ще й TypeScript додає своїх барв. І хоча це виглядає як крок уперед, для багатьох розробників перехід стає справжнім викликом. Давайте розберемося по-людськи, чому з Composables і TypeScript не так просто — але дуже перспективно.
Що не так із Mixins?
Mixins колись здавалися зручним рішенням. Хочеш повторне використання логіки — імпортуй міксин. Але з часом виявилось:
- важко зрозуміти, звідки береться яка змінна;
- імена методів можуть конфліктувати;
- складно відстежити залежності й типи;
- TypeScript взагалі не в захваті.
Composition API: прозорість і контроль
Composables — це просто функції, які повертають реактивну логіку. Наприклад:
export function useUser() {
const user = ref(null);
const isLoggedIn = computed(() => !!user.value);
return { user, isLoggedIn };
}
Це легко тестувати, передавати в інші компоненти, розширювати. Але коли ви додаєте TypeScript, то починається гра в типи.
TypeScript: краса та біль
З одного боку, TS допомагає:
- зробити API Composable-функцій зрозумілим;
- зловити помилки на етапі компіляції;
- покращити автодоповнення.
З іншого боку, типізація ref, computed, watch часто потребує додаткових зусиль:
const user = ref<User | null>(null); // потрібно явно вказувати тип
А ще буває складно правильно описати типи для повернених об’єктів, особливо якщо вони змінюються динамічно.
Common pain-points
- Під час міграції зі старих міксинів усе виглядає занадто новим.
- Якщо не структурувати проєкт, Composables можуть стати хаосом.
- TypeScript із реактивними змінними вимагає розуміння тонкощів unwrap/ref.
Як зробити життя простішим?
- Пиши дрібні Composables. Нехай кожен вирішує одну задачу.
- Типізуй одразу. Використовуй
ref<Type>(), навіть якщо здається зайвим.
- Дотримуйся єдиної структури. Назви, шляхи, імпорти — усе має бути передбачуваним.
- Використовуй ESLint + Volar. Це рятує від багатьох типових помилок.
- Обирай підхід, який зручний саме для вашої команди. Composition API — не панацея, але має багато плюсів.
Висновок
Composables і TypeScript у Vue — це як вивчити нову мову після років спілкування на знайомій. Спершу здається, що все складно, але з часом приходить прозорість, гнучкість і задоволення від чистої архітектури. Mixins були зручним рішенням свого часу, але майбутнє Vue — за типізованими, добре структурованими composable-функціями.
І навіть якщо зараз здається складно — це той випадок, коли «важче» означає «краще».
Веб-агенти, які дійсно розуміють веб-сайти: як шар сприйняття Notte вирішує проблему DOM
Більшість сучасних AI-агентів, які працюють у браузері, стикаються з тим самим викликом: DOM-дерево. Це могутня, але надзвичайно складна структура, створена не для машинного сприйняття, а для рендерингу інтерфейсу. DOM постійно змінюється, має безліч станів і контекстів, а елементи — непрозору семантику. Тож чи може штучний інтелект дійсно «бачити» веб-сайт, як це робить людина? Саме на це запитання відповідає підхід платформи Notte.
Проблема: DOM — це не реальність, а її відображення
DOM — це не просто структура. Це інтерфейс між HTML, CSS, JavaScript і користувачем. Наприклад, одна й та сама кнопка може поводитися по-різному в залежності від класів, aria-атрибутів, станів або динамічних скриптів. Статичний парсинг тут безсилий.
Багато AI-агентів намагаються інтерпретувати DOM у вигляді дерева елементів або CSS-селекторів. Проте така стратегія має два головні недоліки:
- Відсутність семантики —
div, span і button не завжди означають те, що здається.
- Відсутність контексту — DOM не зберігає намір чи функцію елемента. Він просто показує структуру.
Рішення від Notte: шар сприйняття
Notte пропонує новий підхід: замість того, щоб працювати з «сирим» DOM, система додає шар сприйняття (perception layer), який формує абстрактне представлення інтерфейсу. Іншими словами, Notte створює внутрішню карту інтерфейсу, яку можна осмислити, як людину.
Цей шар:
- визначає семантичні ролі елементів (наприклад, “кнопка входу”, “пошукове поле”);
- інтегрує візуальні атрибути, розміщення та поведінку;
- враховує контекст взаємодії (наприклад, “цей елемент з’являється після авторизації”);
- оновлюється в реальному часі при зміні DOM.
Що це змінює?
Такий підхід дає агентам значно більше, ніж просто змога клікнути правильну кнопку. Тепер вони можуть:
- розуміти мету елементів (а не тільки їхній вигляд);
- взаємодіяти умовно (наприклад, “заповнити форму, якщо вона є”);
- враховувати динамічний стан сайту;
- будувати стратегії, як справжні користувачі (наприклад, “знайти форму зворотного зв’язку і надіслати повідомлення”).
Приклад на практиці
Агент із шаром сприйняття бачить не просто DOM-дерево, а таку структуру:
{
"type": "form",
"purpose": "login",
"fields": ["email", "password"],
"submit": "button"
}
З цим представленням він не буде шукати input[type="text"] чи #login-button. Він просто “знає”, що потрібно зробити, і вміє діяти відповідно.
Як це працює технічно?
Шар сприйняття Notte базується на поєднанні:
- моделі комп’ютерного зору, що бачить структуру;
- LLM-моделі, яка формує семантичні узагальнення;
- системи оновлень, яка стежить за змінами DOM у реальному часі.
Цей гібрид дозволяє не просто “парсити” сайт, а розуміти його.
Висновок
Інтернет був створений для людей — і саме це робить його складним для машин. Але Notte демонструє, що можливо дати штучному інтелекту відчуття простору, яке наближає його до людського способу взаємодії. Шар сприйняття — це не просто додатковий модуль. Це нова парадигма, яка відкриває двері до розумніших, чутливіших і точніших агентів у вебі.
Реактивні системи: чи можна відстежувати залежність в асинхронному коді?
У світі фронтенд-розробки реактивність давно стала стандартом. Інструменти на кшталт React, Vue чи SolidJS дозволяють автоматично оновлювати інтерфейс користувача, коли змінюється стан. Але що робити, якщо наші залежності — не просто змінні, а асинхронні процеси, обіцянки (Promises) чи потоки подій? Чи можливо побудувати справді реактивну систему, яка ефективно працює з асинхронними даними?
Класична реактивність та її межі
У типовій реактивній моделі ми маємо систему залежностей:
- спостережувані змінні (observables);
- залежні ефекти (computed або effects);
- механізм трекінгу (dependency tracking).
У синхронному коді це працює ідеально. Змінивши count, ми автоматично оновлюємо doubleCount. Проте, як тільки в систему потрапляє async/await або fetch, починаються складнощі.
const count = signal(1);
const doubleCount = computed(() => count() * 2); // класично, без асинхронщини
Проблема з асинхронними залежностями
Уявімо:
const userId = signal(1);
const userData = computed(async () => {
const response = await fetch(`/api/user/${userId()}`);
return await response.json();
});
Цей код виглядає логічно, але більшість реактивних систем (наприклад, Solid або Vue) не вміють відстежувати залежності всередині async. Як результат, зміна userId не викличе повторне виконання computed.
Як обійти обмеження?
1. Виносити асинхронність за межі computed
const userId = signal(1);
const userData = signal(null);
createEffect(() => {
fetch(`/api/user/${userId()}`)
.then(res => res.json())
.then(data => userData.set(data));
});
Це класичний патерн, який дозволяє “реактивно” працювати з асинхронними джерелами. Але він потребує ручного керування станом, що ускладнює підтримку.
2. Використання бібліотек з підтримкою асинхронної реактивності
RxJS
RxJS дозволяє створювати реактивні стріми, які чудово працюють з асинхронщиною:
const userId$ = new BehaviorSubject(1);
const userData$ = userId$.pipe(
switchMap(id => from(fetch(`/api/user/${id}`).then(res => res.json())))
);
React Query / TanStack Query
Ці бібліотеки не є “реактивними” у класичному розумінні, але імітують реактивну поведінку через кеш та автоматичне оновлення:
const { data, isLoading } = useQuery(['user', userId], () => fetchUser(userId));
3. Нові підходи: Signals + Async
Деякі сучасні фреймворки, як SolidJS або Qwik, уже експериментують з асинхронною реактивністю. Ідея — дозволити computed або effect працювати з Promise, контролюючи їхнє скасування та повторне виконання.
Проблема скасування
Асинхронні обчислення потрібно скасовувати, якщо залежність змінилася до завершення запиту. Більшість рішень реалізують це вручну або через AbortController.
createEffect(() => {
const controller = new AbortController();
fetch(`/api/user/${userId()}`, { signal: controller.signal })
.then(...)
return () => controller.abort();
});
Висновок
Реактивність і асинхронність — це два потужні інструменти. Але їх поєднання вимагає обережності. Якщо ваша система не підтримує async всередині computed — шукайте альтернативи: RxJS, React Query або кастомні рішення з signals і effects. Майбутнє реактивних систем однозначно включатиме глибшу підтримку асинхронних сценаріїв — і саме зараз чудовий час, щоб почати їх вивчати.
SOAP, WSDL і трохи Python: створюємо веб-сервіс крок за кроком
У світі REST API часто забувають про інший стандарт — SOAP. Цей протокол і досі широко використовується у великих організаціях, банках, телекомі та державному секторі. У цій статті ми розглянемо, як створити SOAP веб-сервіс на Python, використовуючи бібліотеку Spyne, і як працює WSDL-файл.
Що таке SOAP і WSDL?
- SOAP (Simple Object Access Protocol) — це протокол обміну структурованими повідомленнями, зазвичай у форматі XML. Він формалізує передачу даних через HTTP або SMTP.
- WSDL (Web Services Description Language) — це XML-файл, який описує доступні методи веб-сервісу, типи параметрів, структури запитів і відповідей.
Коли варто використовувати SOAP?
SOAP ідеально підходить для:
- контрактно-орієнтованих API;
- інтеграції зі сторонніми системами;
- високого рівня безпеки (WS-Security);
- складних типів даних та операцій.
Встановлення бібліотек
Для Python одним з найзручніших рішень є Spyne. Встановімо:
pip install spyne lxml
Створення простого SOAP-сервісу
from spyne import Application, rpc, ServiceBase, Integer, Unicode
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
class HelloWorldService(ServiceBase):
@rpc(Unicode, Integer, _returns=Unicode)
def say_hello(ctx, name, times):
return u' '.join([f"Привіт, {name}!" for _ in range(times)])
application = Application([
HelloWorldService
],
tns='spyne.examples.hello',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11()
)
if __name__ == '__main__':
from wsgiref.simple_server import make_server
wsgi_app = WsgiApplication(application)
server = make_server('127.0.0.1', 8000, wsgi_app)
print("Сервер працює на http://127.0.0.1:8000")
server.serve_forever()
Отримання WSDL
Після запуску сервера ви можете перейти на:
http://127.0.0.1:8000/?wsdl
Ви побачите WSDL-документ, який описує ваш веб-сервіс. Його можуть використовувати інші системи або розробники для автоматичної генерації клієнтів.
Тестування SOAP-сервісу
Для тестування можна використовувати Postman або SoapUI. У запиті потрібно вказати правильний SOAP Envelope:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:spy="spyne.examples.hello">
<soapenv:Header/>
<soapenv:Body>
<spy:say_hello>
<spy:name>Світ</spy:name>
<spy:times>2</spy:times>
</spy:say_hello>
</soapenv:Body>
</soapenv:Envelope>
Висновок
SOAP — це не архаїзм, а потужний інструмент, який досі актуальний у багатьох сферах. Завдяки бібліотеці Spyne ми можемо легко створити повноцінний SOAP-сервіс на Python із доступом до WSDL, підтримкою XML і серіалізацією/десеріалізацією складних типів.
Налаштування Jest та React Testing Library: покроковий посібник для React та Next.js проектів
Тестування — це важлива частина життєвого циклу будь-якого застосунку. У світі React і Next.js найпопулярнішими інструментами для цього є Jest і React Testing Library. Цей гайд допоможе вам налаштувати тестове середовище швидко, правильно і з урахуванням кращих практик.
Чому саме Jest і React Testing Library?
- Jest — це фреймворк для тестування, який ідеально підходить для проектів на JavaScript/TypeScript. Має вбудований тест-раннер, мокінг, покриття та підтримку таймерів.
- React Testing Library (RTL) — зосереджена на тестуванні поведінки користувача, а не реалізації компонентів. Це підхід, близький до реального використання.
Підготовка проекту
Для Create React App (CRA)
CRA має Jest і RTL з коробки. Але якщо у вас Next.js, потрібно налаштовувати вручну.
Для Next.js проекту
- Встановлюємо залежності:
npm install --save-dev jest @testing-library/react @testing-library/jest-dom babel-jest identity-obj-proxy @testing-library/user-event
- Додаємо конфігураційний файл
jest.config.js:
const nextJest = require('next/jest');
const createJestConfig = nextJest({ dir: './' });
const customJestConfig = {
setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'\\.(css|less|scss|sass)$': 'identity-obj-proxy',
},
testEnvironment: 'jsdom',
};
module.exports = createJestConfig(customJestConfig);
- Створюємо файл
jest.setup.js:
import '@testing-library/jest-dom';
- (Необов’язково) Якщо використовуєте TypeScript, додайте типи у
tsconfig.json:
{
"compilerOptions": {
"types": ["jest", "@testing-library/jest-dom"]
}
}
Написання першого тесту
Компонент (наприклад Button.jsx):
export default function Button({ onClick, children }) {
return <button onClick={onClick}>{children}</button>;
}
Тест (Button.test.jsx):
import { render, screen, fireEvent } from '@testing-library/react';
import Button from './Button';
test('натискає кнопку', () => {
const handleClick = jest.fn();
render(<Button onClick={handleClick}>Натисни мене</Button>);
const button = screen.getByText('Натисни мене');
fireEvent.click(button);
expect(handleClick).toHaveBeenCalledTimes(1);
});
Корисні поради
- Використовуйте
userEvent замість fireEvent для ближчої симуляції поведінки користувача.
- Ізолюйте кожен тест, очищаючи рендер через
afterEach(cleanup) (автоматично робиться RTL).
- Пишіть тести як користувач — через
getByRole, getByText, getByLabelText.
Висновок
Jest та React Testing Library — це потужна пара для побудови надійних UI-тестів. Вони дозволяють не тільки перевіряти, чи працює компонент, а й гарантувати, що користувацький досвід відповідає очікуванням. Якщо ви використовуєте Next.js — трошки більше налаштування, але результат того вартий. Тестуйте не реалізацію, а поведінку — і ваші додатки будуть стабільними.
Що таке OP_RETURN і як він дозволяє зберігати дані в мережі біткоїну?
У світі блокчейну, де все побудовано навколо прозорості, безпеки та незмінності, можливість зберігати довільні дані безпосередньо у ланцюжку викликає великий інтерес. Одним із механізмів, що дозволяє це зробити у мережі біткоїну, є OP_RETURN. Ця інструкція відкриває двері до таких застосувань, як запис хешів документів, створення NFT, реєстрація цифрових підписів або навіть передача коротких повідомлень у сам блокчейн.
Що таке OP_RETURN?
OP_RETURN — це спеціальний оператор у мові сценаріїв Bitcoin Script, яка використовується для обробки транзакцій. Його головна особливість — він позначає, що вихід транзакції не має фінансової цінності і його не можна витратити. Саме тому він ідеально підходить для вбудовування метаданих.
Оператор дозволяє додати до 80 байтів (раніше — 40) довільних даних у транзакцію. Це можуть бути хеші, текстові рядки, або структуровані дані, які потім можна аналізувати за допомогою сторонніх сервісів.
Як це працює?
Створюючи транзакцію з виходом, який містить OP_RETURN, користувач вказує інструкцію та додає байти інформації. Наприклад, скрипт може виглядати так:
OP_RETURN 48656c6c6f2c20426974636f696e21
Це шістнадцяткове кодування фрази “Hello, Bitcoin!”. Після публікації транзакції в мережі ці дані залишаються у блокчейні назавжди — незмінними й публічними.
Навіщо це потрібно?
- Запис хешів файлів чи договорів — ви можете створити доказ існування даного документу на певну дату
- Цифрові сертифікати та NFT — метадані, що підтверджують право власності
- Службові мітки — ідентифікатори транзакцій або маркування в DeFi-системах
- Комунікація у ланцюжку — хоч і не рекомендовано, але використовувалось для коротких повідомлень
Переваги використання OP_RETURN
- ✅ Проста реалізація з бібліотеками, як-от bitcoinjs-lib
- ✅ Безпечне зберігання, бо такі виходи не витрачаються
- ✅ Дешевше, ніж зловживання скриптами типу P2PKH для даних
Обмеження та критика
- ❌ Обмеження на розмір — 80 байтів це не так багато
- ❌ Дані залишаються назавжди — їх не можна видалити
- ❌ Деякі майнери не включають транзакції з OP_RETURN, якщо вони не містять винагороди
Практичний приклад (JS + bitcoinjs-lib)
const bitcoin = require("bitcoinjs-lib");
const data = Buffer.from("Hello, Bitcoin!", "utf8");
const embed = bitcoin.payments.embed({ data: [data] });
console.log(embed.output.toString("hex"));
Цей код створює вихід OP_RETURN з текстом. Далі його можна додати до транзакції та підписати.
Висновок
OP_RETURN — це потужний, але обмежений інструмент для запису публічних даних у мережу біткоїну. Він не створений для масового зберігання, але ідеально підходить для ситуацій, де потрібна прозорість, простота і незмінність. Якщо вам потрібно «викарбувати» щось назавжди у блокчейні — OP_RETURN саме те, що треба.
Як створити просте API? Express + Prisma
У сучасній веб-розробці створення API — це базовий навик. І якщо ви хочете побудувати просте, швидке та типобезпечне API — поєднання Express і Prisma буде чудовим вибором. У цій статті розглянемо покроково, як створити свій перший API на Node.js із використанням цих інструментів.
Що таке Express?
Express — це мінімалістичний веб-фреймворк для Node.js. Він дозволяє легко створювати маршрути, обробники запитів і сервери.
Що таке Prisma?
Prisma — це ORM (Object-Relational Mapping), яка спрощує взаємодію з базами даних. Вона дозволяє працювати з SQL-базами (PostgreSQL, MySQL, SQLite тощо) через JavaScript/TypeScript API.
Початок роботи: ініціалізація проєкту
mkdir express-prisma-api && cd express-prisma-api
npm init -y
npm install express prisma @prisma/client
npx prisma init
Налаштування бази даних (SQLite)
В prisma/schema.prisma:
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
generator client {
provider = "prisma-client-js"
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
createdAt DateTime @default(now())
}
Тепер виконаємо міграцію:
npx prisma migrate dev --name init
Створення базового Express-сервера
const express = require("express");
const { PrismaClient } = require("@prisma/client");
const app = express();
const prisma = new PrismaClient();
app.use(express.json());
app.get("/posts", async (req, res) => {
const posts = await prisma.post.findMany();
res.json(posts);
});
app.post("/posts", async (req, res) => {
const { title, content } = req.body;
const post = await prisma.post.create({
data: {
title,
content
}
});
res.status(201).json(post);
});
app.listen(3000, () => {
console.log("Server is running on http://localhost:3000");
});
Тестування API
- GET
/posts — отримаєте список усіх постів
- POST
/posts з тілом:
{
"title": "Мій перший пост",
"content": "Вітаю у Prisma + Express!"
}
Висновок
Зв’язка Express і Prisma дозволяє швидко створити надійне REST API з типобезпечною ORM. Цей стек ідеально підходить як для прототипування, так і для невеликих продакшен-проєктів. Далі ви можете додати валідацію, аутентифікацію, пагінацію, або перейти до використання TypeScript — усе залежить від ваших потреб.
Складнощі при створенні інфраструктурних схем у веб-розробці
Уявіть, що ви хочете пояснити новому колезі, як влаштована ваша веб-інфраструктура. Ви відкриваєте діаграму… і розумієте, що навіть самі в ній заплутались. Створення інфраструктурної схеми — це не просто малювання стрілочок між сервером і клієнтом. Це спроба узагальнити складну, динамічну систему у зрозумілому, точному й актуальному вигляді. І ось тут починаються труднощі.
Відсутність єдиного стандарту
Веб-розробка швидко еволюціонує, а з нею — і підходи до побудови архітектури. Хтось працює з monorepo, хтось — із microservices, інші ж інтегрують serverless або edge-computing рішення. Зобразити таку різноманітність в уніфікованій схемі — непросте завдання.
Баланс між деталізацією і простотою
Одна з головних дилем: як знайти золоту середину між занадто спрощеною і занадто складною діаграмою? Якщо показати лише загальні блоки, вона втратить практичну цінність. Якщо зануритися в кожен дрібний сервіс чи queue — зникне читабельність.
Постійні зміни в інфраструктурі
Сучасні веб-проекти — це живі організми. Нові мікросервіси додаються, старі депрекейтяться, компоненти змінюють свої ролі. Тримати схему в актуальному стані — окрема задача, яка часто відкладається «на потім».
Інструментальні обмеження
Популярні сервіси типу Lucidchart, Miro, або навіть draw.io — хороші, але мають обмеження. Наприклад, не всі підтримують автоматичну генерацію з коду або інтеграцію з Terraform/Infrastructure as Code. Ручне оновлення схеми — рутинно і неефективно.
Командне розуміння та конвенції
У команді можуть бути різні уявлення про те, що саме треба показувати. Для девопсів важлива інфраструктура серверів, для фронтенду — CDN та API, для аналітики — потоки даних. Без чіткої угоди складно побудувати схему, яка задовольняє всіх.
Безпека та документація
Часто інфраструктурні схеми містять чутливу інформацію: URL, токени, назви серверів. Публікувати такі дані небезпечно, а приховати — значить зробити схему менш корисною. Потрібно вміти розділяти внутрішні і зовнішні версії діаграм.
Як полегшити процес
- Використовуйте модульні схеми: окремо для фронтенду, бекенду, CI/CD, мережі
- Створіть шаблони: єдині умовні позначення, кольори, рівень деталізації
- Інтегруйте з IaC: спробуйте d2, Diagrams (Python) або Structurizr
- Регулярно ревізуйте: зберіть фідбек від команди, оновлюйте схеми під час спринтів
Висновок
Інфраструктурні схеми — це не просто документація, а важлива частина розуміння та спільної роботи над проектом. Так, створення такої схеми — складний процес, але він окупається сторицею: пришвидшує онбординг, спрощує дебаг, покращує комунікацію. І навіть якщо ваша перша схема буде недосконалою — краще мати хоча б одну, ніж жодної.
Postman + Newman: швидкий старт API-автотестів на практиці
Автоматизоване тестування API — важлива частина сучасної розробки. Це не лише про перевірку відповідей від серверу, а й про контроль стабільності, безпеки та продуктивності. Якщо ви шукаєте простий спосіб почати з API-тестів — зв’язка Postman + Newman стане ідеальним стартом.
Що таке Postman?
Postman — популярний інструмент для роботи з API. Він дозволяє:
- Створювати та зберігати HTTP-запити
- Перевіряти відповіді від API
- Організовувати колекції запитів
- Писати автотести за допомогою JavaScript
Для новачка — це зручна точка входу. Для досвідченого — потужна платформа з можливістю інтеграції у CI/CD.
Що таке Newman?
Newman — це CLI-інструмент від команди Postman. Він дозволяє запускати колекції Postman з автотестами у терміналі, автоматизувати їх виконання на сервері чи в CI-пайплайнах.
Встановлення
npm install -g newman
Як створити автотест у Postman?
- Створіть нову колекцію.
- Додайте запит (наприклад,
GET https://api.example.com/users).
- Перейдіть у вкладку
Tests та напишіть простий скрипт:
pm.test("Статус-код має бути 200", function () {
pm.response.to.have.status(200);
});
- Збережіть колекцію.
Експорт та запуск з Newman
- Натисніть на три крапки поруч із колекцією →
Export → збережіть як JSON.
- Запустіть через Newman:
newman run my-collection.json
Newman покаже результати прямо в терміналі. Ви побачите, які тести пройшли, а які — ні.
Інтеграція з CI/CD
Postman + Newman легко інтегруються у пайплайни:
- GitHub Actions: запускати тести при кожному push
- GitLab CI/CD: валідація API перед деплоєм
- Jenkins: частина smoke-тестів
Приклад для GitHub Actions
jobs:
test-api:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Newman
run: npm install -g newman
- name: Run API tests
run: newman run ./tests/collection.json
Поради для ефективної роботи
- Структуруйте колекції: групуйте запити за модулями
- Використовуйте змінні середовища для URL, токенів
- Додавайте pre-request скрипти для авторизації
- Використовуйте репортери (
--reporters html) для візуалізації результатів
Висновок
Postman і Newman — це зручний і доступний спосіб почати автоматизоване тестування API. Вони не вимагають великих знань у програмуванні, але дозволяють масштабувати рішення до рівня CI/CD. Якщо ви хочете швидко отримати цінність від автотестів — спробуйте цей дует уже сьогодні.