- 模块级测试代码组织
- 在Python中,
__name__
变量在模块被直接运行时等于'__main__'
,而当模块被导入时,__name__
等于模块的名称。利用这一特性,我们可以在每个模块中编写独立的测试代码,并通过__name__
判断是否直接运行该模块的测试。
- 例如,在一个名为
module1.py
的模块中:
def add(a, b):
return a + b
if __name__ == '__main__':
import unittest
class TestAdd(unittest.TestCase):
def test_add(self):
result = add(2, 3)
self.assertEqual(result, 5)
if __name__ == '__main__':
unittest.main()
- 这样,当直接运行
module1.py
时,if __name__ == '__main__':
块内的测试代码会被执行,而当该模块被其他模块导入时,测试代码不会执行,从而避免对主程序逻辑造成干扰。
- 隔离测试执行
- 由于每个模块都可以通过
__name__
来判断是否直接运行,所以每个模块的测试都是相对隔离的。在大型项目中,即使模块之间存在复杂的依赖关系,每个模块的测试都可以独立启动。
- 例如,
module2.py
依赖module1.py
中的add
函数:
from module1 import add
def multiply_result(a, b):
return add(a, b) * 2
if __name__ == '__main__':
import unittest
class TestMultiplyResult(unittest.TestCase):
def test_multiply_result(self):
result = multiply_result(2, 3)
self.assertEqual(result, 10)
if __name__ == '__main__':
unittest.main()
module2.py
的测试只关注自身的功能以及对module1.py
中依赖函数的正确使用,而module1.py
的测试也只关注自身的add
函数。它们之间的测试相互隔离,各自独立运行。
- 结合
unittest
框架管理测试
unittest
框架可以与__name__
很好地配合。在项目的顶层,可以编写一个总的测试脚本,通过导入各个模块来运行所有模块的测试。
- 例如,
run_all_tests.py
:
import unittest
import module1
import module2
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(module1.TestAdd))
suite.addTest(unittest.makeSuite(module2.TestMultiplyResult))
runner = unittest.TextTestRunner()
runner.run(suite)
- 这里通过
__name__
判断确保只有在直接运行run_all_tests.py
时才执行所有模块的测试集合,而且每个模块的测试代码通过__name__
在各自模块内正确隔离,不会在模块被导入时意外执行,保证了测试代码与主程序逻辑的清晰分离。