@@ -30,13 +30,13 @@ published: True
3030
3131### 测试奖杯🏆:软件测试的分层策略
3232
33- 测试奖杯([ Testing Trophy] ( https://testingjavascript.com/ ) )是一种** 自下而上** 的 Web 应用测试策略。其实这是在说我们需要编写_恰到好处的_测试,给予团队足够的信心 —— 正确的测试,而_不是_仅仅追求达到100 %的测试覆盖率而已。
33+ 测试奖杯([ Testing Trophy] ( https://testingjavascript.com/ ) )是一种** 自下而上** 的 Web 应用测试策略。其实这是在说我们需要编写_恰到好处的_测试,给予团队足够的信心 —— 正确的测试,而_不是_仅仅追求达到 100 %的测试覆盖率而已。
3434
3535![ 测试奖杯的四个部分] ( https://res.cloudinary.com/dg3gyk0gu/image/upload/v1539186394/theTestingTrophy_2x.png )
3636
3737使用测试奖杯策略,我们可以将这些自动化测试技术进行分层:
3838
39- * ** 使用静态类型系统和linter ** 来捕获拼写或语法之类的基本错误。
39+ * ** 使用静态类型系统和 linter ** 来捕获拼写或语法之类的基本错误。
4040* ** 编写有效单元测试** 需要特别针对于应用的某些关键行为或功能。
4141* ** 编写集成测试** 以确保 Web 应用各模块之间能够正常协调工作。
4242* ** 创建端到端(e2e)功能测试** 对关键路径进行自动化点击操作,而不是等到最终用户来发现问题。
@@ -60,7 +60,7 @@ published: True
6060| action 层 | 1. 是否获取了正确的参数<br />2. 是否正确地调用了 API<br />3. 是否使用了正确的返回值存取回 Vuex 中<br />4. 业务分支逻辑<br />5. 异常逻辑 | 这五个业务点建议 100% 覆盖 | 这个层级主要包含前述 5 大方面的业务逻辑,进行测试很有重构价值 |
6161| mutation 层 | 是否正确完成计算 | 有逻辑的 mutation 要求 100%覆盖率 | 这个层级输入输出明确,又包含业务计算,非常适合单元测试 |
6262| getter 层 | 是否正确完成计算 | 有逻辑的 getter 要求 100%覆盖率 | 这个层级输入输出明确,又包含业务计算,非常适合单元测试 |
63- | component 层 | 是否渲染了正确的组件 | 1. 组件的分支渲染逻辑要求100 %覆盖<br />2. 交互事件的调用参数一般要求100 %覆盖<br />3. 被 connect 过的组件不测<br /> | 这个层级最为复杂,还是以「代价最低,收益最高」为指导原则进行 |
63+ | component 层 | 是否渲染了正确的组件 | 1. 组件的分支渲染逻辑要求 100 %覆盖<br />2. 交互事件的调用参数一般要求 100 %覆盖<br />3. 被 connect 过的组件不测<br /> | 这个层级最为复杂,还是以「代价最低,收益最高」为指导原则进行 |
6464| UI 层 | 组件是否渲染了正确的样式 | 1. 纯 UI 不测<br />2. CSS 不测 | 这个层级以我目前理解来说测试较难稳定,成本又较高 |
6565| utils 层 | 各种辅助工具函数 | 没有副作用的必须 100% 覆盖 | |
6666
@@ -104,13 +104,13 @@ published: True
104104单元测试只有在毫秒级别内完成,开发者才会愿意频繁地运行它,将其作为快速反馈的手段也才能成立。那么为了使单元测试更快,我们需要:
105105
106106* 尽可能地避免依赖。除了恰当设计好对象,关于避免依赖我已知有两种不同的看法:
107- * 使用mock适当隔离掉三方的依赖 (如数据库、网络、文件等)
108- * 避免mock ,换用更快速的数据库、启动轻量级服务器、重点测试文件内容等来迂回
107+ * 使用 mock 适当隔离掉三方的依赖 (如数据库、网络、文件等)
108+ * 避免 mock ,换用更快速的数据库、启动轻量级服务器、重点测试文件内容等来迂回
109109* 将依赖、集成等耗时、依赖三方返回的地方放到更高层级的测试中,有策略性地去做
110110
111111### ** I** ndependent:一次只测一条分支
112112
113- 通常来说,一条分支就是一个业务场景,是做任务分解(Tasking)过程的一个细粒度的task 。为什么测试只测一条分支呢?很显然,如此你才能给它一个好的描述,这个测试才能保护这个特定的业务场景,挂了的时候能给你细致到输入输出级别的业务反馈。
113+ 通常来说,一条分支就是一个业务场景,是做任务分解(Tasking)过程的一个细粒度的 task 。为什么测试只测一条分支呢?很显然,如此你才能给它一个好的描述,这个测试才能保护这个特定的业务场景,挂了的时候能给你细致到输入输出级别的业务反馈。
114114
115115常见的反模式是,实现本身就做了太多的事情,不符合[ 单一职责原则(SRP)] ( https://zh.wikipedia.org/wiki/%E5%8D%95%E4%B8%80%E5%8A%9F%E8%83%BD%E5%8E%9F%E5%88%99 ) 。如果你发现某个模块的单元测试特别难写的话,那么这个模块的实现本身或输入/输出就足够繁琐,应当作为一种某味道识别出来进行重构。
116116
@@ -152,7 +152,7 @@ test.each([
152152
153153另外,还有一些测试实现代码的执行次序。这也是一种“关注内部实现”的测试,这就使得除了输入输出外,还有“执行次序”这个因素可能使测试挂掉。显然,这样的测试也不利于重构的开展。
154154
155- 此外,对外部依赖采取mock策略 ,同样是某种程度上的“关注内部实现”,因为mock的失败同样将导致测试的失败 ,而非真正业务场景的失败。对待mock的态度 ,肖鹏有篇文章[ Mock的七宗罪] ( https://gitbook.cn/books/58fa1af500a2684bf77511bc/index.html ) 对此展开了详细描述,应当谨慎使用。
155+ 此外,对外部依赖采取 mock 策略 ,同样是某种程度上的“关注内部实现”,因为 mock 的失败同样将导致测试的失败 ,而非真正业务场景的失败。对待 mock 的态度 ,肖鹏有篇文章[ Mock的七宗罪] ( https://gitbook.cn/books/58fa1af500a2684bf77511bc/index.html ) 对此展开了详细描述,应当谨慎使用。
156156
157157### ** T** imely:表达力极强,易于阅读
158158
@@ -167,10 +167,10 @@ test.each([
167167* ** 测试数据准备** 。无关的测试数据(比如对象中的很多无关字段)不应该写出来,应只准备能体现测试业务的最小数据
168168* ** 输出报告** 。选用断言工具时,应注意除了要提供测试结果,还要能准确提供“期望值”与“实际值”的差异
169169
170- 上述第三点有些测试框架提供了反例,比如说chai和sinon提供的断言API就不如jest友好 ,体现在:
170+ 上述第三点有些测试框架提供了反例,比如说 chai 和 sinon 提供的断言 API 就不如 jest 友好 ,体现在:
171171
172172* ` expect(array).to.eql(array) ` 出错的时候,只能报告说` expect [Array (42)] to equal [Array (42)] ` ,具体是哪个数据不匹配,根本没报告
173- * ` expect(sinonStub.calledWith(args)).to.be.true ` 出错的时候,会报告说` expect false to be true ` 。废话,我还不知道挂了么,但是那个stub究竟被什么参数调用则没有报告
173+ * ` expect(sinonStub.calledWith(args)).to.be.true ` 出错的时候,会报告说` expect false to be true ` 。废话,我还不知道挂了么,但是那个 stub 究竟被什么参数调用则没有报告
174174
175175## 总结一下
176176
@@ -186,7 +186,7 @@ test.each([
186186
187187### 「懒惰」是程序员最大的美德
188188
189- Perl语言的发明人Larry Wall说,好的程序员有3种美德 : 懒惰、急躁和傲慢(Laziness, Impatience and hubris)。
189+ Perl 语言的发明人 Larry Wall 说,好的程序员有 3 种美德 : 懒惰、急躁和傲慢(Laziness, Impatience and hubris)。
190190
191191懒惰:是这样一种品质,它使得你花大力气去避免消耗过多的精力。它敦促你写出节省体力的程序,同时别人也能利用它们。为此你会写出完善的测试或文档,以免别人问你太多问题。
192192
@@ -203,7 +203,7 @@ Perl语言的发明人Larry Wall说,好的程序员有3种美德: 懒惰、
203203- ** 我** ,还可以如何偷懒?
204204- 应该让计算机帮忙测点什么?
205205- 计算机该在什么时候进行测试?
206- - 需要100 %的覆盖率吗?
206+ - 需要 100 %的覆盖率吗?
207207- 多少次测试就足够了?
208208
209209## 未完待续……
@@ -225,13 +225,13 @@ Perl语言的发明人Larry Wall说,好的程序员有3种美德: 懒惰、
225225
226226* [x] \# ## CQRS 与 ` Redux-like ` 架构
227227* [x] \# ## 如何对 Vuex 进行单元测试
228- * [x] \# ## Vue组件和Vuex store的交互
228+ * [x] \# ## Vue 组件和 Vuex store 的交互
229229
230230** \# # Vue 应用测试策略**
231231
232232* [x] \# ## 单元测试的特点及其位置
233233* [x] \# ## 测试奖杯🏆:软件测试的分层策略
234- * [x] \# ## 单元测试的F .I.R.S.T原则
234+ * [x] \# ## 单元测试的 F .I.R.S.T 原则
235235
236236** \# # Vue 单元测试的落地**
237237
0 commit comments