🌍 Привет мир! 👋🏻
🌍 Привет мир! 👋🏻
Сегодня снова поговорим о чем-то общем, кстати такого хэштега еще не было, встречайте #TESTS, и разговор будет о — F.I.R.S.T principle 😃
🚀 Мотивация
Тесты — это очень хорошо, но только в том случае, если они написаны правильно. Плохо написанный тест — это болька для вас и вашей команды 😱.
Даже если вы никогда не писали тесты, и в данный момент в этом нет необходимости, знайте, на собеседовании почти всегда заходит тема о тестах.
Итого, а как понять, что тесты хорошие? Тут на помощь приходит принцип F.I.R.S.T, если вы следуете данному принципу, то очень большая вероятность, что у вас все четко 🧐.
⚙️ F.I.R.S.T?
Это аббревиатура, где каждая буква — правило, которому должен соответствовать хороший тест:
🟢 Fast
🟢 Independent
🟢 Repeatable
🟢 Self-validating
🟢 Timely
Разберем подробнее с примерами и особенностями ⬇️
✔️ Fast
Тесты должны быть быстрыми 🚀. Очень плохо если вы запускаете тесты и идете пить кофе. Идеальный тест запускается за миллисекунды или хотя бы за секунды.
Если ваши тесты медленные, скорее всего вы не будете запускать их часто и появится соблазн вообще их отключить.
Пример:
Это интеграционный тест и вот какие у него минусы:
- зависит от внешнего API (может упасть из-за сети);
- выполняется медленно (десятки-сотни мс);
- лучше выносить в отдельный suite, а не запускать на каждом
✔️ Independent
Каждый тест должен быть независимым 🧩. Если один тест ломается, это не должно влиять на другие.
Пример:
✔️ Repeatable
Тест должен давать одинаковый результат при каждом запуске ♻️.
Пример нереплицируемого теста:
✔️ Self-validating
Тест должен проверять себя сам ✅. Не должно быть выводов в консоль и ручных проверок.
Плохой пример:
Хороший пример:
✔️ Timely
Пишите тесты сразу после функционала или даже до него (TDD) 🗓.
Тесты, написанные после нескольких недель или месяцев, становятся неактуальными, а вот своевременно написанные тесты наоборот позволят вам спустя какое-то время освежить свою память касательно данного функционала и ожидаемого результата.
Пример хорошего подхода:
💡 Время полезных советов:
🎯 Тесты должны покрывать реальные сценарии, а не просто гнаться за 100% покрытием.
✏️ Что действительно важно проверять:
- Краевые и граничные случаи — пустые строки, нули, максимальные значения.
- Большие объёмы данных — проверка на производительность и использование памяти.
- Поведение при разных ролях пользователей — у админа и обычного пользователя могут быть разные права.
- Очень большие значения — чтобы ловить переполнение (
- Обработка исключений и ошибок — приложение должно вести себя предсказуемо даже при сбоях.
- Некорректные или вредоносные входные данные — защита от уязвимостей и сбоев.
🟢 Тесты — это не про зеленые галочки =). Это про уверенность в том, что ваш код выживет в реальных условиях.
💬 Делитесь своим мнением в комментариях👇! Если вам понравилась статья, не забудьте поставить лайк и хорошего вам дня! 👍
#TESTS
Сегодня снова поговорим о чем-то общем, кстати такого хэштега еще не было, встречайте #TESTS, и разговор будет о — F.I.R.S.T principle 😃
🚀 Мотивация
Тесты — это очень хорошо, но только в том случае, если они написаны правильно. Плохо написанный тест — это болька для вас и вашей команды 😱.
Даже если вы никогда не писали тесты, и в данный момент в этом нет необходимости, знайте, на собеседовании почти всегда заходит тема о тестах.
Итого, а как понять, что тесты хорошие? Тут на помощь приходит принцип F.I.R.S.T, если вы следуете данному принципу, то очень большая вероятность, что у вас все четко 🧐.
⚙️ F.I.R.S.T?
Это аббревиатура, где каждая буква — правило, которому должен соответствовать хороший тест:
🟢 Fast
🟢 Independent
🟢 Repeatable
🟢 Self-validating
🟢 Timely
Разберем подробнее с примерами и особенностями ⬇️
✔️ Fast
Тесты должны быть быстрыми 🚀. Очень плохо если вы запускаете тесты и идете пить кофе. Идеальный тест запускается за миллисекунды или хотя бы за секунды.
Если ваши тесты медленные, скорее всего вы не будете запускать их часто и появится соблазн вообще их отключить.
Пример:
test('fetch user from API', async () => {
const res = await fetch('https://api.example.com/user/123');
const data = await res.json();
expect(data.id).toBe(123);
});Это интеграционный тест и вот какие у него минусы:
- зависит от внешнего API (может упасть из-за сети);
- выполняется медленно (десятки-сотни мс);
- лучше выносить в отдельный suite, а не запускать на каждом
npm test.✔️ Independent
Каждый тест должен быть независимым 🧩. Если один тест ломается, это не должно влиять на другие.
Пример:
let counter = 0;
test('increments counter', () => {
counter += 1;
expect(counter).toBe(1);
});
test('counter should start from zero again', () => {
expect(counter).toBe(0); // будет провал, так как состояние изменилось
});✔️ Repeatable
Тест должен давать одинаковый результат при каждом запуске ♻️.
Пример нереплицируемого теста:
test('should get random number', () => {
const randomNumber = Math.random();
expect(randomNumber).toBeGreaterThan(0.5);
});✔️ Self-validating
Тест должен проверять себя сам ✅. Не должно быть выводов в консоль и ручных проверок.
Плохой пример:
test('sum two numbers', () => {
console.log(sum(2, 3)); // Ручная проверка
});Хороший пример:
test('sum two numbers', () => {
expect(sum(2, 3)).toBe(5);
});✔️ Timely
Пишите тесты сразу после функционала или даже до него (TDD) 🗓.
Тесты, написанные после нескольких недель или месяцев, становятся неактуальными, а вот своевременно написанные тесты наоборот позволят вам спустя какое-то время освежить свою память касательно данного функционала и ожидаемого результата.
Пример хорошего подхода:
// TDD: сначала тест
test('should sum two numbers correctly', () => {
expect(sum(2, 3)).toBe(5);
});
// Затем код
function sum(a, b) {
return a + b;
}💡 Время полезных советов:
🎯 Тесты должны покрывать реальные сценарии, а не просто гнаться за 100% покрытием.
✏️ Что действительно важно проверять:
- Краевые и граничные случаи — пустые строки, нули, максимальные значения.
- Большие объёмы данных — проверка на производительность и использование памяти.
- Поведение при разных ролях пользователей — у админа и обычного пользователя могут быть разные права.
- Очень большие значения — чтобы ловить переполнение (
overflow) и потерю данных (underflow) для числовых типов.- Обработка исключений и ошибок — приложение должно вести себя предсказуемо даже при сбоях.
- Некорректные или вредоносные входные данные — защита от уязвимостей и сбоев.
🟢 Тесты — это не про зеленые галочки =). Это про уверенность в том, что ваш код выживет в реальных условиях.
💬 Делитесь своим мнением в комментариях👇! Если вам понравилась статья, не забудьте поставить лайк и хорошего вам дня! 👍
#TESTS

Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.