python-testing

Мы стремимся к покрытию тестами не менее 85% кодовой базы, уделяя особое внимание основным пакетам и критическим путям. Тесты должны быть быстрыми, надёжными и поддерживаемыми. При добавлении нового кода проверяйте, что соответствующие разделы кодовой базы покрыты тестами, и при необходимости добавляйте новые тесты. При изменении существующего кода обновляйте или добавляйте тесты для покрытия изменений. Мы запускаем тесты в два этапа: для каждого коммита в PR выполняются только модульные тесты (с использованием -m "not integration"), а полный набор, включающий...

npx skills add https://github.com/microsoft/agent-framework --skill python-testing

Python Testing

CI enforces at least 85% line coverage for every package classified Beta or Production/Stable. Alpha packages are report-only, and the DevUI and experimental Lab packages are excluded from aggregate coverage enforcement. Tests should be fast, reliable, and maintainable. When adding new code, check that the relevant sections of the codebase are covered by tests, and add new tests as needed. When modifying existing code, update or add tests to cover the changes. We run tests in two stages, for a PR each commit is tested with unit tests only (using -m "not integration"), and the full suite including integration tests is run when merging.

When an API is marked as deprecated, migrate ordinary tests to its replacement in the same change. Retain only focused tests that validate the deprecated behavior and warning; integration tests, samples, and unrelated unit tests should use the supported API.

Running Tests

# Run tests for all packages in parallel
uv run poe test

# Run tests for a specific workspace package
uv run poe test -P core

# Run all selected tests in a single pytest invocation
uv run poe test -A

# With coverage
uv run poe test -A -C
uv run poe test -P core -C

# Run only unit tests (exclude integration tests)
uv run poe test -A -m "not integration"

# Run only integration tests
uv run poe test -A -m integration

Direct package execution still works when you need it:

uv run --directory packages/core poe test

Test Configuration

  • Async mode: asyncio_mode = "auto" is enabled — do NOT use @pytest.mark.asyncio, but do mark tests with async def and use await for async calls
  • Timeout: Default 60 seconds per test
  • Import mode: importlib for cross-package isolation
  • Parallelization: Large packages (core, ag-ui, orchestrations, anthropic) use pytest-xdist (-n auto --dist worksteal) in their poe test task. The aggregate uv run poe test -A sweep also uses xdist across the selected packages.

Test Directory Structure

Test directories must NOT contain __init__.py files.

Non-core packages must place tests in a uniquely-named subdirectory:

packages/anthropic/
├── tests/
│   └── anthropic/       # Unique subdirectory matching package name
│       ├── conftest.py
│       └── test_client.py

Core package can use tests/ directly with topic subdirectories:

packages/core/
├── tests/
│   ├── conftest.py
│   ├── core/
│   │   └── test_agents.py
│   └── openai/
│       └── test_client.py

Fixture Guidelines

  • Use conftest.py for shared fixtures within a test directory
  • Before adding new fixtures, check if existing ones can be reused or extended
  • Use descriptive names: mapper, test_request, mock_client

File Naming

  • Files starting with test_ are test files — do not use this prefix for helpers
  • Prefer extending an existing test file that already covers the same component or behavior; create a new file only for a distinct surface without an appropriate existing file
  • Use conftest.py for shared utilities

Integration Tests

Integration tests require external services (OpenAI, Azure, etc.) and are controlled by three markers:

  1. @pytest.mark.flaky — marks the test as potentially flaky since it depends on external services
  2. @pytest.mark.integration — used for test selection, so integration tests can be included/excluded with -m integration / -m "not integration"
  3. @skip_if_..._integration_tests_disabled decorator — skips the test when the required API keys or service endpoints are missing

Adding New Integration Tests

All three markers must be applied to every new integration test:

@pytest.mark.flaky
@pytest.mark.integration
@skip_if_openai_integration_tests_disabled
async def test_openai_chat_completion() -> None:
    ...

For test files where all tests are integration tests (e.g., Azure Functions, Durable Task), use the module-level pytestmark list:

pytestmark = [
    pytest.mark.flaky,
    pytest.mark.integration,
    pytest.mark.sample("01_single_agent"),
    pytest.mark.usefixtures("function_app_for_test"),
]

CI Workflow

The merge CI workflow (python-merge-tests.yml) splits integration tests into parallel jobs by provider with change-based detection:

  • Unit tests — always run all non-integration tests
  • OpenAI integration — runs when packages/core/agent_framework/openai/ or core infrastructure changes
  • Azure OpenAI integration — runs when packages/core/agent_framework/azure/ or core changes
  • Misc integration — Anthropic, Ollama, MCP tests; runs when their packages or core change
  • Functions integration — Azure Functions + Durable Task; runs when their packages or core change
  • Foundry integration — runs when packages/foundry/ or core changes

Core infrastructure changes (e.g., _agents.py, _types.py) trigger all integration test jobs. Scheduled and manual runs always execute all jobs.

Keeping CI Workflows in Sync

Two workflow files define the same set of parallel test jobs:

  • python-merge-tests.yml — runs on PRs, merge queue, schedule, and manual dispatch. Uses path-based change detection to skip unaffected integration jobs.
  • python-integration-tests.yml — called from the manual integration test orchestrator (integration-tests-manual.yml). Always runs all jobs (no path filtering).

These workflows must be kept in sync. When you add, remove, or modify a test job, update both files. The job structure, pytest commands, and xdist flags should match between them. The only difference is that python-merge-tests.yml has path filters and conditional job execution, while python-integration-tests.yml does not.

Updating the CI When Adding Integration Tests for a New Provider

When adding integration tests for a new provider package, you must update both python-merge-tests.yml and python-integration-tests.yml:

  1. Add a path filter for the new provider in the paths-filter job in python-merge-tests.yml so the CI knows which file changes should trigger those tests.
  2. Add the test job to both workflow files — either add them to the existing python-tests-misc-integration job, or create a dedicated job if the provider:
    • Has a large number of integration tests
    • Requires special infrastructure setup (emulators, Docker containers, etc.)
    • Has long-running tests that would slow down the misc job

The python-tests-misc-integration job is intended for small integration test suites that don't need dedicated infrastructure. When a provider's integration tests grow large or gain special requirements, split them out into their own job (like python-tests-functions was split out for Azure Functions + Durable Task).

Best Practices

  • Run only related tests, not the entire suite
  • Review existing tests to understand coding style before creating new ones
  • Use print statements for debugging, then remove them when done
  • Resolve all errors and warnings before committing

Больше skills от microsoft

oss-growth
microsoft
Персона OSS-хакера роста
agent-framework-azure-ai-py
microsoft
Создание агентов Azure AI Foundry с использованием Microsoft Agent Framework Python SDK (agent-framework-azure-ai). Используйте при создании постоянных агентов с AzureAIAgentsProvider, применении размещенных инструментов (интерпретатор кода, поиск файлов, веб-поиск), интеграции MCP-серверов, управлении потоками бесед или реализации потоковых ответов. Охватывает функциональные инструменты, структурированные выходные данные и агентов с несколькими инструментами.
development
airunway-aks-setup
microsoft
Настройка AI Runway на AKS — от пустого кластера до работающей модели. Охватывает проверку кластера, установку контроллера, оценку GPU, настройку провайдера и первое развертывание. КОГДА: «настроить AI Runway», «подключить кластер AKS», «установить AI Runway», «airunway setup», «развернуть модель на AKS», «GPU-инференс на AKS», «настройка KAITO на AKS», «запуск LLM на AKS», «vLLM на AKS», «настройка обслуживания моделей на AKS», «контроллер AI Runway».
devops
appinsights-instrumentation
microsoft
Руководство по инструментированию веб-приложений с помощью Azure Application Insights. Содержит шаблоны телеметрии, настройку SDK и справочники по конфигурации. КОГДА: как инструментировать приложение, SDK App Insights, шаблоны телеметрии, что такое App Insights, руководство по Application Insights, примеры инструментирования, лучшие практики APM.
devops
applicationinsights-web-ts
microsoft
Инструментируйте браузерные/веб-приложения с помощью JavaScript SDK Application Insights (@microsoft/applicationinsights-web). Используйте для мониторинга реальных пользователей (RUM) — просмотры страниц, клики, зависимости AJAX/fetch, исключения, пользовательские события и трассировки агентов GenAI на стороне браузера, коррелируемые с бэкенд-трассировками OpenTelemetry. Охватывает скрипт загрузчика SDK и настройку npm, расширения фреймворков (React, React Native, Angular), Click Analytics, инициализаторы телеметрии и семантические конвенции OTel GenAI для спанов агента/инструмента/модели, генерируемых из браузера.
devops
azure-ai-anomalydetector-java
microsoft
Создавайте приложения для обнаружения аномалий с помощью Azure AI Anomaly Detector SDK для Java. Используйте при реализации одномерного/многомерного обнаружения аномалий, анализа временных рядов или мониторинга на основе ИИ.
development
azure-ai-language-conversations-py
microsoft
Реализация понимания разговорного языка (CLU) с использованием Python SDK azure-ai-language-conversations. Используйте при работе с ConversationAnalysisClient для анализа намерений и сущностей в разговоре, создании NLP-функций или интеграции языкового понимания в приложения.
development
azure-ai-ml-py
microsoft
Azure Machine Learning SDK v2 для Python. Используется для рабочих областей ML, заданий, моделей, наборов данных, вычислений и конвейеров. Триггеры: "azure-ai-ml", "MLClient", "workspace", "model registry", "training jobs", "datasets".
development