Metadata-Version: 2.4
Name: pytest-datadriver
Version: 0.1.1
Summary: A pytest plugin for data-driven testing with YAML/JSON external data files
Author-email: max_1990 <741003086@qq.com>
License-Expression: MIT
Keywords: pytest,data-driven,yaml,json,testing
Classifier: Development Status :: 4 - Beta
Classifier: Framework :: Pytest
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Testing
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: pytest>=7.0
Requires-Dist: pyyaml>=6.0
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: pytest-cov>=4.0; extra == "dev"

# pytest-datadriver

一个 pytest 插件，支持通过 YAML/JSON 外部数据文件实现数据驱动测试。

## 特性

- **多格式支持**：YAML 和 JSON 外部数据文件，可扩展架构
- **零侵入**：无需修改现有测试代码，通过 CLI 参数可选激活
- **参数自动提取**：基于 AST 静态分析，从现有测试代码提取 parametrize 参数并导出
- **双模式覆盖**：智能覆盖（按 case_no 匹配）和完全替换模式
- **两种数据布局**：case-first 和 function-first
- **fixture 支持**：自动识别 fixture 参数与 parametrize 参数

## 安装

```bash
pip install pytest-datadriver
```

或从源码安装：

```bash
git clone <repo-url>
cd cib-pytest-datadriver
pip install -e .
```

## 快速开始

### 1. 在测试代码中添加标记

```python
import pytest

@pytest.mark.caseNo("TC-001")
@pytest.mark.caseName("加法测试")
@pytest.mark.parametrize("a,b,expected", [
    (1, 2, 3),
    (5, 10, 15),
])
def test_addition(a, b, expected):
    assert a + b == expected
```

### 2. 提取参数到数据文件

```bash
pytest --data-extract --data-output TestData/data.yaml --test-path tests/
```

### 3. 使用数据文件运行测试

```bash
# 智能覆盖（默认）：按 case_no 匹配覆盖参数
pytest tests/ --data-file TestData/data.yaml --data-mode smart

# 完全替换：只执行文件中的用例
pytest tests/ --data-file TestData/data.yaml --data-mode replace
```

## CLI 参数

| 参数 | 说明 | 可选值 | 默认值 |
|------|------|--------|--------|
| `--data-file` | 数据文件路径 | - | 自动查找 TestData/data.yaml |
| `--data-mode` | 覆盖模式 | smart, replace | smart |
| `--data-layout` | 数据布局 | case, func | case |
| `--data-format` | 数据格式 | yaml, json, auto | auto |
| `--data-extract` | 触发提取模式 | - | - |
| `--data-output` | 提取输出路径 | - | TestData/data.yaml |
| `--data-export-format` | 导出详情级别 | simple, full | simple |
| `--data-export-filter` | 导出过滤 | all, case-only | all |
| `--data-module-match` | 模块匹配策略 | fullpath, filename | fullpath |
| `--test-path` | 提取扫描目录 | - | tests/ |

## 数据文件格式

### case-first 布局（默认）

```yaml
TC-001:
  case_name: "加法测试"
  module: "tests/test_math.py"
  function: "test_addition"
  params:
    a: 1
    b: 2
    expected: 3
```

### function-first 布局

```yaml
"tests/test_math.py::test_addition":
  - case_no: "TC-001"
    case_name: "加法测试"
    params:
      a: 1
      b: 2
      expected: 3
```

## 依赖

- Python >= 3.9
- pytest >= 7.0
- pyyaml >= 6.0

## 打包与发布

### 本地打包

```bash
# 安装构建工具
pip install build twine

# 构建分发包（sdist + wheel）
python -m build

# 构建产物位于 dist/ 目录：
# dist/pytest_datadriver-0.1.0.tar.gz
# dist/pytest_datadriver-0.1.0-py3-none-any.whl
```

### 上传到 PyPI

```bash
# 上传到 PyPI（需先配置 ~/.pypirc 或使用 Token）
twine upload dist/*

# 上传到 Test PyPI（预发布验证）
twine upload --repository testpypi dist/*
```

### 上传到私有制品库

```bash
# 上传到私有 PyPI 仓库（需在 ~/.pypirc 中配置仓库地址）
twine upload --repository <your-repo-name> dist/*

# 示例：上传到腾讯云软件源
twine upload --repository-url https://mirrors.tencent.com/repository/pypi/tencent_pypi/simple dist/*
```

### 从制品库安装

```bash
# 从 PyPI 安装
pip install pytest-datadriver

# 从私有制品库安装
pip install pytest-datadriver -i https://mirrors.tencent.com/repository/pypi/tencent_pypi/simple --trusted-host mirrors.tencent.com
```

### ~/.pypirc 配置示例

```ini
[distutils]
index-servers =
    pypi
    tencent

[pypi]
username = __token__
password = pypi-xxxxxxxxxxxx

[tencent]
repository = https://mirrors.tencent.com/repository/pypi/tencent_pypi/simple
username = <your-username>
password = <your-password>
```

## 许可证

MIT
