TDD и нагрузка
«Сначала тест, потом код» заставляет думать о контракте до реализации. А нагрузочное тестирование отвечает на вопрос «не упадёт ли прод при пике». База из урока 27 останется, добавляем дисциплину и к6.
Цикл TDD
// 1) Пишем падающий тест — контракт будущей функции
it("суммирует только разрешённые товары", () => {
expect(total([{ p: 10, ok: true }, { p: 50, ok: false }])).toBe(10);
});
// 2) Минимальный код, чтобы тест «позеленел»
// 3) Рефакторинг — чистим код, тест остаётся зелёным
💡
Рефлектор для сложных функций: если не знаете, как проверить «правильность» — сначала сформулируйте тест словами, потом код даст себя написать проще.
Нагрузка на к6
import http from "k6/http";
import { check, sleep } from "k6";
export const options = {
stages: [ // растущая нагрузка
{ duration: "1m", target: 50 },
{ duration: "2m", target: 200 },
],
thresholds: {
http_req_duration: ["p(95)<300"], // 95% запросов быстрее 300 мс
http_req_failed: ["rate<0.01"]
}
};
export default function () {
const res = http.get("https://api.x.dev/products");
check(res, { "status 200": (r) => r.status === 200 });
sleep(1);
}
ℹ️
Пороги (thresholds) делают тест «проходимым/непроходимым» автоматически: CI упадёт, если p95 латентности выше заданного. Это и есть SLA в код.