Python Behave测试失败但代码单独运行正常问题排查
错误原因分析
1. 输入的城镇名称带引号,与集合存储格式不匹配
在Behave的Feature场景中,你编写的步骤是:
When I saying new town "London"
Behave会将{name_city}解析为带双引号的字符串 "London",但你的cities集合中存储的是经过formatCityName处理后的London(无引号、首字母大写其余小写)。直接判断"London" in self.cities自然不成立,触发错误提示。
2. 未对输入的城镇名称做格式化处理
isCorrectTown方法直接使用原始输入的name_city进行判断,但cities集合里的所有城市名都是经过formatCityName处理后的结果。即使去掉引号,若输入的城市名大小写不符合(比如london或LONDON),也会匹配失败;带引号的输入更是完全无法匹配。
3. startGame方法每次调用都会重置数据
在startGame方法开头,你每次都会执行:
self.cities = set() self.cache = set()
虽然后续会重新加载城市列表,但这属于多余操作,且如果后续多次调用startGame,之前的缓存会被清空,不符合游戏连续玩法的逻辑。不过这不是本次测试失败的直接原因,但也是代码的潜在问题。
4. 单独运行时的调用方式不规范
你单独测试时使用的是:
print(Town_Game.startGame(Town_Game,"London"))
这是错误的调用方式——把类本身当作self参数传入,相当于将cities和cache变成了类属性而非实例属性。而Behave中是正确实例化对象后调用方法,两种调用方式的内部状态管理逻辑不同,导致单独运行时碰巧能工作,但测试时暴露了真实问题。
内容的提问来源于stack exchange,提问作者Zofiant
相关产品推荐
相关产品推荐

