Python Unittest调用函数返回重复错误数组问题求助
问题根源分析
你遇到的重复元素问题,核心原因是全局变量spalte_ideal_sammlung的生命周期与测试执行逻辑不匹配:
- 直接运行
main.py时,你会调用main()函数,该函数会将全局变量初始化为空列表,之后调用least_square_berechnung()只会追加4个元素,结果正确。 - 但单元测试中,你从未调用过
main(),全局变量没有被初始化为空列表。更关键的是,全局变量的状态会在模块运行期间持续保留——如果least_square_berechnung()被调用多次(比如模块导入时意外执行过一次,或者测试框架重复执行测试逻辑),新的元素会不断追加到同一个列表中,最终出现重复的8项结果。
另外,使用全局变量存储计算结果本身就会导致代码耦合度高、可测试性差,这是引发此类问题的根本设计缺陷。
解决方案
方案1:改用实例变量替代全局变量(推荐)
将spalte_ideal_sammlung改为LeastSquare类的实例变量,每个实例拥有独立的列表,彻底避免状态残留:
class LeastSquare(Berechnung): # Klasse LeastSquare erbt von Berechnung def __init__(self): super().__init__() self.spalte_ideal_sammlung = [] # 实例变量,每个实例独立初始化 def least_square_berechnung(self): # 每次调用方法时可选择清空列表(如果需要每次计算都是全新结果) self.spalte_ideal_sammlung = [] ls_ideal = [] trainingsdaten = ["y1", "y2", "y3", "y4"] for columns_train in training.columns[1:]: mse = 9999 for columns_ideal in ideal.columns[1:]: mse_zw = (mean_squared_error(training[columns_train], ideal[columns_ideal])) if mse_zw < mse: mse = mse_zw spalte_ideal = ideal[columns_ideal].name ls_ideal.append(mse * len(ideal)) self.spalte_ideal_sammlung.append(spalte_ideal) # 省略打印代码 return self.spalte_ideal_sammlung
修改后,单元测试每次创建LeastSquare实例时,都会得到一个全新的空列表,无论调用多少次方法,都不会出现元素累积的问题。
方案2:手动初始化全局变量(不推荐,仅临时修复)
如果必须保留全局变量,可在单元测试中手动初始化全局变量为空列表,确保每次测试的初始状态一致:
import unittest import main class MyTestCase(unittest.TestCase): def test_something(self): # 测试前手动重置全局变量 main.spalte_ideal_sammlung = [] instanz1 = main.LeastSquare() result = instanz1.least_square_berechnung() print(result) # 可添加断言验证结果长度 self.assertEqual(len(result), 4) if __name__ == '__main__': unittest.main()
或者在least_square_berechnung()方法开头主动清空全局变量:
class LeastSquare(Berechnung): def least_square_berechnung(self): global spalte_ideal_sammlung spalte_ideal_sammlung = [] # 每次调用方法时清空全局列表 ls_ideal = [] # 后续原有代码不变
额外建议
- 避免使用全局变量存储临时计算结果,改用实例变量、局部变量或返回值传递,提升代码的可维护性和可测试性。
- 在单元测试中添加断言(如验证结果长度、元素内容),而不只是打印输出,这样能自动检测结果是否符合预期。
内容的提问来源于stack exchange,提问作者Kinggpuu
相关产品推荐
相关产品推荐

