Интеграционные тесты для конвейеров агентов
Сквозные тесты с реальными сервисами в изолированных тестовых средах.
«Интеграционные тесты для конвейеров агентов» — бесплатный урок AI Agents на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Что такое интеграционные тесты для агентов
Модульные тесты проверяют отдельные компоненты изолированно. Интеграционные тесты проверяют, что несколько компонентов правильно работают вместе в реальной или приближённой к реальной среде.
Для агентов это означает запуск полного конвейера — вызовов LLM, выполнения инструментов и хранения данных — с использованием реальных сервисов или сервисов в изолированной среде.
Структура сквозного теста
Сквозной тест агента отправляет реальный запрос через весь конвейер и проверяет итоговый результат. Запускайте такие тесты в изолированной среде — никогда не используйте для них рабочую базу данных или реальные данные пользователей.
import pytest
# Mark as integration test — skipped in fast unit test runs
@pytest.mark.integration
def test_research_agent_full_pipeline():
from myagent import ResearchAgent
agent = ResearchAgent(
openai_api_key='YOUR_TEST_KEY',
search_api_key='YOUR_TEST_KEY'
)
result = agent.run('What is the population of Tokyo?')
# Structural assertions — not exact string matching
assert isinstance(result, dict)
assert result['status'] == 'completed'
assert 'tokyo' in result['answer'].lower() or 'japan' in result['answer'].lower()
assert len(result['sources']) >= 1Изоляция тестовых данных
Интеграционные тесты не должны загрязнять общие данные. Используйте отдельные базы данных для тестов, изолированные пространства имён или временные данные, которые удаляются после теста. Никогда не записывайте тестовые данные в рабочие таблицы.
import os
import pytest
# Use a separate test database URL
@pytest.fixture(scope='session')
def test_db():
test_db_url = os.environ.get(
'TEST_DATABASE_URL',
'postgresql://localhost/myagent_test' # separate test DB
)
# Set up test schema
from myagent.database import create_tables
create_tables(test_db_url)
yield test_db_url
# Tear down after all tests in the session
from myagent.database import drop_tables
drop_tables(test_db_url)Очистка после каждого теста
Каждый интеграционный тест должен удалять все созданные им данные. Используйте шаблон fixture с yield: выполняйте настройку до yield, а очистку — после. Это гарантирует независимость тестов и позволяет запускать их в любом порядке.
import pytest
@pytest.fixture
def clean_agent_memory(test_db):
# No setup needed — DB starts empty
yield
# Cleanup: delete any records created during this test
from myagent.database import clear_conversation_history
clear_conversation_history(test_db)
@pytest.mark.integration
def test_agent_stores_conversation(clean_agent_memory, test_db):
from myagent import Agent
agent = Agent(db_url=test_db)
agent.run('Remember that my name is Alex')
history = agent.get_history()
assert len(history) > 0
assert any('Alex' in str(msg) for msg in history)
# clean_agent_memory fixture deletes these after the testИзолированные сервисы: ключи API для тестов
Для интеграционных тестов используйте отдельные тестовые ключи API с ограниченными разрешениями и квотами. Никогда не используйте рабочие ключи в CI. Храните тестовые ключи в виде переменных окружения CI, а не в коде.
import os
import pytest
# Skip integration tests if test keys are not configured
def requires_integration_keys():
return pytest.mark.skipif(
not os.environ.get('OPENAI_TEST_KEY'),
reason='Integration test keys not configured'
)
@requires_integration_keys()
@pytest.mark.integration
def test_live_weather_tool():
from myagent.tools import get_weather
result = get_weather(city='London', unit='celsius')
assert result['success'] is True
assert 'temperature' in result
assert isinstance(result['temperature'], (int, float))Использование Docker для изолированных баз данных
Если для интеграционных тестов нужна настоящая база данных, запускайте контейнер Docker на время тестовой сессии. Это гарантирует чистую изолированную базу данных при каждом запуске и предотвращает конфликты с базой данных разработки.
# conftest.py — docker-based test database
import subprocess
import pytest
@pytest.fixture(scope='session')
def docker_postgres():
container_id = subprocess.check_output([
'docker', 'run', '-d',
'-e', 'POSTGRES_PASSWORD=test',
'-e', 'POSTGRES_DB=agent_test',
'-p', '5434:5432', # use non-standard port to avoid conflicts
'postgres:15'
]).decode().strip()
import time
time.sleep(2) # wait for Postgres to start
yield 'postgresql://postgres:test@localhost:5434/agent_test'
subprocess.run(['docker', 'stop', container_id])
subprocess.run(['docker', 'rm', container_id])Конфигурации тестов для разных сред
Для интеграционных тестов нужна разная конфигурация в локальной среде, CI и промежуточной среде. Используйте переменные окружения и вспомогательную функцию конфигурации, чтобы автоматически выбирать правильные настройки.
import os
def get_test_config() -> dict:
env = os.environ.get('TEST_ENV', 'local')
configs = {
'local': {
'db_url': 'postgresql://localhost/agent_test',
'openai_key': os.environ.get('OPENAI_TEST_KEY', ''),
'use_real_llm': False # use mocks locally
},
'ci': {
'db_url': os.environ.get('CI_DATABASE_URL', ''),
'openai_key': os.environ.get('CI_OPENAI_KEY', ''),
'use_real_llm': True # use real LLM in CI integration tests
},
'staging': {
'db_url': os.environ.get('STAGING_DATABASE_URL', ''),
'openai_key': os.environ.get('STAGING_OPENAI_KEY', ''),
'use_real_llm': True
}
}
return configs[env]
config = get_test_config()
print(f"TEST_ENV not set -> using '{os.environ.get('TEST_ENV', 'local')}' config")
print(f"DB URL : {config['db_url']}")
print(f"Use real LLM : {config['use_real_llm']}")
Маркеры pytest для выбора тестов
Используйте пользовательские маркеры pytest, чтобы распределять тесты по категориям и запускать только нужное подмножество. Настройте маркеры в pytest.ini и используйте -m в командной строке для их выбора.
# pytest.ini
# [pytest]
# markers =
# unit: Fast unit tests with mocked dependencies
# integration: Slower tests with real or sandboxed services
# expensive: Tests that make real LLM calls and cost money
# Run only unit tests (fast CI check):
# pytest -m unit
# Run only integration tests:
# pytest -m integration
# Run everything except expensive tests:
# pytest -m 'not expensive'
# In test files:
import pytest
@pytest.mark.unit
def test_tool_format():
pass # fast, no external calls
@pytest.mark.integration
@pytest.mark.expensive
def test_with_real_llm():
pass # slow, costs tokensЗапуск интеграционных тестов в CI
Настройте конвейер CI (GitHub Actions, GitLab CI) так, чтобы модульные тесты запускались при каждом отправлении изменений, а интеграционные — по расписанию или перед выпуском. Это позволяет сбалансировать скорость и полноту проверки.
# .github/workflows/test.yml (abbreviated)
# name: Tests
# on:
# push:
# branches: [main, develop]
# schedule:
# - cron: '0 2 * * *' # nightly integration tests
#
# jobs:
# unit-tests:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v3
# - run: pip install -r requirements.txt
# - run: pytest -m unit --tb=short
#
# integration-tests:
# if: github.event_name == 'schedule'
# env:
# CI_OPENAI_KEY: ${{ secrets.CI_OPENAI_KEY }}
# CI_DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
# steps:
# - run: pytest -m integration --tb=long
print('Unit tests on every push, integration tests nightly')Измерение покрытия тестами агентов
Используйте pytest-cov, чтобы измерять, какие строки кода агента покрыты тестами. Стремитесь к высокому покрытию функций инструментов и логики оркестрации агента, даже если вызовы LLM имитируются.
# Install: pip install pytest-cov
# Run tests with coverage report:
# pytest --cov=myagent --cov-report=html -m unit
# This generates an HTML report showing which lines are untested
# Uncovered lines in the agent loop are high-risk areas
# Example coverage config in pyproject.toml:
# [tool.coverage.run]
# omit = ["tests/*", "scripts/*"]
#
# [tool.coverage.report]
# fail_under = 80 # fail if coverage drops below 80%
print('Coverage reports highlight untested code paths in your agent')Краткие рекомендации по интеграционным тестам
Основные правила надёжных интеграционных тестов агентов:
- Всегда используйте отдельные базы данных для тестов — никогда рабочую базу
- Удаляйте тестовые данные после каждого теста с помощью фикстур
yield - Используйте отдельные тестовые ключи API с ограниченными квотами
- Используйте маркеры pytest, чтобы отделять быстрые модульные тесты от медленных интеграционных
- Запускайте модульные тесты при каждом отправлении изменений, а интеграционные — по расписанию
- Используйте Docker для одноразовых чистых сред с базами данных
Проверка знаний: интеграционные тесты
Проверьте, насколько хорошо Вы понимаете интеграционное тестирование конвейеров агентов.
Итоги: интеграционные тесты конвейеров агентов
Теперь у Вас есть знания, необходимые для создания полного и надёжного набора интеграционных тестов:
- Используйте
@pytest.mark.integration, чтобы отделять медленные тесты от быстрых модульных - Изолируйте тестовые данные с помощью отдельных баз данных и фикстур очистки
- Используйте Docker или изолированные сервисы для чистых сред
- Настраивайте специальные тестовые ключи API через переменные окружения
- Запускайте модульные тесты при каждом коммите, а интеграционные — каждую ночь в CI
- Измеряйте покрытие с помощью
pytest-cov, чтобы находить непроверенные пути выполнения
Хорошо организованная пирамида тестирования поддерживает надёжность агента по мере его развития.
Изучай AI Agents с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 60
- Уроки
- 239
Часто задаваемые вопросы
Урок «Интеграционные тесты для конвейеров агентов» бесплатный?
Да — полный текст урока «Интеграционные тесты для конвейеров агентов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Интеграционные тесты для конвейеров агентов»?
Сквозные тесты с реальными сервисами в изолированных тестовых средах. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Интеграционные тесты для конвейеров агентов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему тестирование агентов отличается
- Имитация вызовов LLM в тестах
- Тестирование агентов на основе утверждений
- Интеграционные тесты для конвейеров агентов