先说明什么算正确

测试输入需要覆盖正常路径、边界和失败条件。单元测试检查局部规则,集成测试检查组件之间的真实契约,端到端测试检查用户流程。把实现中的每个常量再抄进测试,不能有效证明行为正确。

import unittest

def parse_port(text):
    port = int(text)
    if not 1 <= port <= 65535:
        raise ValueError("port out of range")
    return port

class PortTests(unittest.TestCase):
    def test_boundaries(self):
        self.assertEqual(parse_port("1"), 1)
        self.assertEqual(parse_port("65535"), 65535)
        for text in ("0", "65536", "abc"):
            with self.assertRaises(ValueError):
                parse_port(text)

if __name__ == "__main__":
    unittest.main()

这个测试保护允许范围与错误行为,函数内部如何拆分并不重要。真实表单还需要明确是否接受空白、正号或前导零,再按需求补测试。

把故障缩小到可解释的范围

先记录环境、步骤、输入、预期和实际结果。通过减少输入和依赖寻找最小复现,一次只改变一个有意义的条件。日志记录请求身份、阶段和结果,避免输出密码或完整用户数据。调试器帮助观察状态与调用栈,不能替代对正确条件的说明。

性能测试也有实验条件

区分启动、预热和稳定运行;记录输入规模、硬件、工具版本、重复次数与误差。比较相同工作负载,不把空闲帧率、单次耗时或不同机器上的数字拼成结论。优化之后还要检查结果是否正确。

练习与面试自查

为一个二分查找补充空数组、单元素、重复值和不存在目标的测试。再故意引入边界错误,确认测试确实失败。解释单元测试通过为什么仍可能出现接口契约、权限或真实设备问题。

参考资料