别再猜测了:为什么TDD不是自虐,而是一种超能力
\n\n想象一下:你正在编写代码。一切正常。你很高兴。一个月后你回到项目,做了一个小小的改动——然后一切都崩溃了。熟悉吗?现在想象一下,你有一个安全网,可以在一秒钟内捕捉每一个错误。这就是TypeScript中的TDD——测试驱动开发。
\n\n许多开发人员认为TDD是为完美主义者或NASA项目准备的。剧透:事实并非如此。测试驱动开发是一种工具,可以节省数小时的调试时间,提高代码质量,并使重构变得安全。在本文中,我们将通过实际示例来探讨TypeScript TDD,没有废话和抽象概念。
\n\n如果你使用TypeScript编写代码,并且希望不再害怕自己的修改——请继续阅读。会很有趣的。
\n\n什么是TDD(以及为什么它不是关于“编写测试”)
\n\nTDD(测试驱动开发)是一种在编写代码之前先编写测试的方法论。听起来很疯狂?只是乍一看而已。TDD循环包括三个步骤:
\n\n- \n
- 红色(Red)——编写一个肯定会失败的测试,因为代码还不存在。 \n
- 绿色(Green)——编写最少的代码以使测试通过。 \n
- 重构(Refactor)——在不改变行为的情况下改进代码。 \n
如此循环往复。每个新功能都从测试开始。这能培养纪律性,迫使你提前考虑API设计,并让你确信一切都在按预期运行。
\n\n顺便说一句,TypeScript单元测试不仅仅是“检查函数”。它是文档、规范和保障的结合体。
\n\nTypeScript中TDD的工具:需要安装什么
\n\n对于TypeScript测试,我们需要:
\n\n- \n
- Jest——最流行的测试框架。开箱即用,支持TypeScript。 \n
- ts-jest——Jest的预设,使其无需额外配置即可理解TypeScript。 \n
- @types/jest——用于IDE中自动补全的类型。 \n
一键安装:
\n\nnpm install --save-dev jest ts-jest @types/jest typescript\n\n在package.json中添加运行测试的脚本:
"scripts": {\n "test": "jest",\n "test:watch": "jest --watch"\n}\n\n现在一切准备就绪,可以进行TypeScript测试驱动开发了。
\n\n编写第一个TDD测试:从红色到绿色
\n\n假设我们需要编写一个函数来检查字符串是否为回文。按照TDD的经典做法,我们从测试开始。
\n\n步骤1. 红色(Red)
\n\n创建文件isPalindrome.test.ts:
import { isPalindrome } from './isPalindrome';\n\ndescribe('isPalindrome', () => {\n it('应该为字符串"racecar"返回true', () => {\n expect(isPalindrome('racecar')).toBe(true);\n });\n\n it('应该为字符串"hello"返回false', () => {\n expect(isPalindrome('hello')).toBe(false);\n });\n});\n\n运行测试:
\n\nnpm test\n\n我们看到错误:Cannot find module './isPalindrome'。很好,红色阶段已完成。现在我们需要编写代码以使测试通过。
步骤2. 绿色(Green)
\n\n创建isPalindrome.ts并实现最小功能:
export function isPalindrome(str: string): boolean {\n return str === str.split('').reverse().join('');\n}\n\n再次运行测试——绿色!两个测试都通过了。但这还不是全部。
\n\n步骤3. 重构(Refactor)
\n\n我们的函数可以工作,但有一个问题:它不处理包含空格和不同大小写的字符串。添加一个新测试:
\n\nit('应该忽略大小写和空格',