Metadata-Version: 2.4
Name: df-test-framework
Version: 4.0.3
Summary: 基于交互模式的现代化测试自动化框架，支持多种测试场景
Project-URL: Homepage, https://github.com/yourorg/df-test-framework
Project-URL: Repository, https://github.com/yourorg/df-test-framework
Project-URL: Documentation, https://github.com/yourorg/df-test-framework#readme
Project-URL: Bug Tracker, https://github.com/yourorg/df-test-framework/issues
Author-email: DF QA Team <qa@example.com>
License: MIT
Keywords: api,automation,framework,pytest,testing,ui
Classifier: Development Status :: 4 - Beta
Classifier: Framework :: Pytest
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Quality Assurance
Classifier: Topic :: Software Development :: Testing
Requires-Python: >=3.12
Requires-Dist: allure-pytest>=2.13.0
Requires-Dist: assertpy>=1.1
Requires-Dist: faker>=38.2.0
Requires-Dist: filelock>=3.20.1
Requires-Dist: freezegun>=1.5.0
Requires-Dist: h2>=4.3.0
Requires-Dist: hpack>=4.1.0
Requires-Dist: httpx>=0.27.0
Requires-Dist: hyperframe>=6.1.0
Requires-Dist: jsonpath-ng>=1.7.0
Requires-Dist: jsonschema-spec>=0.2.4
Requires-Dist: jsonschema>=4.25.1
Requires-Dist: openpyxl>=3.1.0
Requires-Dist: pluggy>=1.5.0
Requires-Dist: prance[osv]>=23.6.0
Requires-Dist: pydantic-settings>=2.0.0
Requires-Dist: pydantic>=2.0.0
Requires-Dist: pymysql>=1.1.0
Requires-Dist: pypinyin>=0.53.0
Requires-Dist: pytest-asyncio>=1.3.0
Requires-Dist: pytest-timeout>=2.2.0
Requires-Dist: pytest>=9.0.1
Requires-Dist: python-dotenv>=1.0.0
Requires-Dist: pyyaml>=6.0.0
Requires-Dist: questionary>=2.0.0
Requires-Dist: redis>=5.0.0
Requires-Dist: requests>=2.32.4
Requires-Dist: sqlalchemy>=2.0.0
Requires-Dist: structlog>=25.4.0
Requires-Dist: urllib3>=2.6.0
Provides-Extra: all
Requires-Dist: aiomysql>=0.2.0; extra == 'all'
Requires-Dist: aiosqlite>=0.20.0; extra == 'all'
Requires-Dist: asyncpg>=0.29.0; extra == 'all'
Requires-Dist: boto3>=1.34.0; extra == 'all'
Requires-Dist: confluent-kafka>=2.12.0; extra == 'all'
Requires-Dist: opentelemetry-api>=1.20.0; extra == 'all'
Requires-Dist: opentelemetry-instrumentation-httpx>=0.41b0; extra == 'all'
Requires-Dist: opentelemetry-sdk>=1.20.0; extra == 'all'
Requires-Dist: orjson>=3.9.0; extra == 'all'
Requires-Dist: oss2>=2.18.0; extra == 'all'
Requires-Dist: pika>=1.3.0; extra == 'all'
Requires-Dist: playwright>=1.40.0; extra == 'all'
Requires-Dist: prometheus-client>=0.19.0; extra == 'all'
Requires-Dist: pypinyin>=0.53.0; extra == 'all'
Requires-Dist: rocketmq-python-client>=5.0.0; extra == 'all'
Requires-Dist: selenium>=4.0.0; extra == 'all'
Provides-Extra: codegen
Requires-Dist: pypinyin>=0.53.0; extra == 'codegen'
Provides-Extra: database-async
Requires-Dist: aiomysql>=0.2.0; extra == 'database-async'
Requires-Dist: aiosqlite>=0.20.0; extra == 'database-async'
Requires-Dist: asyncpg>=0.29.0; extra == 'database-async'
Provides-Extra: kafka
Requires-Dist: confluent-kafka>=2.12.0; extra == 'kafka'
Provides-Extra: mq
Requires-Dist: confluent-kafka>=2.12.0; extra == 'mq'
Requires-Dist: pika>=1.3.0; extra == 'mq'
Requires-Dist: rocketmq-python-client>=5.0.0; extra == 'mq'
Provides-Extra: observability
Requires-Dist: opentelemetry-api>=1.20.0; extra == 'observability'
Requires-Dist: opentelemetry-instrumentation-httpx>=0.41b0; extra == 'observability'
Requires-Dist: opentelemetry-sdk>=1.20.0; extra == 'observability'
Requires-Dist: prometheus-client>=0.19.0; extra == 'observability'
Provides-Extra: opentelemetry
Requires-Dist: opentelemetry-api>=1.20.0; extra == 'opentelemetry'
Requires-Dist: opentelemetry-instrumentation-httpx>=0.41b0; extra == 'opentelemetry'
Requires-Dist: opentelemetry-sdk>=1.20.0; extra == 'opentelemetry'
Provides-Extra: performance
Requires-Dist: orjson>=3.9.0; extra == 'performance'
Provides-Extra: prometheus
Requires-Dist: prometheus-client>=0.19.0; extra == 'prometheus'
Provides-Extra: rabbitmq
Requires-Dist: pika>=1.3.0; extra == 'rabbitmq'
Provides-Extra: rocketmq
Requires-Dist: rocketmq-python-client>=5.0.0; extra == 'rocketmq'
Provides-Extra: storage
Requires-Dist: boto3>=1.34.0; extra == 'storage'
Requires-Dist: oss2>=2.18.0; extra == 'storage'
Provides-Extra: ui
Requires-Dist: playwright>=1.40.0; extra == 'ui'
Requires-Dist: selenium>=4.0.0; extra == 'ui'
Description-Content-Type: text/markdown

# DF Test Framework

> 简单、强大、可扩展的现代化 Python 测试自动化框架

[![PyPI version](https://img.shields.io/pypi/v/df-test-framework.svg)](https://pypi.org/project/df-test-framework/)
[![Python](https://img.shields.io/badge/python-3.12+-green.svg)](https://www.python.org/)
[![License](https://img.shields.io/badge/license-MIT-orange.svg)](https://github.com/yourorg/test-framework/blob/master/LICENSE)

---

## 核心特性

### v4.0.0 全面异步化 - 性能飞跃 🚀

- **AsyncHttpClient** - 异步 HTTP 客户端，并发性能提升 **10-30 倍**
- **AsyncDatabase** - 异步数据库客户端，基于 SQLAlchemy 2.0 AsyncEngine
- **AsyncRedis** - 异步 Redis 客户端，缓存操作提升 **5-10 倍**
- **AsyncAppActions** - 异步 UI 测试，Playwright 异步 API，性能提升 **2-3 倍**
- **完全向后兼容** - 同步 API 完整保留，升级路径平滑

### 完整功能

- **HTTP 客户端** - 同步/异步，拦截器链，自动重试
- **GraphQL/gRPC 客户端** - 完整协议支持
- **数据库访问** - SQLAlchemy 2.0，Repository + UnitOfWork 模式
- **消息队列** - Kafka/RabbitMQ/RocketMQ 统一接口
- **存储客户端** - LocalFile/S3/阿里云 OSS
- **可观测性** - OpenTelemetry 追踪 + Prometheus 监控
- **测试工具** - Fixtures、数据构建器、Mock 工具、Allure 集成

---

## 安装

```bash
# 使用 uv（推荐 - 更快更可靠）
uv add df-test-framework

# 使用 pip
pip install df-test-framework

# 可选依赖
uv add "df-test-framework[ui]"            # UI 测试（Playwright）
uv add "df-test-framework[mq]"            # 消息队列
uv add "df-test-framework[observability]" # 可观测性
uv add "df-test-framework[storage]"       # 存储客户端
uv add "df-test-framework[all]"           # 所有功能
```

---

## 快速开始

### 脚手架创建项目

```bash
df-test init my-test-project
cd my-test-project
cp .env.example .env
pytest -v
```

### 手动使用

```python
from df_test_framework import Bootstrap, FrameworkSettings
from pydantic import Field

class DemoSettings(FrameworkSettings):
    api_base_url: str = Field(default="https://api.example.com")

runtime = (
    Bootstrap()
    .with_settings(DemoSettings)
    .build()
    .run()
)

http = runtime.http_client()
response = http.get("/users/1")
assert response.status_code == 200
```

### 异步高性能模式

```python
import asyncio
from df_test_framework import AsyncHttpClient

async def test_concurrent():
    async with AsyncHttpClient("https://api.example.com") as client:
        tasks = [client.get(f"/users/{i}") for i in range(100)]
        responses = await asyncio.gather(*tasks)
        assert len(responses) == 100

asyncio.run(test_concurrent())
```

---

## 架构

```
Layer 4 ─── bootstrap/          # 引导层：Bootstrap、Providers、Runtime
Layer 3 ─── testing/ + cli/     # 门面层：Fixtures、CLI 工具、脚手架
Layer 2 ─── capabilities/       # 能力层：HTTP/UI/DB/MQ/Storage
Layer 1 ─── infrastructure/     # 基础设施：config/logging/events/plugins
Layer 0 ─── core/               # 核心层：纯抽象（无依赖）
横切 ───── plugins/             # 插件：MonitoringPlugin、AllurePlugin
```

---

## 文档

完整文档请访问 [GitHub 仓库](https://github.com/yourorg/test-framework)：

- [快速开始指南](https://github.com/yourorg/test-framework/blob/master/docs/user-guide/QUICK_START.md)
- [完整用户手册](https://github.com/yourorg/test-framework/blob/master/docs/user-guide/USER_MANUAL.md)
- [API 参考](https://github.com/yourorg/test-framework/tree/master/docs/api-reference)
- [版本发布说明](https://github.com/yourorg/test-framework/tree/master/docs/releases)

---

## 许可证

MIT License
