你可能听说过ESLint、Prettier和TypeScript。这些都是静态代码分析工具,在 JavaScript 生态系统中非常流行。我认为它们都是测试工具。让我们来看看每一个。
ESLint
ESLint是用于JavaScript的可插拔式提示工具。提示是在不实际运行代码的情况下分析代码的潜在错误的过程。 考虑一下这段代码:
if (!'serviceWorker' in navigator) {
// the user's using an old browser :-(
}
你发现问题了吗?如果你发现了,那很好!但你不觉得这是个错误吗?但是,你不觉得不用动脑筋去发现和纠正像这样的细微错误会很酷吗?我认为!请让计算机尽可能多地为我做工作,谢谢你。这就是ESLint为你所做的。
伪装
Prettier是JavaScript代码格式化器。它可以接受你的代码,不管你是怎么写的,每次都会以一致和可读的方式重新编排。 当我把Prettier说成是一个测试工具时,人们经常给我疑惑的眼神。 但是,看看这个:
const a = false
const b = false
const c = true
const d = a && b || c
d 这里有什么价值?你知道这些运算符的操作顺序吗?如果你知道,那太好了!但你相信所有的工程师都知道这些运算符的操作顺序吗?但是你相信你的团队中的所有工程师都很了解它们,以至于在重构的时候不会引入一个错误吗?
通过Prettier运行这段代码,你会得到这样的结果:
const a = false
const b = false
const c = true
const d = (a && b) || c
即使你知道操作的顺序,额外的括号--Prettier在你保存文件时自动添加--也是相当有帮助的。如果你意识到这不是你想要的,那么你可以自己添加括号,Prettier会让它保持原样(const d = a && (b || c) )。
这是Prettier使你的代码意图更明显的一个例子--释放你的大脑,让你专注于更难的问题。
TypeScript
这些是JavaScript的静态类型检查器。静态类型检查器将语法添加到JavaScript中,允许你指定一个变量是什么数据类型。它可以在代码中跟踪该变量,以确保它被正确使用。(没有更多的x is not a function.)
你能发现这段代码中的错误吗?
function getFullName(user) {
const {
name: {first, middle, last},
} = user
return [first, middle, last].filter(Boolean).join(' ')
}
getFullName({first: 'Joe', middle: 'Bud', last: 'Matthews'})
也许你能,也许你不能。也许你的同事可以,也许他们不可以。在任何情况下,如果我们有一些软件可以为我们发现这个问题,那不是很酷吗?让我们把这个函数重写成TypeScript。
type User = {
name: {
first: string,
middle: string,
last: string,
},
}
function getFullName(user: User): string {
const {
name: {first, middle, last},
} = user
return [first, middle, last].filter(Boolean).join(' ')
}
现在,如果我们像以前那样调用它,我们会得到以下结果。
Argument of type '{ first: string; middle: string; last: string; }' is not assignable to parameter of type 'User'.
Object literal may only specify known properties, and 'first' does not exist in type 'User'.(2345)
我喜欢把TypeScript的类型定义看作是内联自动测试的一种形式。如果你还没有,我强烈建议你试一试。 逐步采用这些工具是可能的(特别是如果你已经在使用babel,你可以直接开始使用babel-preset-typescript )。在你的下一个功能上试试,看看你怎么想。
总结
静态代码分析是显著提高信心的好方法--快速、简单,而且比为整个代码库编写单元测试更省力。这就是为什么它构成了测试战利品🏆的基础。如果你还没有使用这些工具,现在就开始吧。