You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks中运行Unittest测试代码出现AttributeError报错求助

解决Databricks中PySpark Unittest运行报错问题

问题场景

在Databricks环境中运行以下PySpark Unittest代码时,出现了AttributeError: 'DummyMod' object has no attribute 'xxx'和SystemExit: True的报错:

原测试代码

import unittest
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, when

# Create the DataFrame
spark_df = spark.sql('select * from dna_scr_l3.vw_dna_cdm_md_bom')

class MdbomTest(unittest.TestCase):

    def test_blank_spaces_count(self):
        # Apply the blank spaces count operation and retrieve the result
        blank_spaces_count_df = spark_df.select([
            count(when((col(c).substr(1, 1) == ' ') & (col(c).substr(-1, 1) == ' '), c)).alias(c)
            for c in spark_df.columns
        ])
        
        # Perform assertions
        for column in blank_spaces_count_df.columns:
            self.assertEqual(blank_spaces_count_df.collect()[0][column], 0)

    def test_null_persentage_in_col(self):
        col_null_cnt_df = spark_df.select([count(when(col(c).isNull(), c)).alias(c) for c in spark_df.columns])
        
        # Perform assertions
        for column in col_null_cnt_df.columns:
            self.assertEqual(col_null_cnt_df.collect()[0][column], 0)

if __name__ == "__main__":
    unittest.main()

报错信息

ERROR: /databricks/kernel-connections/76ddb9359db2cb425c430527d257d2fe22bc38113daa396b5589d6712ace288c (unittest.loader._FailedTest)
AttributeError: 'DummyMod' object has no attribute '/databricks/kernel-connections/76ddb9359db2cb425c430527d257d2fe22bc38113daa396b5589d6712ace288c'

运行1个测试,耗时0.005秒
失败(错误数=1)
/databricks/python/lib/python3.9/site-packages/IPython/core/interactiveshell.py:3386: UserWarning: 退出请使用'exit'、'quit'或Ctrl-D。
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
SystemExit: True
已发生异常,使用%tb查看完整回溯信息。
SystemExit: True

解决方案

1. 移全局DataFrame初始化到测试类内部

全局作用域中直接执行spark.sql会导致Databricks模块加载时出现异常,需将DataFrame初始化逻辑放到测试类的setUpClass(类级初始化,仅执行一次)或setUp(方法级初始化,每次测试执行)中。

2. 修改unittest启动方式

在Databricks交互式环境中,unittest.main()会触发退出解释器的操作,需改用TestLoader加载测试用例并运行,或添加exit=False参数避免SystemExit。

3. 优化数据读取逻辑(可选)

用first()替代collect()[0],减少驱动端数据传输,提升效率。

修改后的完整代码

import unittest
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, when

class MdbomTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # 仅在测试类初始化时加载一次DataFrame
        cls.spark_df = spark.sql('select * from dna_scr_l3.vw_dna_cdm_md_bom')

    def test_blank_spaces_count(self):
        blank_spaces_count_df = self.spark_df.select([
            count(when((col(c).substr(1, 1) == ' ') & (col(c).substr(-1, 1) == ' '), c)).alias(c)
            for c in self.spark_df.columns
        ])
        
        result = blank_spaces_count_df.first()
        for column in blank_spaces_count_df.columns:
            self.assertEqual(result[column], 0)

    def test_null_persentage_in_col(self):
        col_null_cnt_df = self.spark_df.select([count(when(col(c).isNull(), c)).alias(c) for c in self.spark_df.columns])
        
        result = col_null_cnt_df.first()
        for column in col_null_cnt_df.columns:
            self.assertEqual(result[column], 0)

if __name__ == "__main__":
    # 方案1:使用TestLoader和TextTestRunner运行
    runner = unittest.TextTestRunner(verbosity=2)
    test_suite = unittest.TestLoader().loadTestsFromTestCase(MdbomTest)
    runner.run(test_suite)
    
    # 方案2:使用unittest.main并禁用退出
    # unittest.main(argv=['ignore-argv'], exit=False)

内容的提问来源于stack exchange,提问作者Dhiraj Sandse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:17:05