Python unittest单元测试代码校验及运行逻辑咨询
单元测试代码审核结果
你写的测试代码不符合unittest使用规范,也没有覆盖业务函数的校验逻辑,无法完成测试目的,具体问题如下:
核心问题梳理
- 结构错误:
test_validateMachineName方法没有缩进在TestValidateF类内部,unittest 运行时不会识别为测试用例 - 变量/函数名错误:测试方法内使用了不存在的变量
machineName、不存在的函数ValideIPAdd,运行直接报错 - 断言用法错误:
assertRaises第一个参数要求是预期抛出的异常类型,第二个是待测试的函数,你直接传字符串作为参数,完全不符合语法要求 - 测试逻辑缺失:仅写死了一个合法值作为测试输入,既没有覆盖空输入、非法输入等分支场景,也没有对应业务逻辑做断言校验,完全达不到测试效果
- 冗余判断多余:业务函数本身已经做了参数校验,测试用例不需要额外判断变量类型,直接调用函数做断言即可
业务函数逻辑先明确
写测试之前首先要理清待测试函数的预期行为:
validateName预期行为:- 入参为空时返回
True - 入参非空时,要求小写字母开头,后续仅允许小写字母、数字、横杠,不符合规则返回
False,符合返回True
注意:原业务函数的正则写了两个$,属于笔误,会导致匹配错误,建议改成一个$
- 入参为空时返回
validateIp预期行为:- 入参是合法IP(IPv4/IPv6都算)时无返回,入参是非法IP时抛出
ValueError
- 入参是合法IP(IPv4/IPv6都算)时无返回,入参是非法IP时抛出
正确的测试代码示例
import unittest import re import ipaddress # 先引入你的业务函数,这里直接写出来方便运行 def validateName(machineName): if machineName: pattern = "^[a-z][a-z\d-]+$" # 修正了原正则两个$的错误 if not re.match(pattern,machineName): return False return True def validateIp(inputIp): try: ipaddress.ip_address(inputIp) except ValueError as err: raise(err) class TestValidateF(unittest.TestCase): # 测试validateName的所有场景 def test_validateName_empty_input(self): # 测试空输入场景 self.assertTrue(validateName("")) self.assertTrue(validateName(None)) def test_validateName_valid_input(self): # 测试合法名称场景 self.assertTrue(validateName("abc123")) self.assertTrue(validateName("a-b-c-123")) self.assertTrue(validateName("a12-3bc")) def test_validateName_invalid_input(self): # 测试非法名称场景 self.assertFalse(validateName("123abc")) # 数字开头 self.assertFalse(validateName("Abc123")) # 大写字母开头 self.assertFalse(validateName("abc_123")) # 包含下划线 self.assertFalse(validateName("a")) # 长度只有1,正则要求至少两个字符(开头1个+后续至少1个) # 测试validateIp的所有场景 def test_validateIp_valid_ipv4(self): # 合法IPv4无异常 validateIp("10.75.10.98") validateIp("255.255.255.255") def test_validateIp_valid_ipv6(self): # 合法IPv6无异常 validateIp("2001:db8::1") def test_validateIp_invalid_input(self): # 非法IP抛出ValueError with self.assertRaises(ValueError): validateIp("256.0.0.1") with self.assertRaises(ValueError): validateIp("10.75.10.999") with self.assertRaises(ValueError): validateIp("invalid_ip") if __name__ == "__main__": unittest.main()
单元测试通用实现要求
- 场景全覆盖:要覆盖待测试函数的所有分支,包括合法输入、非法输入、边界输入、空输入等所有可能的情况
- 单场景单测:每个测试方法只测一个场景,命名要清晰说明测试的内容,方便后续排查问题
- 正确使用断言:不要自己写if判断抛出错误,直接用unittest提供的
assertTrue、assertFalse、assertRaises等断言方法 - 测试用例独立:每个测试用例可以独立运行,不依赖其他用例的执行结果
内容的提问来源于stack exchange,提问作者mendezperer2
相关产品推荐
相关产品推荐

