Python新手求助:使用Pytest测试Roll子类实例类型
关于你的Rock-Paper-Scissors测试代码的分析与优化建议
嘿,你的测试代码本身是完全正确的——它精准地验证了build_the_three_rolls()的核心行为:返回长度为3的列表,且每个位置的元素分别是Rock、Paper、Scissors的实例。不过这里有几个小细节可以优化,让测试更高效、更健壮:
避免重复调用目标函数:你现在每次断言都重新调用一次
build_the_three_rolls(),如果这个函数后续引入了副作用(比如依赖外部状态、生成带随机属性的实例),测试可能会出现不可预期的问题,而且重复执行也没必要。建议把结果先存到变量里:def test_building_rolls(): rolls = build_the_three_rolls() assert len(rolls) == 3 assert isinstance(rolls[0], Rock) assert isinstance(rolls[1], Paper) assert isinstance(rolls[2], Scissors)验证继承关系(可选但推荐):既然这三个类都继承自
Roll,可以额外加断言确认这一点,确保类的继承结构符合预期:# 逐个验证 assert isinstance(rolls[0], Roll) assert isinstance(rolls[1], Roll) assert isinstance(rolls[2], Roll) # 或者用循环更简洁 for roll in rolls: assert isinstance(roll, Roll)顺序无关的测试(按需选择):如果未来你的函数可能允许返回顺序不固定的三个实例(比如随机排序),但只要包含这三个类的实例即可,那可以改成验证集合类型的匹配:
roll_classes = {type(roll) for roll in rolls} assert roll_classes == {Rock, Paper, Scissors}当然,如果函数的设计要求必须严格按
Rock→Paper→Scissors的顺序返回,那保留原来的顺序断言就完全没问题。
总的来说,你的初始测试已经很好地覆盖了核心需求,上面的优化只是让测试更灵活、高效的小技巧~
内容的提问来源于stack exchange,提问作者noloman
相关产品推荐
相关产品推荐

