df-test-framework 4.1.0__tar.gz → 4.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/CHANGELOG.md +59 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/CLAUDE.md +13 -8
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/PKG-INFO +1 -1
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/clients.md +19 -3
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/core.md +2 -4
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/ARCHITECTURE_V4.0.md +22 -9
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/CODE_STRUCTURE.md +5 -4
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture//344/272/224/345/261/202/346/236/266/346/236/204/350/257/246/350/247/243.md +19 -7
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/auth_session_guide.md +5 -5
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/http_client_guide.md +72 -1
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/middleware_guide.md +2 -2
- df_test_framework-4.1.2/docs/releases/v4.1.1.md +143 -0
- df_test_framework-4.1.2/docs/releases/v4.1.2.md +120 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/pyproject.toml +1 -1
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/scripts/fetch_swagger.py +89 -38
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/__init__.py +3 -1
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/core/response.py +27 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/rest/httpx/async_client.py +339 -64
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/rest/httpx/base_api.py +27 -21
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/rest/httpx/client.py +78 -27
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/__init__.py +2 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/playwright/__init__.py +2 -0
- df_test_framework-4.1.2/src/df_test_framework/capabilities/drivers/web/playwright/async_browser_pool.py +182 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/readme.py +193 -100
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/script_fetch_swagger.py +87 -33
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/assertions/response.py +5 -1
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/core/test_response.py +16 -0
- df_test_framework-4.1.2/tests/capabilities/clients/http/rest/test_async_client.py +796 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/rest/test_base_api.py +20 -27
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/rest/test_http_client.py +182 -42
- df_test_framework-4.1.2/tests/capabilities/drivers/web/playwright/test_async_browser_pool.py +265 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/uv.lock +1 -1
- df_test_framework-4.1.0/tests/capabilities/clients/http/rest/test_async_client.py +0 -342
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.editorconfig +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.env.example +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.gitattributes +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.github/workflows/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.github/workflows/lint.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.github/workflows/release.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.github/workflows/scheduled.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.github/workflows/security.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.github/workflows/test.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.gitignore +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.gitleaks.toml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.gitleaksignore +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.pre-commit-config.yaml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/.python-version +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/CONTRIBUTING.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/README_PYPI.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/CONTRIBUTOR_GUIDE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/DOC_REORGANIZATION_PLAN_v4.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/ESSENTIAL_DOCS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/FAQ.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/LEARNING_PATH.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/core/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/core/context.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/core/events.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/core/exceptions.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/core/middleware.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/core/protocols.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/core/types.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/databases.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/drivers.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/extensions.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/infrastructure.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/patterns.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/api-reference/testing.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/PLUGIN_SYSTEM_V3.37.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/TEST_EXECUTION_LIFECYCLE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/REFACTORING_PLAN_V3.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/REFACTORING_PLAN_V3_REVISED.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/DI_STRATEGY.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/PREPARE_DATA_DESIGN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/TESTING_MODULE_OPTIMIZATION.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/UOW_CLEANUP_ARCHITECTURE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/UOW_REFACTORING_PROPOSAL.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/allure_integration_modes.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/capability_plan_vs_current.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/config-driven-design.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/config-management-analysis.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/eventbus-integration-analysis.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/failure-diagnosis-v2-design.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/future_allure_plugin_plans.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/http-vs-web-comparison.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/observability-debugging-unification.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/provider-pattern-deep-dive.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/tech-debt-cleanup-plan.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/ui-failure-diagnosis-implementation-v3.46.3.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/design/ui-observability-design.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/discussion_1_initial_issues.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/v3_complete_draft.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/v3_final_draft.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/FRAMEWORK_ARCHITECTURE_v3.6.2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/OVERVIEW_V3.17.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/V3.14_ENTERPRISE_PLATFORM_DESIGN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/V3.16_LAYER4_BOOTSTRAP_ARCHITECTURE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/V3.17_EVENT_SYSTEM_REDESIGN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/V3_ARCHITECTURE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/V3_IMPLEMENTATION.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/overview.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/archive/versions/v2-architecture.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/extension-points.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/failure-diagnosis-hook-example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/multi-project-reuse.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/observability-architecture.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/architecture/test-type-support.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/ACTION_PLAN_v2.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/AUDIT_VERIFICATION_REPORT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/AUTH_PLACEMENT_ANALYSIS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/CODE_REVIEW_f95e08cd.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/COMPREHENSIVE_FEATURE_AUDIT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/FRAMEWORK_OPTIMIZATION_ANALYSIS_2025.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/PHASE2_COMPARISON_ANALYSIS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/PHASE2_COMPLETION_REPORT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/PHASE2_SUMMARY.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis/V3_REFACTORING_COMPLETE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis_2025/ALLURE_HTTP_LOGGING_ISSUE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis_2025/ALLURE_INTEGRATION_CHECK_REPORT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis_2025/ALLURE_INTEGRATION_DESIGN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis_2025/ALLURE_INTEGRATION_SUMMARY.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis_2025/ALLURE_ROOT_CAUSE_ANALYSIS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis_2025/CODE_ANALYSIS_AND_PROGRESS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis_2025/COMPREHENSIVE_FRAMEWORK_EVALUATION.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/analysis_2025/CONFIG_MODERNIZATION_ANALYSIS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/ARCHITECTURE_AUDIT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/FUTURE_ENHANCEMENTS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/IMPLEMENTATION_SUMMARY.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/MIDDLEWARE_V3.14_DESIGN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/ROADMAP_V3.29_ENHANCEMENTS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/SIGNATURE_FRAMEWORK_CAPABILITIES.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/TEMPLATE_DEBUG_FIXTURES_ISSUE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/observability-config-design.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/ui-best-practices-2026.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/web-architecture-consistency-design.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/design/web-event-driven-comparison.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/evaluations_2025/DUAL_AI_ANALYSIS_COMPARISON.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/evaluations_2025/FRAMEWORK_ASSESSMENT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/evaluations_2025/FRAMEWORK_BEST_PRACTICES_UPDATE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/evaluations_2025/FRAMEWORK_CAPABILITIES.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/evaluations_2025/FRAMEWORK_IMPROVEMENT_PROPOSALS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/guides/async_database_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/guides/async_http_client.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/guides/httpx_advanced_usage.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/guides/logging_configuration.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/guides/logging_pytest_integration.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/guides/modern_logging_best_practices.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/guides/repository_uow_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/111.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/CONFIG_AND_INTERCEPTOR_INTEGRATION.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/DIRECTORY_STRUCTURE_REFACTORING.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/INTERCEPTOR_ARCHITECTURE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/INTERCEPTOR_ARCHITECTURE_VERIFICATION.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/INTERCEPTOR_CONFIG_BEST_PRACTICES.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/INTERCEPTOR_IDEAL_DESIGN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/INTERCEPTOR_IDEAL_VS_ACTUAL.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/INTERCEPTOR_LOCATION_DECISION.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/INTERCEPTOR_NAMING_STANDARDS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/INTERCEPTOR_PERFORMANCE_ANALYSIS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/REFACTORING_IMPLEMENTATION_PLAN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/interceptor_refactoring/REFACTORING_PROGRESS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/issues/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/issues/summary.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/issues/v1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/migration/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/migration/v3.15-to-v3.16.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/plans/CAPABILITY_LAYER_OPTIMIZATION.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/plans/REFACTORING_PLAN_v2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/plans/REFACTORING_TASKS_v2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/plans/RFC_MULTIPART_FORM_DATA_SUPPORT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/plans/RFC_MULTIPART_IMPLEMENTATION_CODE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/plans/UV_SYNC_MIGRATION_SUMMARY.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/plans/UV_SYNC_QUICK_START.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/plans/v2-migration-plan-draft.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/CHANGELOG_AUDIT_REPORT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/CODE_QUALITY_FIXES_2025-11-09.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/CORE_DOCS_UPDATE_PLAN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/DOCUMENTATION_AUDIT_REPORT_2025-12-05.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/DOCUMENTATION_CLEANUP_SUMMARY.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/DOCUMENTATION_INDEX.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/DOCUMENTATION_MAINTENANCE_COMPLETE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/DOCUMENTATION_UPDATE_CHECKLIST.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/DOC_UPDATE_SUMMARY.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/IMPROVEMENTS_2025-01-09.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/PHASE3_COMPLETION_REPORT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/PYTHON_VERSION_UNIFICATION.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/REFACTORING_COMPLETION_CHECK.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/TEST_CODE_GENERATION_ANALYSIS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/V3.3.0_DOCUMENTATION_UPDATE_SUMMARY.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/V3.3.0_MIGRATION_CHECKLIST.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/V3.5_ALLURE_INTEGRATION_PLAN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/V3.5_DOCUMENTATION_COMPLETE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/V3.5_OBSERVABILITY_FINAL_STATUS.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/V3.5_PHASE2_ACCEPTANCE_REPORT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/V3.5_REFACTOR_PLAN.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/V3.5_REFACTOR_PLAN_REVISED.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/VERIFIED_BEST_PRACTICES_INTEGRATION_COMPLETE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/reports_2025/async_http_client_design.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/user-guide/PHASE3_FEATURES.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/user-guide/extensions.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/user-guide/ui-testing.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/BaseAPI/346/234/200/344/275/263/345/256/236/350/267/265/346/214/207/345/215/227.md" +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/FRAMEWORK_DESIGN_PRINCIPLES.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/UPGRADE_SUMMARY_v1.3.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/architecture.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/best-practices.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/config-integration-guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/optimization-report.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1/publishing.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/v1//344/270/272/344/273/200/344/271/210/351/200/211/346/213/251/346/265/213/350/257/225/346/241/206/346/236/266.md" +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/versions/QUICK_START_V3.14.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/archive/versions/QUICK_START_V3.5.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/ci-templates/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/ci-templates/github-actions.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/ci-templates/gitlab-ci.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/development/DOCUMENTATION_MAINTENANCE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/development/FRAMEWORK_DEPENDENCY_MANAGEMENT.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/development/RELEASE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/development/VERSION_CONTROL_RULES.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/development/local-development.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/DECIMAL_GUIDE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/allure_plugin.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/assertions_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/async_api_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/bootstrap_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/config_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/database_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/decorators_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/distributed_tracing.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/event_bus_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/extensions.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/factory_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/fixtures_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/graphql_client.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/grpc_client.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/integration-guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/local_debug_quickstart.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/logging_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/message_queue.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/mocking.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/monitoring_plugin.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/openapi_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/plugins_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/prometheus_metrics.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/redis_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/resilience_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/sanitize_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/scaffold_cli_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/storage.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/telemetry_guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/test_data.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/test_data_cleanup.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/testing-development.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/guides/web-ui-testing.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/migration/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/migration/v3-to-v4.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.0.0-alpha.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.1.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.10.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.11.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.11.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.12.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.12.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.13.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.14.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.14.0_completion_report.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.14.0_implementation_complete.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.16.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.17.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.17.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.17.2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.18.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.18.1-bugfix.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.18.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.19.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.2.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.20.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.21.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.22.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.22.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.23.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.24.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.25.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.26.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.27.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.28.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.28.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.29.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.3.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.30.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.31.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.32.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.33.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.34.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.34.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.35.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.35.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.35.2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.35.3.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.35.4.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.35.5.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.35.6.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.35.7.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.36.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.36.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.37.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.38.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.38.10.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.38.2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.38.4.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.38.5.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.38.7.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.38.8.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.38.9.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.39.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.39.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.4.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.40.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.41.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.41.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.42.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.43.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.44.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.45.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.46.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.46.2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.46.3.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.5.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.6.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.6.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.6.2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.7.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.8.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v3.9.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v4.0.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v4.0.1.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v4.0.2.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v4.0.3.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v4.0.4.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/releases/v4.1.0.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/skills/write-code.zip +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/skills/write-test.zip +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/troubleshooting/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/troubleshooting/common-errors.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/troubleshooting/debugging-guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/BEST_PRACTICES.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/QUICK_REFERENCE.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/QUICK_START.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/USER_MANUAL.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/VERIFIED_BEST_PRACTICES.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/ci-cd.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/code-generation.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/configuration.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/cross-project-sharing.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/debugging.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/examples.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/multi-repo.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/nested-settings-guide.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/docs/user-guide/security-best-practices.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/01-basic/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/01-basic/database_operations.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/01-basic/http_client_usage.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/01-basic/redis_cache.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/01-basic/storage_usage.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/02-bootstrap/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/02-bootstrap/custom_providers.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/02-bootstrap/custom_settings.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/02-bootstrap/minimal_bootstrap.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/02-bootstrap/with_extensions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/03-testing/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/03-testing/conftest.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/03-testing/test_api.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/03-testing/test_database.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/03-testing/test_with_fixtures.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/04-patterns/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/04-patterns/builder_pattern.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/04-patterns/combined_patterns.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/04-patterns/repository_pattern.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/05-extensions/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/05-extensions/allure_enhancement_extension.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/05-extensions/custom_extension.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/05-extensions/data_factory_extension.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/05-extensions/environment_validator_extension.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/05-extensions/monitoring_extension.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/05-extensions/mq_monitor_extension.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/05-extensions/notification_extension.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/06-ui-testing/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/06-ui-testing/basic_ui_test.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/06-ui-testing/conftest.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/06-ui-testing/page_object_example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/docker-compose-kafka.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/docker-compose-rabbitmq.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/docker-compose-rocketmq.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/kafka_basic.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/kafka_ssl.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/rabbitmq_basic.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/rabbitmq_topic.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/rocketmq-broker.conf +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-message-queue/rocketmq_basic.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-v35-features/01_configurable_interceptors.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-v35-features/02_profile_configuration.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-v35-features/03_runtime_overrides.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-v35-features/04_observability.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/07-v35-features/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/08-v37-features/01_unit_of_work_basics.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/08-v37-features/02_repository_v37.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/08-v37-features/03_auto_rollback_testing.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/08-v37-features/04_multi_repository_transactions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/08-v37-features/05_project_uow.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/08-v37-features/06_exception_handling_with_uow.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/08-v37-features/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/examples/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/scripts/security-scan.bat +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/scripts/security-scan.sh +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/bootstrap/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/bootstrap/bootstrap.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/bootstrap/providers.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/bootstrap/runtime.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/middleware/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/middleware/base.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/middleware/event_publisher.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/middleware/logging.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/middleware/retry.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/models.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/graphql/query_builder.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/middleware/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/middleware/base.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/middleware/event_publisher.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/middleware/logging.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/middleware/metadata.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/middleware/retry.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/middleware/timing.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/grpc/models.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/core/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/core/request.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/middleware/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/middleware/auth.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/middleware/event_publisher.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/middleware/factory.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/middleware/logging.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/middleware/retry.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/middleware/signature.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/middleware/telemetry.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/rest/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/rest/factory.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/rest/httpx/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/rest/httpx/async_base_api.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/clients/http/rest/protocols.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/async_database.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/database.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/factory.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/query_builder.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/redis/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/redis/async_redis.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/redis/redis_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/repositories/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/repositories/base.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/repositories/query_spec.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/databases/uow.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/app_actions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/async_app_actions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/factory.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/playwright/async_browser.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/playwright/async_page.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/playwright/browser.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/playwright/component.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/playwright/locator.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/playwright/page.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/drivers/web/protocols.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/engines/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/engines/batch/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/engines/batch/spark/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/engines/olap/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/engines/stream/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/engines/stream/flink/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/pubsub/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/kafka/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/kafka/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/kafka/config.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/rabbitmq/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/rabbitmq/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/rabbitmq/config.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/rocketmq/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/rocketmq/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/messengers/queue/rocketmq/config.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/blob/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/file/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/file/local/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/file/local/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/file/local/config.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/object/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/object/oss/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/object/oss/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/object/oss/config.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/object/s3/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/object/s3/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/capabilities/storages/object/s3/config.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/__main__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/commands/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/commands/cicd.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/commands/env.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/commands/generate_cmd.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/commands/init_cmd.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/commands/interactive.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/generators/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/generators/json_to_model.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/generators/openapi_generator.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/generators/openapi_parser.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/main.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/.github/workflows/release.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/.github/workflows/scheduled.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/.github/workflows/test-full.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/.github/workflows/test.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/.gitlab-ci.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/Jenkinsfile +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/docker/.dockerignore +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/docker/Dockerfile +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/cicd/docker/docker-compose.yml +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/actions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/api_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/builder.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/env_files.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/graphql_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/redis_example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/repository.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/settings_enhanced.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/test.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/test_complete.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/generators/test_graphql.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/async_example_api.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/async_ui_app_actions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/base_api.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/conftest.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/constants.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/data_cleaners.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/docs_api.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/editorconfig.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/enhanced_gitignore.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/env.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/fixtures_init.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/full_conftest.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/full_settings.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/gitattributes.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/gitignore.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/models_requests_example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/models_responses_example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/pyproject_toml.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/script_run_tests.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/settings.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/test_async_example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/test_example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/ui_app_actions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/ui_conftest.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/ui_fixtures_init.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/ui_page_object.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/ui_settings.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/ui_test_example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/uow.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/user_api_example.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/utils_converters.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/utils_validators.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/templates/project/vscode_settings.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/cli/utils.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/context/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/context/execution.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/context/propagation.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/decorators.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/events/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/events/types.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/exceptions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/middleware/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/middleware/base.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/middleware/chain.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/middleware/decorator.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/middleware/protocol.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/models/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/models/base.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/protocols/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/protocols/client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/protocols/event.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/protocols/plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/protocols/repository.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/protocols/telemetry.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/core/types.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/config/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/config/loader.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/config/middleware_schema.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/config/pipeline.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/config/schema.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/config/settings.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/config/sources.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/context/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/context/carriers/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/context/carriers/grpc.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/context/carriers/http.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/context/carriers/mq.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/events/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/events/bus.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/events/handlers/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/logging/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/logging/config.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/logging/interface.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/logging/logger.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/logging/observability.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/metrics/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/metrics/decorators.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/metrics/manager.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/metrics/observer.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/metrics/performance.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/metrics/registry.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/metrics/types.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/plugins/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/plugins/hooks.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/plugins/manager.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/resilience/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/resilience/circuit_breaker.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/sanitize/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/sanitize/service.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/telemetry/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/telemetry/exporters/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/telemetry/facade.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/telemetry/noop.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/context.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/decorators.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/exporters.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/integrations/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/integrations/database.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/integrations/sqlalchemy_instrumentation.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/interceptors/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/interceptors/grpc.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/interceptors/http.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/infrastructure/tracing/manager.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/plugins/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/plugins/builtin/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/plugins/builtin/monitoring/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/plugins/builtin/monitoring/plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/plugins/builtin/reporting/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/plugins/builtin/reporting/allure_plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/assertions/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/assertions/helper.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/assertions/json_schema.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/assertions/matchers.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/builders/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/builders/base.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/factories/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/factories/base.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/factories/examples.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/generators/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/generators/data_generator.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/loaders/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/loaders/base.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/loaders/csv_loader.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/loaders/json_loader.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/data/loaders/yaml_loader.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/debugging/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/debugging/console.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/decorators/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/decorators/actions_class.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/decorators/api_class.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/allure.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/auth.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/cleanup.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/core.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/debugging.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/message_queue.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/metrics.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/monitoring.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/fixtures/ui.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/mocking/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/mocking/database_mock.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/mocking/http_mock.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/mocking/redis_mock.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/mocking/time_mock.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/plugins/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/plugins/api_autodiscovery.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/plugins/debug.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/plugins/env_plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/plugins/logging_plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/plugins/markers.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/reporting/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/reporting/allure/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/reporting/allure/helper.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/src/df_test_framework/testing/reporting/allure/observer.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/README.md +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/bootstrap/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/bootstrap/test_bootstrap.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/bootstrap/test_providers.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/bootstrap/test_runtime.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/graphql/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/graphql/test_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/graphql/test_middleware.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/graphql/test_models.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/graphql/test_query_builder.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/grpc/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/grpc/test_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/grpc/test_middleware.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/grpc/test_models.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/auth/signature/test_strategies.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/core/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/core/test_multipart.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/core/test_request.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/middleware/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/middleware/test_factory.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/middleware/test_logging.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/rest/test_async_base_api.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/rest/test_auth_control.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/clients/http/rest/test_factory.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/databases/redis/test_async_redis.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/databases/redis/test_redis_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/databases/test_async_database.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/databases/test_database.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/databases/test_database_factory.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/databases/test_query_builder.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/databases/test_repositories.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/databases/test_uow.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/drivers/web/test_async_ui.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/drivers/web/test_modern_ui.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/messengers/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/messengers/test_kafka_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/messengers/test_rabbitmq_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/messengers/test_rocketmq_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/storages/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/storages/test_local_file.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/storages/test_oss.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/capabilities/storages/test_s3.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/cli/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/cli/test_env_cmd.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/cli/test_generate_cmd.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/cli/test_init_cmd.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/cli/test_interactive_cmd.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/cli/test_main.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/cli/test_utils.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/conftest.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/protocols/test_client.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/protocols/test_event.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/protocols/test_plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/protocols/test_repository.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/protocols/test_telemetry.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/test_context.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/test_decorators.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/test_event_types.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/test_events.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/test_middleware.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/core/test_types.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/config/test_loader.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/config/test_middleware_schema.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/context/test_carriers.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/events/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/events/test_bus.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/metrics/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/metrics/test_decorators.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/metrics/test_manager.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/metrics/test_observer.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/metrics/test_performance.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/metrics/test_registry.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/metrics/test_types.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/plugins/test_manager.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/resilience/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/resilience/test_circuit_breaker.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/sanitize/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/sanitize/test_service.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/telemetry/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/telemetry/test_facade.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/telemetry/test_noop.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/test_bootstrap.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/test_logging.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/test_pipeline.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/test_runtime.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/test_settings.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/test_sources.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/tracing/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/tracing/test_context.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/tracing/test_decorators.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/tracing/test_exporters.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/tracing/test_integrations.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/tracing/test_interceptors.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/infrastructure/tracing/test_manager.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/integration/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/integration/test_config_environment.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/integration/test_event_observability.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/integration/test_factory_assertions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/integration/test_middleware_chain.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/migration/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/migration/test_v3_13_to_v3_14_examples.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/plugins/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/plugins/builtin/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/plugins/builtin/monitoring/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/plugins/builtin/monitoring/test_plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/test_json_to_model_generator.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/assertions/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/assertions/test_json_schema.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/assertions/test_matchers.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/data/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/data/test_builders.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/data/test_data_generator.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/data/test_factories.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/debugging/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/debugging/test_console_debug_observer.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/decorators/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/decorators/test_actions_class.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/decorators/test_api_class.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/fixtures/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/fixtures/test_cleanup.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/fixtures/test_fixtures_core.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/fixtures/test_fixtures_debugging.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/fixtures/test_fixtures_message_queue.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/fixtures/test_fixtures_monitoring.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/fixtures/test_monitoring_metrics.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/fixtures/test_ui_fixtures.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/mocking/__init__.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/mocking/test_database_mock.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/mocking/test_http_mock.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/mocking/test_redis_mock.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/mocking/test_time_mock.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/plugins/test_api_autodiscovery.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/plugins/test_debug_plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/plugins/test_env_plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/plugins/test_logging_plugin.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/plugins/test_markers.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/reporting/test_allure_observer.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/test_allure_helper.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/test_assertions.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/test_data_loaders.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/tests/testing/test_factories_presets.py +0 -0
- {df_test_framework-4.1.0 → df_test_framework-4.1.2}/verify_fixes.py +0 -0
|
@@ -5,6 +5,65 @@
|
|
|
5
5
|
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
|
|
6
6
|
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
7
7
|
|
|
8
|
+
## [4.1.2] - 2026-03-16
|
|
9
|
+
|
|
10
|
+
### ✨ 新增功能
|
|
11
|
+
|
|
12
|
+
- ⏱️ **Per-request timeout**: `HttpClient`/`AsyncHttpClient` 支持单请求级别超时覆盖客户端默认值
|
|
13
|
+
- 🔄 **AsyncHttpClient 同步版对齐**: 补齐 `head()`/`options()`/`request_raw()`/认证状态管理方法
|
|
14
|
+
|
|
15
|
+
### 🔧 修复
|
|
16
|
+
|
|
17
|
+
- 🔗 **绝对 URL 修复**: `_convert_to_httpx_response()` 对绝对 URL 不再错误拼接 base_url
|
|
18
|
+
|
|
19
|
+
### 🗑️ 移除
|
|
20
|
+
|
|
21
|
+
- **Worker 模块**: 移除 `worker/` 模块(app.py/schemas.py/__init__.py)及 `df-test-worker` 入口点
|
|
22
|
+
- 经调研 MeterSphere/HttpRunnerManager/testhub_platform,业界无测试平台使用独立 HTTP 服务转发模式
|
|
23
|
+
- OMS 测试平台应通过库导入方式(`from df_test_framework import AsyncHttpClient`)使用框架能力
|
|
24
|
+
- 框架回归纯粹的"库 + CLI 工具"定位
|
|
25
|
+
|
|
26
|
+
### 📚 文档
|
|
27
|
+
|
|
28
|
+
- 📝 API 参考、HTTP 客户端指南补充 v4.1.2 新增方法和用法
|
|
29
|
+
|
|
30
|
+
## [4.1.1] - 2026-03-11
|
|
31
|
+
|
|
32
|
+
### ✨ 新增功能
|
|
33
|
+
|
|
34
|
+
- 🔄 **统一 Response 层**: `HttpClient`/`AsyncHttpClient` 的所有方法统一返回框架 `Response` 对象,不再返回 `httpx.Response`
|
|
35
|
+
- ⏱️ **请求计时**: `Response` 新增 `elapsed` 字段(秒),自动记录每次请求耗时
|
|
36
|
+
- 🧩 **Response 兼容方法**: 新增 `text` 属性、`json()` 方法、`raise_for_status()` 方法,兼容 httpx.Response 用法
|
|
37
|
+
- 🏊 **AsyncBrowserPool**: 新增异步浏览器实例池,支持并发 UI 测试(Semaphore 控制并发,按最少 context 分配)
|
|
38
|
+
- 🔙 **request_raw()**: `HttpClient` 新增 `request_raw()` 方法,供需要原始 `httpx.Response` 的场景使用
|
|
39
|
+
- 🛠️ **fetch_swagger 增强**: 重构为 argparse,支持 `-H` 自定义请求头、`-d` 输出目录、中文文件名保留
|
|
40
|
+
|
|
41
|
+
### 🔄 变更
|
|
42
|
+
|
|
43
|
+
- ⚠️ **异常统一**: httpx 异常(`TimeoutException`/`ConnectError`/`HTTPError`)统一包装为框架 `HttpError`,原始异常通过 `__cause__` 保留
|
|
44
|
+
- ⚠️ **BaseAPI 异常变更**: `_parse_response()` 中 HTTP 错误从 `httpx.HTTPStatusError` 改为 `HttpError`
|
|
45
|
+
- 📏 **ResponseAssertions**: `assert_response_time` 兼容 `timedelta`(httpx)和 `float` 秒数(框架 Response)
|
|
46
|
+
|
|
47
|
+
### 📚 文档
|
|
48
|
+
|
|
49
|
+
- 📝 API 参考、认证指南、中间件指南中 `HTTPStatusError` 更新为 `HttpError`
|
|
50
|
+
|
|
51
|
+
### ⚠️ 迁移指南
|
|
52
|
+
|
|
53
|
+
用户项目中捕获 httpx 异常的代码需要更新:
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
# 之前
|
|
57
|
+
from httpx import HTTPStatusError
|
|
58
|
+
with pytest.raises((BusinessError, HTTPStatusError)):
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
# 现在
|
|
62
|
+
from df_test_framework.core.exceptions import HttpError
|
|
63
|
+
with pytest.raises((BusinessError, HttpError)):
|
|
64
|
+
...
|
|
65
|
+
```
|
|
66
|
+
|
|
8
67
|
## [4.1.0] - 2026-03-03
|
|
9
68
|
|
|
10
69
|
### ✨ 新增功能
|
|
@@ -8,8 +8,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
8
8
|
|
|
9
9
|
**DF Test Framework** - 现代化 Python 测试自动化框架
|
|
10
10
|
|
|
11
|
-
- **版本**: v4.
|
|
12
|
-
- **更新时间**: 2026-
|
|
11
|
+
- **版本**: v4.1.2
|
|
12
|
+
- **更新时间**: 2026-03-16
|
|
13
13
|
- **Python**: 3.12+
|
|
14
14
|
- **核心技术栈**: pytest + httpx + Playwright + Pydantic v2 + SQLAlchemy 2.0 + Pluggy
|
|
15
15
|
- **架构**: 五层架构 + 横切关注点(能力层驱动设计)
|
|
@@ -50,16 +50,21 @@ uv run pytest --cov=src/df_test_framework --cov-report=term-missing
|
|
|
50
50
|
## 五层架构
|
|
51
51
|
|
|
52
52
|
```
|
|
53
|
-
Layer 4 ─── bootstrap/
|
|
54
|
-
Layer 3 ─── testing/ + cli/
|
|
55
|
-
Layer 2 ─── capabilities/
|
|
56
|
-
Layer 1 ─── infrastructure/
|
|
57
|
-
Layer 0 ─── core/
|
|
58
|
-
横切 ───── plugins/
|
|
53
|
+
Layer 4 ─── bootstrap/ # 引导层:Bootstrap、Providers、Runtime
|
|
54
|
+
Layer 3 ─── testing/ + cli/ # 门面层:Fixtures、CLI
|
|
55
|
+
Layer 2 ─── capabilities/ # 能力层:HTTP/UI/DB/MQ/Storage
|
|
56
|
+
Layer 1 ─── infrastructure/ # 基础设施:config/logging/events/plugins
|
|
57
|
+
Layer 0 ─── core/ # 核心层:纯抽象(无依赖)
|
|
58
|
+
横切 ───── plugins/ # 插件:MonitoringPlugin、AllurePlugin
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
**依赖规则**: 高层可依赖低层,反之不行。Layer 0 无任何依赖。
|
|
62
62
|
|
|
63
|
+
**层级 ≠ 目录**: 层级是依赖规则,不是目录划分。同一层可以有多个顶级目录:
|
|
64
|
+
- Layer 3 包含两个独立接口:`testing/`(pytest fixtures)、`cli/`(命令行)
|
|
65
|
+
- 它们都是框架能力的"门面",依赖 Layer 0-2,互相不依赖
|
|
66
|
+
- 新增接口层时放在 `src/df_test_framework/` 下作为独立目录,不要嵌入 bootstrap/ 等其他层
|
|
67
|
+
|
|
63
68
|
---
|
|
64
69
|
|
|
65
70
|
## 核心模式
|
|
@@ -73,15 +73,31 @@ print(f"用户名: {user['name']}")
|
|
|
73
73
|
|
|
74
74
|
#### 请求方法
|
|
75
75
|
- `get(url, params=None, **kwargs)` - GET请求
|
|
76
|
-
- `post(url, json=None, data=None, **kwargs)` - POST请求
|
|
77
|
-
- `put(url, json=None, **kwargs)` - PUT请求
|
|
78
|
-
- `patch(url, json=None, **kwargs)` - PATCH请求
|
|
76
|
+
- `post(url, json=None, data=None, files=None, content=None, **kwargs)` - POST请求
|
|
77
|
+
- `put(url, json=None, data=None, files=None, content=None, **kwargs)` - PUT请求
|
|
78
|
+
- `patch(url, json=None, data=None, files=None, content=None, **kwargs)` - PATCH请求
|
|
79
79
|
- `delete(url, **kwargs)` - DELETE请求
|
|
80
|
+
- `head(url, **kwargs)` - HEAD请求(v3.20.0+)
|
|
81
|
+
- `options(url, **kwargs)` - OPTIONS请求(v3.20.0+)
|
|
80
82
|
- `request(method, url, **kwargs)` - 通用请求方法
|
|
83
|
+
- `request_raw(method, url, **kwargs)` - 通用请求,返回原始 httpx.Response(v3.20.0+)
|
|
84
|
+
|
|
85
|
+
**通用 kwargs**(v4.1.2+):
|
|
86
|
+
- `timeout` - per-request 超时(秒),覆盖客户端默认值
|
|
87
|
+
- `skip_auth` - 跳过认证中间件(v3.19.0+)
|
|
88
|
+
- `token` - 使用自定义 Token(v3.19.0+)
|
|
81
89
|
|
|
82
90
|
#### 认证方法
|
|
83
91
|
- `set_auth_token(token, token_type="Bearer")` - 设置认证Token
|
|
84
92
|
|
|
93
|
+
#### 认证状态管理(v3.19.0+)
|
|
94
|
+
- `clear_auth_cache()` - 清除 BearerTokenMiddleware 的 Token 缓存
|
|
95
|
+
- `clear_cookies()` - 清除所有 Cookies(v3.21.0+)
|
|
96
|
+
- `clear_cookie(name)` - 清除指定 Cookie,返回 bool(v3.25.0+)
|
|
97
|
+
- `get_cookies()` - 获取所有 Cookies 字典(v3.25.0+)
|
|
98
|
+
- `reset_auth_state()` - 重置认证状态(清缓存+清Cookie)(v3.25.0+)
|
|
99
|
+
- `get_auth_info()` - 获取认证信息(Token 预览、中间件数、Cookie 列表)(v3.25.0+)
|
|
100
|
+
|
|
85
101
|
#### 管理方法
|
|
86
102
|
- `close()` - 关闭客户端连接
|
|
87
103
|
|
|
@@ -85,12 +85,10 @@ def request(
|
|
|
85
85
|
- `url`: 请求路径(相对于base_url)
|
|
86
86
|
- `**kwargs`: 其他请求参数(params, json, data, headers等)
|
|
87
87
|
|
|
88
|
-
**返回**: `
|
|
88
|
+
**返回**: `Response` 对象(框架统一响应)
|
|
89
89
|
|
|
90
90
|
**异常**:
|
|
91
|
-
- `
|
|
92
|
-
- `httpx.HTTPStatusError`: HTTP状态错误
|
|
93
|
-
- `httpx.RequestError`: 请求错误
|
|
91
|
+
- `HttpError`: HTTP 请求错误(超时、连接失败、状态码错误等)
|
|
94
92
|
|
|
95
93
|
**重试策略**:
|
|
96
94
|
- ✅ **自动重试**: 超时异常和5xx服务器错误
|
|
@@ -23,12 +23,12 @@ DF Test Framework v4.0 采用**清晰分层、职责单一、依赖倒置**的
|
|
|
23
23
|
## 🏗️ 五层架构
|
|
24
24
|
|
|
25
25
|
```
|
|
26
|
-
Layer 4 ─── bootstrap/
|
|
27
|
-
Layer 3 ─── testing/ + cli/
|
|
28
|
-
Layer 2 ─── capabilities/
|
|
29
|
-
Layer 1 ─── infrastructure/
|
|
30
|
-
Layer 0 ─── core/
|
|
31
|
-
横切 ───── plugins/
|
|
26
|
+
Layer 4 ─── bootstrap/ # 引导层:Bootstrap、Providers、Runtime
|
|
27
|
+
Layer 3 ─── testing/ + cli/ # 门面层:Fixtures、CLI
|
|
28
|
+
Layer 2 ─── capabilities/ # 能力层:HTTP/UI/DB/MQ/Storage
|
|
29
|
+
Layer 1 ─── infrastructure/ # 基础设施:config/logging/events/plugins
|
|
30
|
+
Layer 0 ─── core/ # 核心层:纯抽象(无依赖)
|
|
31
|
+
横切 ───── plugins/ # 插件:MonitoringPlugin、AllurePlugin
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
### 依赖规则
|
|
@@ -37,6 +37,19 @@ Layer 0 ─── core/ # 核心层:纯抽象(无依赖)
|
|
|
37
37
|
- ❌ **禁止向上依赖**: Layer 0 不依赖任何层,Layer 1 只能依赖 Layer 0
|
|
38
38
|
- ✅ **横切独立**: Plugins 可依赖所有层,提供跨层能力增强
|
|
39
39
|
|
|
40
|
+
### 层级与目录的关系
|
|
41
|
+
|
|
42
|
+
> **层级是依赖规则,不是目录映射。** 同一层可以有多个独立的顶级目录。
|
|
43
|
+
|
|
44
|
+
Layer 3(门面层)包含两个并列的"接口"目录,它们是框架能力的不同访问方式:
|
|
45
|
+
|
|
46
|
+
| 目录 | 访问者 | 访问方式 |
|
|
47
|
+
|------|--------|---------|
|
|
48
|
+
| `testing/` | pytest | Fixtures + 装饰器 |
|
|
49
|
+
| `cli/` | 开发者 | 命令行(`df-test`) |
|
|
50
|
+
|
|
51
|
+
这两个目录互相独立、互不依赖,都只依赖 Layer 0-2。新增接口层时应在 `src/df_test_framework/` 下创建独立目录,**不要嵌入** `bootstrap/`、`capabilities/` 等其他层目录中。
|
|
52
|
+
|
|
40
53
|
---
|
|
41
54
|
|
|
42
55
|
## 📦 各层职责
|
|
@@ -102,11 +115,11 @@ Layer 0 ─── core/ # 核心层:纯抽象(无依赖)
|
|
|
102
115
|
|
|
103
116
|
### Layer 3: Testing + CLI 门面层
|
|
104
117
|
|
|
105
|
-
**职责**:
|
|
118
|
+
**职责**: 为不同访问者提供框架能力的便捷接口
|
|
106
119
|
|
|
107
120
|
**包含**:
|
|
108
121
|
|
|
109
|
-
**testing/** -
|
|
122
|
+
**testing/** - 测试支持(访问者:pytest)
|
|
110
123
|
- `fixtures/` - Pytest Fixtures(async_http_client, async_database, etc.)
|
|
111
124
|
- `decorators/` - 类和方法装饰器(@api_class, @actions_class)
|
|
112
125
|
- `data/` - 测试数据管理
|
|
@@ -119,7 +132,7 @@ Layer 0 ─── core/ # 核心层:纯抽象(无依赖)
|
|
|
119
132
|
- `debugging/` - 调试工具(ConsoleDebugObserver)
|
|
120
133
|
- `reporting/` - Allure 报告集成
|
|
121
134
|
|
|
122
|
-
**cli/** -
|
|
135
|
+
**cli/** - 命令行工具(访问者:开发者)
|
|
123
136
|
- `commands/` - df-test 命令集(init, gen, env)
|
|
124
137
|
- `templates/` - 项目和代码模板
|
|
125
138
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# 代码结构导航
|
|
2
2
|
|
|
3
3
|
> **目标读者**: 框架开发者、问题修复者、代码贡献者
|
|
4
|
-
> **更新日期**: 2026-
|
|
5
|
-
> **框架版本**: v4.
|
|
4
|
+
> **更新日期**: 2026-03-16
|
|
5
|
+
> **框架版本**: v4.1.2
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
- [Layer 1: 基础设施层 (infrastructure/)](#layer-1-基础设施层-infrastructure)
|
|
14
14
|
- [Layer 2: 能力层 (capabilities/)](#layer-2-能力层-capabilities)
|
|
15
15
|
- [Layer 3: 门面层 (testing/ + cli/)](#layer-3-门面层-testing--cli)
|
|
16
|
+
|
|
16
17
|
- [Layer 4: 引导层 (bootstrap/)](#layer-4-引导层-bootstrap)
|
|
17
18
|
- [横切关注点 (plugins/)](#横切关注点-plugins)
|
|
18
19
|
- [依赖关系图](#依赖关系图)
|
|
@@ -502,7 +503,7 @@ plugins/
|
|
|
502
503
|
└────────────────────┬────────────────────────────────────┘
|
|
503
504
|
│ 依赖
|
|
504
505
|
┌────────────────────▼────────────────────────────────────┐
|
|
505
|
-
│ Layer 3: testing/ + cli/
|
|
506
|
+
│ Layer 3: testing/ + cli/ │
|
|
506
507
|
│ (只依赖 Layer 0-2) │
|
|
507
508
|
└────────────────────┬────────────────────────────────────┘
|
|
508
509
|
│ 依赖
|
|
@@ -630,5 +631,5 @@ from df_test_framework.capabilities.clients.http import HttpClient # 违反依
|
|
|
630
631
|
|
|
631
632
|
---
|
|
632
633
|
|
|
633
|
-
**最后更新**: 2026-
|
|
634
|
+
**最后更新**: 2026-03-16
|
|
634
635
|
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
|
|
13
13
|
**架构层级**:
|
|
14
14
|
```
|
|
15
|
-
Layer 4 ─── bootstrap/
|
|
16
|
-
Layer 3 ─── testing/ + cli/
|
|
17
|
-
Layer 2 ─── capabilities/
|
|
18
|
-
Layer 1 ─── infrastructure/
|
|
19
|
-
Layer 0 ─── core/
|
|
20
|
-
横切 ───── plugins/
|
|
15
|
+
Layer 4 ─── bootstrap/ # 引导层
|
|
16
|
+
Layer 3 ─── testing/ + cli/ # 门面层(接口层)
|
|
17
|
+
Layer 2 ─── capabilities/ # 能力层
|
|
18
|
+
Layer 1 ─── infrastructure/ # 基础设施层
|
|
19
|
+
Layer 0 ─── core/ # 核心层
|
|
20
|
+
横切 ───── plugins/ # 插件层
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
**依赖规则**:
|
|
@@ -25,6 +25,8 @@ Layer 0 ─── core/ # 核心层
|
|
|
25
25
|
- ✅ Layer 0 无任何第三方依赖
|
|
26
26
|
- ✅ Plugins 可依赖所有层
|
|
27
27
|
|
|
28
|
+
> **层级 ≠ 目录**:层级定义的是依赖规则,而非目录映射。同一层可以有多个独立的顶级目录(如 Layer 3 的 testing/、cli/),它们互不依赖。新增接口层时应在 `src/df_test_framework/` 下创建独立目录,不要嵌入其他层的目录中。
|
|
29
|
+
|
|
28
30
|
---
|
|
29
31
|
|
|
30
32
|
## 🔷 Layer 0: Core 核心层
|
|
@@ -289,7 +291,14 @@ async def test_login(app_actions: AppActions):
|
|
|
289
291
|
|
|
290
292
|
### 职责
|
|
291
293
|
|
|
292
|
-
|
|
294
|
+
为**不同访问者**提供框架能力的便捷接口。Layer 3 是框架的"门面",包含两个并列的接口目录:
|
|
295
|
+
|
|
296
|
+
| 目录 | 访问者 | 访问方式 | 版本 |
|
|
297
|
+
|------|--------|---------|------|
|
|
298
|
+
| `testing/` | pytest 测试用例 | Fixtures + 装饰器 | v2.0+ |
|
|
299
|
+
| `cli/` | 开发者 | 命令行 `df-test` | v3.0+ |
|
|
300
|
+
|
|
301
|
+
这两个目录**互相独立、互不依赖**,都只依赖 Layer 0-2(通过 Layer 4 Bootstrap 引导框架)。
|
|
293
302
|
|
|
294
303
|
### 目录结构
|
|
295
304
|
|
|
@@ -478,8 +487,11 @@ plugins/
|
|
|
478
487
|
| 添加配置项 | Layer 1 | 新增配置模型 |
|
|
479
488
|
| 与外部系统交互 | Layer 2 | 新增 Elasticsearch 客户端 |
|
|
480
489
|
| 测试辅助工具 | Layer 3 | 新增数据生成器 |
|
|
490
|
+
| 新的框架访问接口 | Layer 3 | WebSocket 接口等 |
|
|
481
491
|
| 跨层功能增强 | Plugins | 新增性能分析插件 |
|
|
482
492
|
|
|
493
|
+
> **注意**:新增 Layer 3 接口时,在 `src/df_test_framework/` 下创建独立目录,不要放入 `bootstrap/`、`capabilities/` 或其他层的目录中。Layer 3 的每个目录是框架能力的一种访问方式,它们互不依赖。
|
|
494
|
+
|
|
483
495
|
### 2. 如何遵循依赖规则?
|
|
484
496
|
|
|
485
497
|
✅ **正确示例**:
|
|
@@ -205,7 +205,7 @@ http_client.clear_cookies()
|
|
|
205
205
|
def test_full_auth_flow(admin_auth_api, settings):
|
|
206
206
|
"""测试完整的登录-获取用户-登出流程"""
|
|
207
207
|
from df_test_framework import BusinessError
|
|
208
|
-
from
|
|
208
|
+
from df_test_framework.core.exceptions import HttpError
|
|
209
209
|
|
|
210
210
|
username = settings.business.admin_username
|
|
211
211
|
password = settings.business.admin_password
|
|
@@ -222,7 +222,7 @@ def test_full_auth_flow(admin_auth_api, settings):
|
|
|
222
222
|
admin_auth_api.logout(token=token)
|
|
223
223
|
|
|
224
224
|
# 4. 验证 Token 已失效
|
|
225
|
-
with pytest.raises((BusinessError,
|
|
225
|
+
with pytest.raises((BusinessError, HttpError)):
|
|
226
226
|
admin_auth_api.get_current_user(token=token)
|
|
227
227
|
|
|
228
228
|
# 5. 清理(确保不影响其他测试)
|
|
@@ -236,10 +236,10 @@ def test_full_auth_flow(admin_auth_api, settings):
|
|
|
236
236
|
def test_get_current_user_without_login(admin_auth_api):
|
|
237
237
|
"""测试未登录状态下获取当前用户"""
|
|
238
238
|
from df_test_framework import BusinessError
|
|
239
|
-
from
|
|
239
|
+
from df_test_framework.core.exceptions import HttpError
|
|
240
240
|
|
|
241
241
|
# 使用 skip_auth=True 跳过认证中间件
|
|
242
|
-
with pytest.raises((BusinessError,
|
|
242
|
+
with pytest.raises((BusinessError, HttpError)):
|
|
243
243
|
admin_auth_api.get_current_user(skip_auth=True)
|
|
244
244
|
```
|
|
245
245
|
|
|
@@ -311,7 +311,7 @@ admin_auth_api.logout(token=token)
|
|
|
311
311
|
|
|
312
312
|
```python
|
|
313
313
|
# ✅ 推荐:使用 skip_auth 测试未登录场景
|
|
314
|
-
with pytest.raises((BusinessError,
|
|
314
|
+
with pytest.raises((BusinessError, HttpError)):
|
|
315
315
|
admin_auth_api.get_current_user(skip_auth=True)
|
|
316
316
|
```
|
|
317
317
|
|
|
@@ -213,7 +213,7 @@ async with AsyncHttpClient("https://api.example.com") as client:
|
|
|
213
213
|
response = await client.get("/users")
|
|
214
214
|
response = await client.get("/users", params={"page": 1, "size": 10})
|
|
215
215
|
|
|
216
|
-
# POST
|
|
216
|
+
# POST 请求(v4.1.2: 显式签名 json/data/files/content)
|
|
217
217
|
response = await client.post("/users", json={"name": "Alice", "age": 30})
|
|
218
218
|
|
|
219
219
|
# PUT 请求
|
|
@@ -224,6 +224,12 @@ async with AsyncHttpClient("https://api.example.com") as client:
|
|
|
224
224
|
|
|
225
225
|
# PATCH 请求
|
|
226
226
|
response = await client.patch("/users/1", json={"age": 31})
|
|
227
|
+
|
|
228
|
+
# HEAD 请求(v4.1.2 异步版对齐)
|
|
229
|
+
response = await client.head("/files/123")
|
|
230
|
+
|
|
231
|
+
# OPTIONS 请求(v4.1.2 异步版对齐)
|
|
232
|
+
response = await client.options("/api/users")
|
|
227
233
|
```
|
|
228
234
|
|
|
229
235
|
### 并发请求(核心优势)
|
|
@@ -711,6 +717,70 @@ response = client.get("/users/profile", token="custom_token_here")
|
|
|
711
717
|
client.clear_auth_cache()
|
|
712
718
|
```
|
|
713
719
|
|
|
720
|
+
### 认证状态管理(v3.19.0+)
|
|
721
|
+
|
|
722
|
+
```python
|
|
723
|
+
# 清除所有认证状态(Token 缓存 + Cookies)
|
|
724
|
+
client.reset_auth_state()
|
|
725
|
+
|
|
726
|
+
# 或分别操作
|
|
727
|
+
client.clear_auth_cache() # 仅清除 BearerTokenMiddleware 缓存
|
|
728
|
+
client.clear_cookies() # 仅清除 httpx Cookies
|
|
729
|
+
client.clear_cookie("sid") # 清除指定 Cookie
|
|
730
|
+
|
|
731
|
+
# 查看当前认证信息(调试用)
|
|
732
|
+
info = client.get_auth_info()
|
|
733
|
+
print(info)
|
|
734
|
+
# {
|
|
735
|
+
# "has_token_cache": True,
|
|
736
|
+
# "token_preview": "eyJhbGciOiJIUzI1Ni...",
|
|
737
|
+
# "middleware_count": 1,
|
|
738
|
+
# "cookies_count": 2,
|
|
739
|
+
# "cookies": ["session_id", "csrf_token"]
|
|
740
|
+
# }
|
|
741
|
+
|
|
742
|
+
# 获取所有 Cookies
|
|
743
|
+
cookies = client.get_cookies() # {"session_id": "abc", "csrf_token": "xyz"}
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
> **注意**:以上认证状态管理方法在 HttpClient 和 AsyncHttpClient 上签名一致(同步方法,无需 await)。
|
|
747
|
+
|
|
748
|
+
### Per-request 超时(v4.1.2+)
|
|
749
|
+
|
|
750
|
+
单个请求可以覆盖客户端级别的默认超时:
|
|
751
|
+
|
|
752
|
+
```python
|
|
753
|
+
# 客户端默认 30 秒超时
|
|
754
|
+
client = HttpClient("https://api.example.com", timeout=30)
|
|
755
|
+
|
|
756
|
+
# 慢接口:单独设置 120 秒超时
|
|
757
|
+
response = client.get("/reports/generate", timeout=120)
|
|
758
|
+
|
|
759
|
+
# 快接口:使用客户端默认超时(30 秒)
|
|
760
|
+
response = client.get("/health")
|
|
761
|
+
```
|
|
762
|
+
|
|
763
|
+
异步客户端同样支持:
|
|
764
|
+
|
|
765
|
+
```python
|
|
766
|
+
async with AsyncHttpClient("https://api.example.com", timeout=30) as client:
|
|
767
|
+
# per-request 超时覆盖客户端默认值
|
|
768
|
+
response = await client.post("/long-running-task", json=data, timeout=300)
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
### 获取原始 httpx.Response(v3.20.0+)
|
|
772
|
+
|
|
773
|
+
当需要访问 httpx 原始 Response 对象时(如流式读取、底层 headers 操作):
|
|
774
|
+
|
|
775
|
+
```python
|
|
776
|
+
# 同步
|
|
777
|
+
raw_response = client.request_raw("GET", "/files/123")
|
|
778
|
+
assert isinstance(raw_response, httpx.Response)
|
|
779
|
+
|
|
780
|
+
# 异步(v4.1.2 对齐)
|
|
781
|
+
raw_response = await async_client.request_raw("GET", "/files/123")
|
|
782
|
+
```
|
|
783
|
+
|
|
714
784
|
更多中间件使用细节请参考:[中间件使用指南](./middleware_guide.md)
|
|
715
785
|
|
|
716
786
|
---
|
|
@@ -1246,6 +1316,7 @@ async def test_concurrent():
|
|
|
1246
1316
|
|
|
1247
1317
|
## 版本历史
|
|
1248
1318
|
|
|
1319
|
+
- **v4.1.2**: AsyncHttpClient 与同步版对齐(head/options/request_raw/认证状态管理/per-request timeout)
|
|
1249
1320
|
- **v4.0.0**: 异步性能优化(30倍提升)
|
|
1250
1321
|
- **v3.36.0**: HTTPConfig 支持顶层配置和环境变量
|
|
1251
1322
|
- **v3.22.0**: HttpEventPublisherMiddleware 发布事件
|
|
@@ -286,7 +286,7 @@ client.use(middleware)
|
|
|
286
286
|
```python
|
|
287
287
|
# 测试未登录场景(接口需要验证"未登录时返回 401")
|
|
288
288
|
def test_get_current_user_without_login(api):
|
|
289
|
-
with pytest.raises((BusinessError,
|
|
289
|
+
with pytest.raises((BusinessError, HttpError)):
|
|
290
290
|
api.get_current_user(skip_auth=True) # 不添加 Token
|
|
291
291
|
```
|
|
292
292
|
|
|
@@ -307,7 +307,7 @@ def test_full_auth_flow(api):
|
|
|
307
307
|
api.logout(token=token)
|
|
308
308
|
|
|
309
309
|
# 4. 继续用同一个 Token,验证已失效
|
|
310
|
-
with pytest.raises((BusinessError,
|
|
310
|
+
with pytest.raises((BusinessError, HttpError)):
|
|
311
311
|
api.get_current_user(token=token)
|
|
312
312
|
```
|
|
313
313
|
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# v4.1.1 发布说明
|
|
2
|
+
|
|
3
|
+
**发布日期**: 2026-03-11
|
|
4
|
+
|
|
5
|
+
统一 HTTP 响应层,所有请求方法返回框架 `Response` 对象,异常统一为 `HttpError`。新增 `AsyncBrowserPool` 和 `fetch_swagger` 增强。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 新增功能
|
|
10
|
+
|
|
11
|
+
### 统一 Response 层
|
|
12
|
+
|
|
13
|
+
`HttpClient` / `AsyncHttpClient` 的所有方法(`get`/`post`/`put`/`patch`/`delete`/`head`/`options`)统一返回框架 `Response` 对象,不再返回 `httpx.Response`。
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from df_test_framework.capabilities.clients.http.core.response import Response
|
|
17
|
+
|
|
18
|
+
# 之前:返回 httpx.Response
|
|
19
|
+
# 现在:返回框架 Response(包含 status_code, headers, body, json_data, elapsed, context)
|
|
20
|
+
response = client.get("/users")
|
|
21
|
+
assert isinstance(response, Response)
|
|
22
|
+
assert response.elapsed > 0 # 请求耗时(秒)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**新增 `request_raw()` 方法**:需要原始 `httpx.Response` 时使用:
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
httpx_response = client.request_raw("GET", "/users") # 返回 httpx.Response
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Response 增强
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
response.text # 响应文本(兼容 httpx.Response.text)
|
|
35
|
+
response.json() # 获取 JSON 数据(兼容 httpx.Response.json())
|
|
36
|
+
response.elapsed # 请求耗时(float 秒数)
|
|
37
|
+
response.raise_for_status() # 非 2xx 时抛出 HttpError
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 异常统一
|
|
41
|
+
|
|
42
|
+
httpx 底层异常统一包装为框架 `HttpError`,原始异常通过 `__cause__` 保留:
|
|
43
|
+
|
|
44
|
+
| httpx 异常 | 框架异常 | 错误消息 |
|
|
45
|
+
|------------|---------|---------|
|
|
46
|
+
| `httpx.TimeoutException` | `HttpError` | `请求超时: GET /url` |
|
|
47
|
+
| `httpx.ConnectError` | `HttpError` | `连接失败: GET /url` |
|
|
48
|
+
| `httpx.HTTPError` | `HttpError` | `HTTP错误: GET /url` |
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
from df_test_framework.core.exceptions import HttpError
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
client.get("/slow-endpoint")
|
|
55
|
+
except HttpError as e:
|
|
56
|
+
print(e.message) # "请求超时: GET /slow-endpoint"
|
|
57
|
+
print(e.__cause__) # 原始 httpx.TimeoutException
|
|
58
|
+
print(e.details) # {"original_error": "ReadTimeout", "url": "/slow-endpoint"}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### AsyncBrowserPool
|
|
62
|
+
|
|
63
|
+
异步浏览器实例池,管理多个 `AsyncBrowserManager` 实例,支持并发 UI 测试:
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
from df_test_framework import AsyncBrowserPool
|
|
67
|
+
|
|
68
|
+
pool = AsyncBrowserPool(max_browsers=3, max_contexts_per_browser=10)
|
|
69
|
+
await pool.start()
|
|
70
|
+
|
|
71
|
+
async with pool.acquire() as manager:
|
|
72
|
+
ctx = await manager.new_context()
|
|
73
|
+
page = await ctx.new_page()
|
|
74
|
+
await page.goto("https://example.com")
|
|
75
|
+
await page.close()
|
|
76
|
+
await ctx.close()
|
|
77
|
+
|
|
78
|
+
print(pool.stats) # {"total": 3, "active": 1, "idle": 2, ...}
|
|
79
|
+
await pool.shutdown()
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
特性:
|
|
83
|
+
- `asyncio.Semaphore` 控制总并发数
|
|
84
|
+
- 按最少 context 数分配浏览器实例
|
|
85
|
+
- `_PooledManager` 代理防止单次 acquire 创建多个 context
|
|
86
|
+
- `start()` 失败自动回滚已启动的实例
|
|
87
|
+
|
|
88
|
+
### fetch_swagger 增强
|
|
89
|
+
|
|
90
|
+
重构为 `argparse`,新增自定义请求头和输出目录支持:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# 带认证头
|
|
94
|
+
python scripts/fetch_swagger.py -H 'Authorization: Bearer token' http://example.com
|
|
95
|
+
|
|
96
|
+
# 指定输出目录
|
|
97
|
+
python scripts/fetch_swagger.py -d output/ http://example.com
|
|
98
|
+
|
|
99
|
+
# 组合使用
|
|
100
|
+
python scripts/fetch_swagger.py -H 'Cookie: sid=abc' -d docs/ http://localhost:8089/doc.html
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
改进:
|
|
104
|
+
- 中文文件名保留(`unicodedata.normalize` + 正则清理)
|
|
105
|
+
- JSON 解析容错(不再依赖 content-type 判断)
|
|
106
|
+
- 输出目录自动创建
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 迁移指南
|
|
111
|
+
|
|
112
|
+
### 异常捕获更新
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
# ❌ 之前
|
|
116
|
+
from httpx import HTTPStatusError
|
|
117
|
+
with pytest.raises((BusinessError, HTTPStatusError)):
|
|
118
|
+
api.get_current_user(skip_auth=True)
|
|
119
|
+
|
|
120
|
+
# ✅ 现在
|
|
121
|
+
from df_test_framework.core.exceptions import HttpError
|
|
122
|
+
with pytest.raises((BusinessError, HttpError)):
|
|
123
|
+
api.get_current_user(skip_auth=True)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### BaseAPI 用户(无需改动)
|
|
127
|
+
|
|
128
|
+
`BaseAPI` 的 `get`/`post` 等方法内部已自动使用框架 `Response`,返回 Pydantic 模型或 `dict` 的用法不变。
|
|
129
|
+
|
|
130
|
+
### 直接使用 HttpClient 的用户
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
# ❌ 之前:返回 httpx.Response
|
|
134
|
+
response = client.request("GET", "/users")
|
|
135
|
+
response.raise_for_status() # httpx 方法
|
|
136
|
+
|
|
137
|
+
# ✅ 现在:返回框架 Response
|
|
138
|
+
response = client.request("GET", "/users")
|
|
139
|
+
response.raise_for_status() # 框架方法(行为一致)
|
|
140
|
+
|
|
141
|
+
# 如需原始 httpx.Response
|
|
142
|
+
response = client.request_raw("GET", "/users")
|
|
143
|
+
```
|