Pydroid3运行Python unittest报AttributeError测试失败如何解决
Pydroid3 环境下 unittest 运行报错解决方案
问题场景
在安卓端Pydroid3内置Python3.9的IPython交互层运行单元测试代码时,测试执行失败,抛出属性错误与系统退出相关警告,需调整配置让单元测试正常通过。
涉及代码
name_function.py 模块代码
def get_formatted_name(first,last): """Generate a neatly formatted full name""" full_name=f"{first} {last}" return full_name.title()
testing_name_function.py 测试代码
import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase): def test_first_last_name(self): formatted_name=get_formatted_name('tulasi','reddy') self.assertEqual(formatted_name,'Tulasi Reddy') if __name__=='__main__': unittest.main()
运行报错输出
E ERROR: /data/data/ru (unittest.loader._FailedTest) AttributeError: module '__main__' has no attribute '/data/data/ru' Ran 1 test in 0.007s FAILED (errors=1) An exception has occurred, use %tb to see the full traceback. SystemExit: True
报错根因
姓名格式化函数本身逻辑无错误,不需要修改业务代码,报错来自运行环境和unittest默认参数的适配冲突:
- IPython交互环境运行脚本时,会传入脚本所在路径作为启动参数,
unittest.main()默认会读取命令行传入的参数作为待查找的测试用例名,误把截断的路径/data/data/ru当成测试用例去__main__模块查找,找不到对应属性就会抛出错误。 - unittest默认运行结束后会调用
sys.exit()退出进程,在IPython交互层会触发系统退出警告。
修复方案
两种方案二选一即可:
- 修改测试脚本的入口调用代码,手动指定unittest运行参数,禁止读取外部命令行参数、禁止运行结束后退出进程,将原入口行替换为以下代码:
if __name__=='__main__': unittest.main(argv=[''], exit=False)
参数说明:argv=['']手动传入空的参数列表,跳过对环境传入路径的解析;exit=False关闭测试结束后的自动退出逻辑,避免触发IPython的系统退出警告。如果需要查看更详细的测试输出,可以把参数改成argv=['', '-v']开启详细输出模式。
- 不修改代码,切换到Pydroid3内置的终端(Terminal)界面,进入脚本所在目录后,直接执行命令
python testing_name_function.py运行脚本。非交互的终端运行模式下不存在参数解析冲突,原代码可以直接运行通过。
正常运行预期
修复后运行测试,将输出以下结果,代表测试通过:
. ---------------------------------------------------------------------- Ran 1 test in 0.001s OK
内容的提问来源于stack exchange,提问作者user16983630
相关产品推荐
相关产品推荐

