Python校验CSV与Oracle数据时跨文件调用异常、退出码0问题求助
代码错误排查结果
核心根本原因(为什么程序跑完退出码0但没执行测试)
- 测试运行器
test_runner_lps中从未主动调用定义好的测试执行函数:
代码里虽然写了test_tc_verify_filecount_tablecount_validation_1这个测试逻辑函数,但整个文件执行流程是:导入模块 → 实例化TestCases对象 → 空的main函数直接走完 → 程序退出。没有任何一行代码触发那个测试函数执行,自然不会有实际的测试逻辑跑起来。 - 测试运行器的
main函数是空实现,没有把测试函数纳入执行流程。
其他代码细节错误
test_cases_lps中DataFrame属性拼写错误:
代码写的是print(df_dept.dttypes),pandas DataFrame的列类型属性是dtypes,少写了字母y,执行到这行就会抛错,而且这个错被方法内部的try-except捕获,只会打印异常信息,不会中断测试流程上报。pd.read_sql的Oracle连接参数写法不符合规范:
原代码直接把元组('scott/tiger@localhost')传给con参数是无效的,需要先通过cx_Oracle建立独立的连接对象,再传入pandas,否则连接环节直接报错。- 测试用例方法内部的try-except吞掉了所有异常:
原方法把CSV读取、SQL查询、断言的所有异常都捕获后仅打印,不向上层抛出,就算后续测试函数被调用,只要不抛出异常,runner层永远会判定测试执行成功,根本感知不到用例内部的逻辑错误。 test_runner_lps中@classmethod装饰器误用:
给普通函数加@classmethod装饰器,但函数既没有定义类属性传递的cls参数,也没有实际调用类方法的逻辑,装饰器无实际作用,反而容易引发隐式错误。- 包导入路径依赖隐式项目结构:
直接写import lps.testcase.test_cases_lps要求对应目录必须是符合Python包规范的结构(每个层级要有__init__.py,且运行时工作目录在项目根路径),否则导入会直接失败。
修正后的可正常执行的代码
修正版 test_cases_lps
import cx_Oracle import pandas as pd class TestCases: def tc_verify_filecount_tablecount_validation_1(self): # 修正属性拼写错误 df_dept = pd.read_csv('E:/Python/practice/lps/data/deptv.csv') print(df_dept) print(df_dept.columns) print(df_dept.dtypes) sql = '''select * from deptv''' print(sql) # 修正Oracle连接写法,先建立独立连接对象 conn = cx_Oracle.connect(user='scott', password='tiger', dsn='localhost:1521/orcl') df_table = pd.read_sql(sql, con=conn) print(df_table) conn.close() # 移除吞异常的逻辑,断言失败时直接抛出错误供上层捕获 assert len(df_dept.index) == len(df_table.index), f"行数不匹配:CSV为{len(df_dept)}行,Oracle表为{len(df_table)}行" def main(): pass if __name__ == '__main__': main()
修正版 test_runner_lps
import sys from lps.testcase.test_cases_lps import TestCases # 移除误用的@classmethod装饰器,定义普通测试执行函数 def test_tc_verify_filecount_tablecount_validation_1(): tc = TestCases() try: tc.tc_verify_filecount_tablecount_validation_1() print("pass") print("abc", '1', '1', True) except Exception as err: print('Test case failed', err) def main(): # 核心修正:在主流程中主动调用测试函数 test_tc_verify_filecount_tablecount_validation_1() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者user6922142
相关产品推荐
相关产品推荐

