# 测试指南

> 项目测试策略和运行方法

---

## 测试分层

```
E2E 测试 - 真实 LLM 调用（需要 API Key）
    ↑
集成测试 - 多模块协作（Mock LLM）
    ↑
单元测试 - 单个函数/类
```

---

## 运行测试

### 本地运行

```bash
# 单元测试 + 集成测试
pytest tests/ -v -m "not e2e"

# 指定模块
pytest tests/test_agent_definition.py -v

# 生成覆盖率报告
pytest --cov=agent --cov-report=html tests/ -m "not e2e"

# E2E 测试（可选，需要 API Key）
GEMINI_API_KEY=xxx pytest tests/e2e/ -v -m e2e
```

### CI 运行

```bash
# 单元测试 + 集成测试（PR 时运行）
pytest tests/ -v -m "not e2e" --cov=agent

# E2E 测试（仅 main 分支）
pytest tests/e2e/ -v -m e2e
```

---

## 覆盖率要求

| 模块 | 目标覆盖率 |
|------|-----------|
| agent/core/ | 90%+ |
| agent/execution/ | 90%+ |
| agent/memory/ | 80%+ |
| agent/tools/ | 85%+ |
| agent/llm/ | 70%+ |

---

## 测试标记

```python
# 单元测试（默认）
def test_something():
    pass

# E2E 测试（需要 API Key）
@pytest.mark.e2e
def test_real_llm():
    pass
```

---

## CI 配置

```yaml
# .github/workflows/test.yml

jobs:
  test:
    - name: Run tests
      run: pytest tests/ -v -m "not e2e" --cov=agent

  e2e:
    if: github.ref == 'refs/heads/main'
    - name: Run E2E tests
      env:
        GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
      run: pytest tests/e2e/ -v -m e2e
```

---

## 测试文件结构

```
tests/
├── conftest.py              # Fixtures
├── test_agent_definition.py
├── test_trace.py
├── test_tools.py
├── integration/
│   ├── test_subagent.py
│   └── test_trace_store.py
└── e2e/
    └── test_subagent_e2e.py
```
