💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 15.5. 小结 单元测试是一个强大的概念,使用得当的话既可以减少维护成本又可以增加长期项目的灵活性。同样重要的是要意识到单元测试并不是“灵丹妙药”,也不是“银弹”。编写好的测试用例很困难,保持其更新更需要磨练 (特别是当顾客对修复严重的 Bug 大呼小叫之时)。单元测试不是其它形式测试的替代品,比如说功能性测试、集成测试以及可用性测试。但它切实可行且功效明显,一旦相识,你会反问为什么以往没有应用它。 这一章涵盖了很多内容,有很多都不是 Python 所特有的。很多语言都有单元测试框架,都要求你理解相同的基本概念: * 测试用例的设计方针是目的单一、可以自动运行、互不干扰。 * 在被测试代码编写_之前_ 编写测试用例。 * 编写测试[有效输入的测试用例](../unit_testing/testing_for_success.html "13.4. 正面测试 (Testing for success)")并检查正确的结果。 * 编写测试[无效输入的测试用例](../unit_testing/testing_for_failure.html "13.5. 负面测试 (Testing for failure)")并检查正确的失败。 * 为[描述 Bug](index.html#roman.bugs "15.1. 处理 bugs") 或[反映新需求](handling_changing_requirements.html "15.2. 应对需求变化")而编写和升级测试用例。 * 为改进性能、可伸缩性、可读性、可维护性和任何缺少的特性而无情地[重构](refactoring.html "15.3. 重构")。 另外,你应该能够自如地做到如下 Python 的特有工作: * 继承 [`unittest.TestCase`](../unit_testing/testing_for_success.html#roman.testtoromanknownvalues.example "例 13.2. testToRomanKnownValues") 生成子类并为每个单独的测试用例编写方法。 * 使用 [`assertEqual`](../unit_testing/testing_for_success.html#roman.testtoromanknownvalues.example "例 13.2. testToRomanKnownValues") 检查已知结果的返回。 * 使用 [`assertRaises`](../unit_testing/testing_for_failure.html#roman.tobadinput.example "例 13.3. 测试 toRoman 的无效输入") 检查函数是否引发已知异常。 * 在 `if __name__` 子句中调用 [`unittest.main()`](../unit_testing/stage_1.html#roman.stage1.output "例 14.2. 以 romantest1.py 测试 roman1.py 的输出") 来一次性运行所有测试用例。 * 以[详细 (verbose)](../unit_testing/stage_1.html#roman.stage1.output "例 14.2. 以 romantest1.py 测试 roman1.py 的输出") 或者[普通 (regular)](refactoring.html#roman.stage8.1.output "例 15.12. 用 romantest81.py 测试 roman81.py 的结果") 模式运行单元测试 ## 进一步阅读 * XProgramming.com 有多种语言的 [单元测试框架](http://www.xprogramming.com/software.htm) 的下载链接。