2025年08月05日/ 浏览 9
在软件开发中,单元测试就像建筑的质检报告——没有它,你永远不知道代码大厦何时会坍塌。作为Python开发者,unittest框架是我们手中的精密检测仪器,下面让我们揭开它的专业使用手册。
setUp()
和tearDown()
就是你的清洁工具:python
import unittest
class ChemistryTest(unittest.TestCase):
def setUp(self):
self.beaker = []
print(“准备实验器材”)
def tearDown(self):
del self.beaker
print("清理实验台")
test_
开头:python
def test_acid_reaction(self):
self.beaker.append('HCl')
self.assertEqual(len(self.beaker), 1, "烧杯内容物数量异常")
断言方法(Assertion)
unittest提供超过20种断言方法,就像医生的诊断工具包:
assertEqual(a, b)
相当于听诊器assertTrue(x)
如同血压计assertRaises(Error)
好比过敏测试测试套件(Test Suite)
当需要批量执行测试时,可以像整理病历档案一样组织测试:
python
def suite():
suite = unittest.TestSuite()
suite.addTest(ChemistryTest('test_acid_reaction'))
suite.addTest([OtherTestClass.method1, OtherTestClass.method2])
return suite
python
@unittest.skip("等待实验室采购新试剂")
def test_expensive_reagent(self):
pass
python
def test_ph_values(self):
for ph, expected in [(1, '酸性'), (7, '中性'), (14, '碱性')]:
with self.subTest(ph=ph):
result = check_ph_level(ph)
self.assertEqual(result, expected)
python
class DatabaseTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.conn = createtestconnection()
def setUp(self):
self.conn.begin_transaction()
def tearDown(self):
self.conn.rollback()
边界值分析法
针对数值处理函数,至少要测试:
异常流测试
好的测试不仅要验证正确路径,还要故意”找茬”:
Mock技术的正确打开方式
当测试依赖外部服务时,使用unittest.mock模块:
python
from unittest.mock import patch
def testweatherapi(self):
with patch(‘requests.get’) as mockget:
mockget.returnvalue.statuscode = 200
result = get_weather(‘Beijing’)
self.assertIn(‘temperature’, result)
让我们用测试驱动开发实现一个温度转换器:
python
class TemperatureTest(unittest.TestCase):
def testcelsiustofahrenheit(self):
self.assertEqual(ctof(0), 32)
self.assertEqual(cto_f(100), 212)
def ctof(celsius):
return celsius * 9/5 + 32
def testfahrenheittocelsius(self):
self.assertAlmostEqual(ftoc(32), 0)
self.assertAlmostEqual(fto_c(212), 100)
def ftoc(fahrenheit):
return (fahrenheit – 32) * 5/9
测试顺序不可控
解决方法:使用TestLoader.sortTestMethodsUsing = lambda _, x, y: x < y
测试依赖外部环境
建议:在setUp中验证环境可用性,不可用则跳过所有测试
测试运行太慢
优化方案:
@unittest.skipIf
跳过非必要测试单元测试不是开发的负担,而是提升代码质量的杠杆。当你的测试覆盖率从30%提升到80%时,深夜被报警电话叫醒的次数会呈指数级下降。记住:好的测试就像保险单——现在支付小额保费,避免未来巨额赔偿。