单元测试中使用全局变量:测试用例有效性存疑
这个单元测试真的有效吗?
简单说:你的这个测试几乎没有实际价值,问题就出在测试代码和被测试函数共享了同一个全局变量the_special_number。
咱们来拆解一下:你写的测试只是在验证「当输入等于全局变量the_special_number时,函数返回True」——但这本质上是在重复函数的字面逻辑,完全没测试到函数是否真的在执行你期望的判断。举个极端点的例子:如果有人不小心把全局变量the_special_number改成了8,你的测试依然会通过,但此时函数已经不再判断“是否等于7”了(这才是你原本要实现的核心逻辑)。这个测试根本没检查到函数是否坚守了“特殊值是7”这个约定,只是在循环验证变量相等而已。
那怎么改才能让测试真正有效?给你两个实用方案:
方案一:硬编码预期值,隔离全局依赖
直接在测试里使用你真正期望的特殊值(也就是7),而不是依赖全局变量。同时别忘了测试不匹配的情况,覆盖更多场景:
import unittest class TestSpecialNumber(unittest.TestCase): def test_is_special_number_true(self): self.assertTrue(is_the_special_number(7)) # 直接用目标值7 def test_is_special_number_false(self): self.assertFalse(is_the_special_number(6)) # 测试非特殊值的情况
这样不管全局变量怎么被修改,测试都能准确验证函数是否正确判断了“7”这个特定值,真正起到了单元测试的作用。
方案二:重构函数,注入依赖(更优雅的做法)
如果全局变量的设计是为了灵活配置特殊值,那不如直接把它作为函数参数(可以设默认值),让函数不再依赖全局状态:
# 重构后的函数 def is_the_special_number(number, special_num=7): return number == special_num
然后测试时就可以覆盖默认值和自定义值的场景,测试更全面:
import unittest class TestSpecialNumber(unittest.TestCase): def test_is_special_number_default_true(self): self.assertTrue(is_the_special_number(7)) def test_is_special_number_custom_true(self): self.assertTrue(is_the_special_number(9, special_num=9)) def test_is_special_number_false(self): self.assertFalse(is_the_special_number(8))
这种方式让函数的依赖更清晰,也让测试能轻松覆盖不同的使用场景。
总的来说,好的单元测试要隔离外部依赖,确保你测试的是函数的核心逻辑,而不是依赖的外部状态。你原来的测试相当于在“自我验证”,无法发现全局变量被篡改这类潜在问题,所以有效性非常低。
内容的提问来源于stack exchange,提问作者Jelle
相关产品推荐
相关产品推荐

