Python Unittest中全局函数无法被识别的问题解决方法
解决unittest中全局函数无法识别的问题
问题原因
你遇到的NameError是因为Python的名称修饰(Name Mangling)机制:当在类的方法内调用以双下划线开头的名称时,Python会自动将其重命名为_类名__名称的格式。你的函数名___log_test_values以三个下划线开头,前两个下划线触发了这个机制,导致解释器尝试寻找_TranslateTestCase___log_test_values,而非你定义的全局函数。
解决方法
方法1:修改函数名(推荐)
直接把函数名改成不以双下划线开头的形式,避免触发名称修饰。类方法里不需要global声明,全局函数可以直接调用:
import unittest import pickle def log_test_values(values): with open('/tmp/test_values.bin', 'wb') as f: f.write(pickle.dumps(values)) class TranslateTestCase(unittest.TestCase): def test_word_starting_with_vowel(self): return_value = 'apple' log_test_values(return_value) if __name__ == "__main__": unittest.main()
方法2:通过模块名调用全局函数(仅保留原名时使用)
如果一定要保留原函数名,可以通过当前模块直接引用它,绕开名称修饰:
import unittest import pickle import __main__ def ___log_test_values(values): with open('/tmp/test_values.bin', 'wb') as f: f.write(pickle.dumps(values)) class TranslateTestCase(unittest.TestCase): def test_word_starting_with_vowel(self): return_value = 'apple' __main__.___log_test_values(return_value) if __name__ == "__main__": unittest.main()
额外提示
unittest框架本身不会处理测试函数的返回值,你通过自定义函数记录返回值到磁盘的方式是可行的。如果后续需要批量处理测试数据,也可以考虑将日志函数封装成独立模块,方便多个测试用例调用。
内容的提问来源于stack exchange,提问作者Saurabh Misra
相关产品推荐
相关产品推荐

