第五章 自动化 测试
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
质量不是一次性的行为,而是长期的习惯。
——哲学家威尔·杜兰特,援引亚里士多德
新年伊始,许多人立志追求更健康的生活方式并坚持下去 。这些目标并非靠一顿健康餐或一次健身就能达成,而是需要在多数时候持续做出健康选择。同样地,要打造高质量且可维护的软件,需要在编写、审查和测试代码时始终践行良好习惯。如同保持健康生活方式,这并非易事,而借口只会让你停滞不前。
然而通往持续性的道路并非坦途。许多开发者常陷入自我怀疑:担忧决策是否正确,忧虑解决问题的思路是否会被质疑。编写高质量软件需要持之以恒的训练,但随着时间推移,你的测试工作将成为有效的保障机制,让团队成员和未来的自己都受益。本章将带你了解自动化测试的优势、常见测试类型及其编写方法。
自动化测试的益处
对于编写额外代码来验证现有代码,人们自然会持怀疑态度,有时甚至觉得不值得付出努力。你可能会怀疑这是否只是又一种潮流或简历堆砌的练习。然而,自动化测试远不止于此。它是一项宝贵的技能,也是对代码库的重要投资。
在后续章节中,你将深入了解编写自动化测试的具体益处。你将看到这项实践如何提升代码质量、增强工作信心,并最终使你成为更高效的工程师。理解这些优势后,你将明确测试工作的核心目标,并认识到投入时间进行自动化测试对职业成长的价值所在。
作为文档
加入现有项目可能令人不知所措(参见第6章关于加入现有项目的操作指南)。 项目拥有文档实属奢侈。1若运气好,你或许能在开始工作前与首席开发者或领域专家沟通,获取高层次的项目概览。但这种情况并不常见,文档可能稀疏甚至缺失。此时,拥有完善测试的项目将成为你的救星。
设想这样一个场景:你被指派修复某类银行卡的支付处理问题。若缺乏规范文档或测试,你只能翻阅陌生(且可能复杂)的代码,或依赖同事指导。
现在想象发现了一套完善的支付测试套件。你会看到PaymentProcesserTests 类中带有描述性测试名称的代码:
shouldValidateValidCreditCardNumbershouldProcessCreditCardTransactionshouldProcessOrangePay
这些测试既揭示了模块功能,又指向相关代码段。现代集成开发环境能轻松导航至被测服务(参见第2章高效读码策略)。测试失败时,代码库中的潜在问题源便一目了然。
例如发现名为shouldFailWhenCreditCardTypeIsOrangePay 的测试,揭示Orange Pay未被支持。此信息助你快速定位并修复问题,更新前端代码并完善文档。
此例说明测试如何充当文档,助你更快掌握代码库。通过专注于改进测试套件,可提升代码质量、减少生产环境问题,并加速你对项目的贡献能力。
提升可维护性
编写优质的 可维护代码通常需要数年才能掌握(详见第3章)。先写测试如同先思考再发言:它能帮助你规划和梳理思路。初学者的首要目标往往只是让代码运行起来。虽然这依然重要,但编写测试能让你更早发现可改进之处。
请看这个BlogPostController 示例(为简洁起见省略了代码):
public class BlogPostController { public void publish(Post post) { // save blog post to the database (flip isPublished to true) // log blog ...