Metadata-Version: 2.4
Name: df-test-framework
Version: 4.7.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.29.0
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.3
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.34.2
Requires-Dist: sqlalchemy>=2.0.0
Requires-Dist: structlog>=25.4.0
Requires-Dist: urllib3>=2.7.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: pycryptodome>=3.20.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: crypto
Requires-Dist: pycryptodome>=3.20.0; extra == 'crypto'
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: database-mssql
Requires-Dist: aioodbc>=0.5.0; extra == 'database-mssql'
Requires-Dist: pyodbc>=5.1.0; extra == 'database-mssql'
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 测试自动化框架，支持 HTTP/UI/数据库/消息队列多场景测试

[![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/df-test-framework/blob/master/LICENSE)

---

## 核心特性

- **多协议客户端** — HTTP/GraphQL/gRPC，同步/异步双模式，中间件拦截器链（重试、签名、Bearer Token）
- **异步高性能** — `AsyncHttpClient` 并发性能提升 10-30 倍，`AsyncDatabase`/`AsyncRedis` 完整异步支持
- **UI 自动化** — Playwright，同步/异步，浏览器会话复用，失败自动截图与诊断
- **数据库访问** — SQLAlchemy 2.0，多方言（MySQL/PostgreSQL/SQLite/MSSQL），Repository + Unit of Work 模式
- **测试数据管线** — `CaseContext[T]` + YAML 驱动参数化，支持 skip/xfail/seed/tags，CLI 精准过滤复现
- **多客户端模型** — `@service_client` / `@ui_client`，多服务/多前端场景下独立管理各自的连接与配置
- **CLI 脚手架** — `df-test init` 一键生成 api/ui/full 项目，内置 Allure + 自动回滚等即用能力
- **可观测性** — OpenTelemetry 链路追踪 + Prometheus 监控 + Allure 报告自动集成
- **消息队列** — Kafka/RabbitMQ/RocketMQ 统一接口
- **存储客户端** — 本地文件 / AWS S3 / 阿里云 OSS
- **脱敏服务** — HTTP/UI/DB 日志中敏感字段自动遮盖，集中配置
- **Mock 工具** — HTTP/数据库/Redis/时间 Mock，开箱即用

---

## 安装

```bash
# 使用 uv（推荐）
uv add df-test-framework

# 使用 pip
pip install df-test-framework
```

**可选依赖**（按需安装，核心功能无需额外依赖）：

| 依赖组 | 功能 | 安装命令 |
|--------|------|---------|
| `ui` | Playwright UI 测试 | `uv add "df-test-framework[ui]"` |
| `database-async` | 异步数据库驱动（MySQL/PG/SQLite） | `uv add "df-test-framework[database-async]"` |
| `database-mssql` | MSSQL 驱动 | `uv add "df-test-framework[database-mssql]"` |
| `mq` | 消息队列（Kafka + RabbitMQ + RocketMQ） | `uv add "df-test-framework[mq]"` |
| `observability` | OpenTelemetry + Prometheus | `uv add "df-test-framework[observability]"` |
| `storage` | 对象存储（S3 + 阿里云 OSS） | `uv add "df-test-framework[storage]"` |
| `crypto` | AES/DES 加解密 | `uv add "df-test-framework[crypto]"` |
| `all` | 所有可选功能 | `uv add "df-test-framework[all]"` |

---

## 快速开始

### 脚手架建项目（推荐）

```bash
df-test init my-project              # API 测试项目
df-test init my-project --type ui    # UI 测试项目
df-test init my-project --type full  # API + UI 混合

cd my-project && pytest -v
```

### API 测试

```python
from df_test_framework import api_class, BaseAPI

@api_class()
class UserAPI(BaseAPI):
    def get_user(self, user_id: int):
        return self.get(f"/users/{user_id}")

def test_get_user(user_api: UserAPI):   # fixture 由 @api_class 自动注册
    response = user_api.get_user(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 all(r.status_code == 200 for r in responses)
```

### YAML 驱动参数化

```yaml
# tests/data/login.yaml
tests:
  valid_user:
    title: "正常登录"
    marks: [smoke]
    data:
      username: admin
      password: secret
  locked_user:
    title: "锁定账号登录失败"
    xfail: "已知 Bug #123"
    data:
      username: locked
      password: secret
```

```python
import pytest
from df_test_framework.testing.data.pipeline import case_dataset, CaseContext

@pytest.mark.parametrize("ctx", case_dataset("tests/data/login.yaml"))
def test_login(ctx: CaseContext, login_api):
    response = login_api.login(ctx.data["username"], ctx.data["password"])
    assert response.status_code == 200
```

---

## 架构

```
Layer 4 ─── bootstrap/          # 引导层：Bootstrap、Providers、RuntimeContext
Layer 3 ─── testing/ + cli/     # 门面层：pytest 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/df-test-framework/blob/master/docs/user-guide/QUICK_START.md)
- [用户手册](https://github.com/yourorg/df-test-framework/blob/master/docs/user-guide/USER_MANUAL.md)
- [发布说明](https://github.com/yourorg/df-test-framework/blob/master/docs/releases/)
- [更新日志](https://github.com/yourorg/df-test-framework/blob/master/CHANGELOG.md)

---

## 许可证

MIT License
