Ответ
F.I.R.S.T. — это акроним, который описывает набор принципов для написания качественных и эффективных юнит-тестов. Следование этим принципам помогает создавать надежный и поддерживаемый тестовый набор.
- Fast (Быстрые): Тесты должны выполняться очень быстро. Медленные тесты тормозят разработку, и их реже запускают, что снижает их ценность.
- Isolated / Independent (Изолированные / Независимые): Тесты не должны зависеть друг от друга. Порядок их запуска не должен влиять на результат. Каждый тест должен настраивать и очищать свое собственное окружение.
- Repeatable (Повторяемые): Тест должен давать одинаковый результат при каждом запуске в любой среде (локальная машина, CI/CD-сервер). Это исключает зависимость от внешних факторов, таких как сеть или база данных.
- Self-Validating (Самопроверяемые): Результат теста должен быть однозначным: либо
pass
, либоfail
. Он не должен требовать ручной проверки логов или сравнения файлов. - Timely (Своевременные): Тесты следует писать своевременно, в идеале — непосредственно перед кодом, который они тестируют (подход Test-Driven Development, TDD). Это помогает лучше спроектировать код.
Пример, демонстрирующий изоляцию (Python + unittest.mock
):
import unittest
from unittest.mock import Mock
# Класс, который мы хотим протестировать
class ReportGenerator:
def __init__(self, db_connector):
self._db = db_connector
def generate_daily_report(self):
# Получает данные из "базы данных"
user_count = self._db.get_active_users_count()
if user_count > 100:
return "High activity report"
return "Normal activity report"
# Тест
class TestReportGenerator(unittest.TestCase):
def test_high_activity_report(self):
# Arrange: Создаем mock-объект для зависимости
mock_db = Mock()
# Настраиваем его поведение
mock_db.get_active_users_count.return_value = 150
# Act: Создаем экземпляр с mock-объектом
generator = ReportGenerator(db_connector=mock_db)
report = generator.generate_daily_report()
# Assert: Проверяем результат (Self-Validating)
self.assertEqual(report, "High activity report")
# Этот тест:
# - Fast: не делает реального запроса к БД.
# - Isolated/Repeatable: не зависит от состояния реальной БД.