作为负责取数、做报表和业务分析的数据分析师,你可能也有同感:大量时间花在写取数语句、调整表格格式和把结论翻译成业务语言上。单元测试大家都知道重要,但写起来枯燥,边界条件也容易想不全。本文给出数据分析师用 AI 生成单元测试的一套可直接照抄的做法:把函数代码和业务规则交给 AI,先让它列出测试场景清单,确认后再生成测试代码并运行。

使用场景

数据分析师写了一个处理“订单明细”数据的函数,比如按渠道汇总订单金额。上线前需要补测试,但时间紧,而且担心漏掉空数据、异常值这类边界情况。现实中,数据分析师还得兼顾“支持市场部拉取活动人群数据”等日常事务,所以更需要一套拿来就能用的方法。

工具选择

编辑器内的编程助手(GitHub Copilot、Cursor、通义灵码、CodeGeeX 等)可以直接根据函数生成测试;也可以把代码贴给对话助手。

让 AI 生成测试后,一定要在本地运行,并检查断言是否真的验证了业务规则。

案例:一次完整的使用过程(虚构)

设想一个虚构场景:阿杰刚接手一部分新工作,既要完成“支持市场部拉取活动人群数据”,又要准备“优化看板查询性能”。面对需要生成单元测试的任务,阿杰的做法是:先让 AI 按固定结构起草,再对照自己掌握的事实逐项修改,涉及用户明细、手机号和未公开的经营数据的部分一律用代号替换。这样既节省了时间,也守住了准确性和隐私的底线。

操作步骤

  1. 提供被测函数代码和业务规则说明
  2. 让 AI 先列出测试场景:正常、边界、异常
  3. 确认场景清单,补充业务特有的情况
  4. 生成测试代码并在本地运行
  5. 检查失败的用例是代码问题还是测试问题

提示词示例

把方括号和括号里的内容换成你自己的信息即可:

【背景】最近在处理“完成 9 月用户留存分析报告”,同时要准备“优化看板查询性能”。
请为下面的 Python 函数编写 pytest 单元测试。

业务规则:按 category 汇总 amount;amount 为空的记录跳过;amount 为负数时抛出 ValueError。

```python
def summarize(records):
    result = {}
    for r in records:
        if r.get("amount") is None:
            continue
        if r["amount"] < 0:
            raise ValueError("amount must be non-negative")
        result[r["category"]] = result.get(r["category"], 0) + r["amount"]
    return result

要求:

  1. 先列出测试场景清单(正常、边界、异常)
  2. 再写测试代码,使用 parametrize 减少重复
  3. 每个测试函数名能看出测试意图

## 效果示例(虚构演示)

下面是演示用的输出示例,其中的人名、数字和事项均为虚构,实际使用时请以你自己的资料为准:

> **测试场景**
> 1. 正常:多条记录、多个分组
> 2. 边界:空列表;amount 为 0;amount 为 None
> 3. 异常:amount 为负数
>
> ```python
> import pytest
> from summary import summarize
>
> def test_groups_and_sums_amount():
>     data = [{"category": "应用商店", "amount": 10}, {"category": "应用商店", "amount": 5},
>             {"category": "小程序", "amount": 3}]
>     assert summarize(data) == {"应用商店": 15, "小程序": 3}
>
> @pytest.mark.parametrize("data,expected", [
>     ([], {}),
>     ([{"category": "应用商店", "amount": 0}], {"应用商店": 0}),
>     ([{"category": "应用商店", "amount": None}], {}),
> ])
> def test_boundary_cases(data, expected):
>     assert summarize(data) == expected
>
> def test_negative_amount_raises():
>     with pytest.raises(ValueError):
>         summarize([{"category": "应用商店", "amount": -1}])
> ```

这样的输出只是起点。真正用到“完成 9 月用户留存分析报告”这类工作里之前,还需要对照原始资料逐条检查,并补上 AI 不知道的背景。

## 实用技巧与常见坑

- 先确认场景清单再生成代码,比直接要测试代码更可靠。
- 缺少某个 key 的情况(比如没有 category)要和业务方确认预期。

### 给数据分析师的特别提醒

让 AI 同时给出分析假设和验证方法,避免直接跳到结论。同时要记住:AI 不了解你们的指标口径,写出的语句和结论都要用小样本核对一遍。

## 还可以这样用

- 接口测试:根据接口文档生成请求用例和断言。
- 重构保护:重构前先让 AI 为旧代码补充特征测试。

## 相关阅读

- [数据分析师用 AI 写技术文档:从代码生成接口文档和说明](/posts/2026-10-16-data-analyst-tech-doc/)
- [数据分析师用 AI 整理会议纪要:从录音到行动项的完整流程](/posts/2026-10-16-data-analyst-meeting-minutes/)
- [大学生用 AI 生成单元测试:提示词与 pytest 示例](/posts/2026-10-16-college-student-unit-test/)
- 延伸:[编码 Agent 工作流:从需求拆解到合并请求的人机协作模式](/posts/2026-07-18-coding-agent-workflow/)
- 更多场景:[AI 使用示例合集](/categories/ai-examples/),或按标签浏览[#数据分析师](/tags/数据分析师/)、[#单元测试](/tags/单元测试/)