TestCase类需继承unittest.TestCase且不重写__init__,测试方法必须以test_开头;浮点数比较用assertAlmostEqual;验证异常用with self.assertRaises();测试未运行常因方法名、类继承或运行命令不符规范。

TestCase类怎么写才不会报错TypeError: __init__() missing 1 required positional argument: 'methodName'
直接继承unittest.TestCase后,别手动调用__init__;unittest自己负责实例化,你只管写测试方法。常见错误是仿照普通类写法,在子类里加了def __init__(self, ...),或者试图用MyTest()直接实例化——这会触发那个methodName缺失错误。
正确做法就两条:
- 测试类名以
Test开头(非强制但约定,否则可能被自动发现机制忽略) - 每个测试方法必须以
test_开头,且不带参数(除了self)
示例:
import unittest
class TestCalc(unittest.TestCase):
def test_add(self):
self.assertEqual(1 + 1, 2)
assertEqual对比浮点数总失败,该怎么比
assertEqual做的是精确相等判断,而浮点运算存在精度误差,比如0.1 + 0.2 == 0.3在Python里是False。硬用assertEqual会误报失败。
该用assertAlmostEqual替代,它默认允许7位小数差异:
立即学习“Python免费学习笔记(深入)”;
-
self.assertAlmostEqual(0.1 + 0.2, 0.3)✅ 通过 - 需要更宽松时,加
places=2(保留2位小数比较)或delta=0.001(绝对误差阈值) - 注意:
assertAlmostEqual(a, b)等价于assertEqual(round(a-b, places), 0),不是“四舍五入后相等”,而是按指定精度做减法再判零
测试方法里抛异常后,assertEqual不执行,怎么验证“应该出错”
想测某段代码“必须抛出ValueError”,不能靠assertEqual——因为异常一抛出,后续语句就不跑了。得用assertRaises上下文管理器。
写法有两种,推荐用上下文方式,清晰且能捕获异常实例:
with self.assertRaises(ValueError): int("abc")- 如果还要检查异常信息,可以绑定变量:
with self.assertRaises(ValueError) as e: int("abc"); self.assertIn("invalid", str(e.exception)) - 别用
self.assertRaises(ValueError, int, "abc")这种老式写法——参数多时易错,且无法进一步断言异常内容
运行测试时没报错但显示0 tests ran,哪里漏了
最常见原因是:测试方法名没以test_开头,或者类没继承unittest.TestCase,或者文件没用python -m unittest xxx.py方式运行(直接python xxx.py不会触发自动发现)。
检查三处:
- 方法名是否为
def test_something(self):,而不是def check_something(self):或def TestSomething(self): - 确认类定义写了
class TestXxx(unittest.TestCase):,不是class TestXxx: - 运行命令必须是
python -m unittest test_module或python -m unittest test_module.TestClass.test_method;直接执行脚本不会跑测试
复杂点在于:unittest对命名和导入路径极其敏感,少一个下划线、多一个空格、模块名拼错,都会静默跳过——它不报错,只当没看见。










