Вопрос проверяет понимание основных видов тестов, выполняемых в процессе непрерывной интеграции (CI), и их роли в обеспечении качества кода.
В процессе непрерывной интеграции (CI) автоматизированное тестирование является ключевой практикой для быстрого обнаружения ошибок. Два фундаментальных типа тестов, которые обычно выполняются на ранних этапах CI-пайплайна, — это модульные (unit) и интеграционные (integration) тесты.
Модульные тесты проверяют самую маленькую тестируемую единицу кода — обычно функцию, метод или класс — в полной изоляции от других частей системы. Их цель — убедиться, что каждая отдельная часть логики работает корректно согласно спецификации. Для изоляции часто используются моки (mocks) или заглушки (stubs), которые заменяют внешние зависимости, такие как базы данных или API.
// Пример модульного теста на JavaScript (Jest)
function sum(a, b) {
return a + b;
}
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});Такие тесты выполняются очень быстро, их тысячи, и они формируют основание пирамиды тестирования.
Интеграционные тесты проверяют, как несколько модулей или компонентов взаимодействуют между собой. Они могут тестировать интеграцию с базами данных, внешними сервисами, файловыми системами или API. Эти тесты медленнее, так как требуют поднятия реальных или приближенных к реальным зависимостей.
# Пример интеграционного теста на Python (pytest), проверяющего работу с БД
import pytest
from myapp import db, User
@pytest.fixture
def test_db():
# Настройка тестовой базы данных
db.create_all()
yield db
db.drop_all()
def test_user_creation(test_db):
user = User(name='Alice')
test_db.session.add(user)
test_db.session.commit()
# Проверяем, что пользователь действительно сохранён в БД
assert User.query.filter_by(name='Alice').first() is not NoneИнтеграционные тесты выявляют проблемы на стыках модулей, которые unit-тесты не могут обнаружить.
В CI-пайплайне эти тесты запускаются автоматически при каждом пуше в репозиторий. Обычно сначала выполняются быстрые unit-тесты, и если они проходят, затем запускаются более тяжёлые интеграционные тесты. Это позволяет быстро получить обратную связь: если unit-тесты падают, разработчик сразу видит проблему в логике; если падают интеграционные — проблема, скорее всего, в конфигурации или взаимодействии компонентов.
Вывод: Модульные тесты необходимы для проверки корректности отдельных частей кода и обеспечивают быструю обратную связь, а интеграционные тесты критически важны для проверки совместной работы компонентов и внешних сервисов. Их комбинированное использование в CI — основа стабильной и предсказуемой разработки.