DeepSeek测试覆盖提示词:5种实用问法
实际观察多个开发团队后发现,使用DeepSeek生成测试用例的常见痛点集中在:边界值遗漏、异常分支被跳过、多参数组合依赖人工猜测。问题本质不在于模型能力,而在于提示词未明确锁定测试覆盖的刚性约束。关键是要引导DeepSeek生成的测试用例强制覆盖四个维度:函数签名与内部逻辑、四项必检覆盖项、含assert的可执行代码、多参数组合及异常校验的具体规则。
每次提示后输出的用例要么缺少断言语句,要么没有空值校验,参数交叉覆盖全靠臆测——根本原因不在模型,而在提示词没有把测试覆盖的刚性要求钉死。
四项必检维度必须锁定
第一步:将函数的完整签名和关键业务逻辑粘贴到提示词中,不要只写“写个测试”,否则DeepSeek会按通用模板填充,大概率忽略你代码里真实的float精度容差、None提前返回、字符串编码校验等细节。
第二步:明确列出四项强制覆盖项——正常路径、边界输入、非法类型、空/零值特例。举例:“为def parse_timestamp(s: str, tz: str = 'UTC') -> datetime生成pytest用例,必须覆盖:①标准ISO格式'2023-01-01T12:00:00Z';②毫秒级'2023-01-01T12:00:00.123Z';③空字符串和None;④时区非法如'tz=XXX';⑤超长时间戳字符串(触发ValueError)”。
第三步:强制要求输出含assert的可执行代码块,禁止“应验证”“建议检查”等伪代码表述。这一步漏掉,DeepSeek可能只返回测试思路而不生成assert行。
多参数组合覆盖提问方式
方式一:用笛卡尔积思维写约束
“对API POST /v1/orders 接口生成pytest测试,参数包括user_id(int)、items(list[dict])、discount_code(str|None),请按以下组合生成用例:user_id=0/1000/999999 → items=[]/[{'id':1,'qty':1}]/[{'id':1,'qty':0},{'id':2,'qty':-1}] → discount_code=None/'VIP2024'/'INVALID'”
方式二:用等价类划分法限定范围
“为def calculate_tax(amount: float, rate: float, region: str)设计测试,amount取[负数、0、正小数、超大浮点数],rate取[负、0、100%、>100%],region取[空、无效编码、合法三字码],每类至少1个代表值,共生成12个用例”
【注意:region取值必须包含ISO 3166-1 alpha-3标准编码,不能用'CN'或'USA'等非标缩写】
异常测试必须显式声明
第一步:明确异常类型
“为def safe_divide(a: float, b: float) -> float写测试,当b为0时必须抛出ZeroDivisionError,当a或b为None时必须抛出TypeError”
第二步:指定触发条件与断言方式
“每个异常测试用例必须使用with pytest.raises(ZeroDivisionError): …结构,且在raises块内调用目标函数,不能只写注释”
第三步:补全异常消息校验(可选但强烈推荐)
“对ZeroDivisionError用例,需在raises块中加assert 'division by zero' in str(excinfo.value)”
可复用提示词模板
基础单函数场景:
“为【函数名】生成pytest单元测试,函数签名:【完整签名】,行为说明:【1句话语义】。必须覆盖:①正常输入如【举例】;②边界值如【举例】;③非法类型如【举例】;④空/零值如【举例】。输出必须是完整可运行代码,每条测试含assert断言,禁止自然语言描述。”
接口级多参数场景:
“为【接口路径+方法】生成pytest集成测试,参数有【参数列表及类型】,请按【具体组合规则】生成用例,每个用例必须含完整请求构造+响应断言+异常路径覆盖。”
异常驱动场景:
“为【函数名】写异常测试用例,明确触发条件:【条件描述】→预期异常:【异常类名】→断言方式:【with pytest.raises写法】。生成3个最小化可复现用例,每个含完整上下文与assert。”
