使用pytest导入类失败,PyCharm中导入项呈灰色
pytest导入类失败+PyCharm导入内容灰色问题解决
问题情况
尝试导入类用pytest开展测试一直失败,PyCharm中导入的内容呈灰色状态,不清楚原因。
测试代码
from classes import * class Test: def setup_method(self): self.tv1 = power(True) def teardown_method(self): del self.tv1 def test_power(self): assert power(True) is True assert power(False) is False
PyCharm灰色显示截图

类文件(classes.py)部分代码
class Television: """ 为遥控器对象构建功能的类 各函数使用的全局变量 :param MIN_CHANNEL: 频道不能低于此值 :param MAX_CHANNEL: 频道不能高于此值 :param MIN_VOLUME: 音量不能低于此值 :param MAX_VOLUME: 音量不能高于此值 """ MIN_CHANNEL = 0 MAX_CHANNEL = 3 MIN_VOLUME = 0 MAX_VOLUME = 2 def __init__(self) -> None: """ 构造函数,初始化电视对象的初始状态 :param channel: 存储频道号的变量 :param volume: 存储音量等级的变量 :param status: 存储电视开关状态的变量 """ self.__channel = Television.MIN_CHANNEL # 创建私有变量存储电视频道,默认设为最小频道 self.__volume = Television.MIN_VOLUME # 创建私有变量存储电视音量,默认设为最小音量 self.__status = False # 创建私有变量存储电视状态,电视初始为关闭状态 def power(self) -> None: """ 切换电视开关状态的方法 :return: 电视的开关状态 """ if self.__status == False: # 此方法用于切换电视开关 self.__status = True # 如果电视当前是关闭状态,调用后打开 else: self.__status = False # 如果电视当前是打开状态,调用后关闭
问题原因和修复方案
1. PyCharm导入内容灰色的原因
你用from classes import *导入了Television类,但测试代码里根本没用到这个类,PyCharm会把未使用的导入标记为灰色,提示这部分代码没起作用。
2. 测试代码的核心错误
- 错误1:直接调用实例方法
power()power是Television类的实例方法,必须先创建Television的实例,才能调用这个方法,不能直接像普通函数那样调用power(True)。 - 错误2:
power方法无返回值
类里的power方法返回类型是-> None,它只是切换私有变量__status的值,不会返回布尔值,所以assert power(True) is True完全不成立。 - 错误3:
setup_method里的实例化错误self.tv1 = power(True)是错误写法,应该先实例化Television对象,再调用它的power方法。
3. 修正后的测试代码
from classes import Television class TestTelevision: def setup_method(self): self.tv = Television() # 正确实例化Television对象 def test_power_toggle(self): # 初始状态是关闭 assert not self.tv._Television__status # 调用power方法打开电视 self.tv.power() assert self.tv._Television__status is True # 再次调用power方法关闭电视 self.tv.power() assert self.tv._Television__status is False
额外建议
- 避免用
from classes import *这种模糊导入,明确导入需要的类(比如from classes import Television),代码更清晰,也能避免命名冲突。 - 给
Television类添加公共的状态获取方法,更符合封装原则:
测试时就可以用def get_status(self) -> bool: return self.__statusself.tv.get_status()获取状态,不用依赖私有变量的名称修饰。
内容的提问来源于stack exchange,提问作者DoomDragoon
相关产品推荐
相关产品推荐

