最近把项目里的代码补丁任务交给Qwen2.5-Coder-14B,发现它特别喜欢给函数生成冗长的mock对象,尤其是涉及数据库操作时,明明可以直接用内存sqlite,它非要mock一个假的repository层。跑测试的时候,覆盖率倒是上去了,但实际逻辑很多没测到。我试过在prompt里强调“少用mock、多写集成测试”,效果还是不稳定。想问下各位,是我系统提示词写得太笼统,还是这个模型本身对测试风格的理解就偏向保守?另外,有没有人对比过它和DeepSeek-Coder在这类任务上的差异?我用的vLLM部署,温度0.2,max_tokens设的2048。
用Qwen2.5-Coder写单元测试总生成一堆无用mock,是我姿势不对吗?
全部回复
共 48 条试试把“少用mock”改成“禁止mock数据库层,必须用内存sqlite”,指令具体点效果会好不少。
说实话我觉得跟模型关系不大,主要是prompt里对“数据库操作”的边界定义没给清楚,我后来直接甩给它一段“用sqlite内存模式重写repo接口”的示例代码,效果立刻就不一样了。另外温度0.2对代码生成来说有点偏保守,我试过拉到0.6反而能跳出那种模板化的mock套路。DeepSeek-Coder我也跑过类似任务,它更倾向于直接生成可执行的测试函数,但偶尔会漏掉异常分支,两者各有各的坑吧。
我这边用Qwen2.5-Coder也遇到过类似情况,感觉它默认把“测试”理解成了隔离优先,尤其涉及IO就条件反射式地mock。后来在系统提示里直接塞了个内存sqlite的示例,并明确说“除非外部HTTP,否则别mock”,才稳定不少。DeepSeek-Coder相对更愿意写真实调用,但有时又太放飞,边界case容易漏。你温度0.2已经挺低了,可能问题更多在提示词的结构而不是模型本身。
我也遇到过类似情况,Qwen2.5-Coder确实倾向于mock掉外部依赖,感觉它训练数据里单元测试的范式偏保守。你可以试试在prompt里直接给一两个few-shot示例,展示用sqlite内存库测repository的写法,比单纯说“少用mock”管用得多。另外温度0.2可能太低了,稍微调到0.4左右让它有点发挥空间,配合max_tokens给足,生成的测试会灵活一些。DeepSeek-Coder我也用过,它在集成测试风格上确实更放得开,但逻辑覆盖的严谨度感觉稍弱一点,各有取舍吧。
这个现象我也遇到过,Qwen2.5-Coder在测试生成上确实有点“mock上瘾”,特别是你提到数据库那块,它默认就会往repository层去套。我后来发现一个比较管用的办法是在系统提示里直接给它一个具体的测试范例,比如“所有涉及sqlite的测试都用:memory:,禁止mock任何数据访问层”,比单纯说“少用mock”要有效得多。温度0.2其实已经挺保守了,但问题可能不在随机性上,而是模型对“测试意图”的理解有偏差,它更倾向于生成看起来完整、结构工整的测试代码,而不是真正去覆盖业务逻辑。我对比过DeepSeek-Coder,它在集成测试风格上确实稍微好一点,但也不是完全没这个问题,只是mock比例低一些。max_tokens设2048可能也偏大了,模型有足够空间去铺陈那些冗余的mock结构,试试压到1024甚至768,逼它写紧凑一点。另外你可以在prompt里加一句“如果测试代码超过30行就说明写错了”,这种约束有时候比正面指令更管用。
我拿Qwen2.5-Coder-7B也遇到过类似情况,感觉这模型对“测试”的理解就是先把依赖隔离开,至于测没测到真逻辑它不太管。后来我在prompt里直接给了两个示例,一个用sqlite内存库、一个明确禁止mock某个类,稳定性好了不少。温度0.2其实影响不大,关键还是few-shot约束。DeepSeek-Coder我试得少,但印象里它更倾向写短小的直接断言,mock确实少一些。
温度调到0.2确实容易让它保守,试试0.7加few-shot示例,直接给它看内存sqlite的测试写法。
这问题挺典型的,Qwen2.5-Coder在测试生成上确实有点“防御性编程”的倾向,感觉它训练数据里mock-heavy的测试代码占比不低。我拿它和DeepSeek-Coder对比过,后者在同样提示下更愿意写真实调用,但代价是偶尔会生成跑不通的测试,得手动修。你温度0.2其实已经挺保守了,可以试试调到0.5左右,让它别那么死板地套模板。另外系统提示词可以更具体点,比如直接写“涉及数据库时优先用sqlite内存库,禁止mock Repository”,光说“少用mock”太虚了,模型抓不住边界。还有个歪招是在prompt里塞一两个你满意的测试样例当few-shot,效果比纯文字指令稳不少。max_tokens 2048有时候会截断复杂测试的生成,导致它草草收尾用mock凑数,可以适当放宽到4096试试。