← 返回目录

内置索引与外置引擎

第 55 / 119 卷日期:

(ps: 为了和搜索引擎对应起来,这里就将内置门户改成内置索引。)

所以,再仔细回到上面的问题里。要成为一名可以完成任务的程序员,你就需要不断地构建你的门户网站。我们要学习 Web 开发,我们就需要对整个知识体系有一个好

的理解。不断理解的过程中,我们就不断也添加了新的文档,构建新的索引。每遇到一个新的知识点,我们就开始重新生成新的索引。

然后又会引入一个问题:

人的大脑如同一间空空的阁楼,要有选择地把一些家具装进去。

我们需要不断地整理一些新的技术,并且想方设法地忘记旧的知识。

有时,不得不说笔记和博客是这样一个很好的载体。在未来的某一天,我们可以重新挖掘这些技术,识别技术的旧有缺陷,发展出新的技术——水能载舟,亦能覆舟。

如何编写测试

写测试相比于写代码来说算是一种简单的事。多数时候,我们并不需要考虑复杂的逻辑。我们只需要按照我们的代码逻辑,对代码的行为进行覆盖。

需要注意的是——在不同的团队、工作流里,测试可能是会有不同的工作流程:

  • 开发人员写单元测试、集成测试等等
  • 测试团队通过界面来做黑盒测试
  • 测试人员手动测试来测试功能

在允许的情况下,测试应该由开发人员来编写,并且是由底层开始写测试。为了更好地去测试代码,我们需要了解测试金字塔。

测试金字塔

测试金字塔是由 Mike Cohn 提出的,主要观点是:底层单元测试应多于依赖 GUI 的高层端到端测试。其结构图如下所示:

从结构上来说,上面的金字塔可以分成三部分:

  1. 单元测试。
图 98-1
图 98-1

图 47: 测试金字塔

  1. 服务测试
  2. UI 测试

从图中我们可以发现:单元测试应该要是最多的,也是最底层的。其次才是服务测试,最后才是 UI 测试。大量的单元测试可以保证我们的基础函数是正常、正确工作的。

而服务测试则是一门很有学问的测试,不仅仅只在测试我们自己提供的服务,也会测试我们依赖第三方提供的服务。在测试第三方提供的服务时,这就会变成一件有意思的事

了。除此还有对功能和UI的测试,写这些测试可以减轻测试人员的工作量——毕竟这些工作量转向了开发人员来完成。

单元测试单元测试是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。它是应用的最小可测试部件。举个例子来说,下面是一个JavaScript的函数,用

于判断一个变量是否是一个对象:

var isObject = function (obj) { var type = typeof obj;

return type === 'function' || type === 'object' && !!obj;

};

是正常工作的:

it("should be a object", function () { expect(l.isObject([])).toEqual(true);

expect(l.isObject([{}])).toEqual(true);

});

虽然这个测试看上去很简单,但是大量的基本的单元测试可以保证我们调用的函数都是可以正常工作的。这也相当于是我们在建设金字塔时用的石块——如果我们的石块

都是经常测试的,那么我们就不怕金字塔因为石块的损坏而坍塌。

当单元测试达到一定的覆盖率,我们的代码就会变得更健壮。因为我们都需要保证我们的代码都是可测的,也意味着我们代码间的耦合度会降低。我们需要去考虑代码的

长度,越长的代码在测试的时间会变得越困难。这也就是为什么 TDD 会促使我们写出短的代码。如果我们的代码都是有测试的,单元测试可以帮助我们在未来重构我们的代

码。

并且在很多没有文档或者文档不完整的开源项目中,了解这个项目某个函数的用法就是查看他的测试用例。测试用例(Test Case)是为某个特殊目标而编制的一组测试输

入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。这些测试用例可以让我们直观地理解程序程序的 API。

服务测试服务测试顾名思义便是对服务进行测试,而服务可以是有不同的类型,不同层次的测试。如第三方的API服务、我们程序提供的服务,虽然他们他应该在这一个层

级上进行测试,但是对他们的测试会稍有不同。

对于第三方的提供的 API 服务或者其他类似的服务,在这一个层级的测试,我们都不会真实地去测试他们能不能工作——这些依赖性的服务只会在功能测试上进行测试。

在这里的测试,我们只会保证我们的功能代码是可以正常工作的,所以我们会使用一些虚假的API测试数据来进行测试。这一类提供API的Mock Server可以模拟被测系统外

部依赖模块行为的通用服务。我们只要保证我们的功能代码是正常工作的,那么依赖他的服务也会是正常工作的。

而对于我们提供的服务来说,这一类的服务不一定是 API 的服务,还有可能是多个函数组成的功能性服务。当我们在测试这些服务的时候,实际上是在测试这个函数结合

在一起是不是正常的。

一个服务可能依赖于多个函数,因而我们会发现服务测试的数量是少于单元测试的。

全站分卷索引 · 119 卷
  1. 1Growth: 全栈增长工程师指南
  2. 2软件开发的核心难题:沟通
  3. 3大公司的专家与小公司的全栈
  4. 4全栈工程师的未来:无栈
  5. 5基础知识篇
  6. 6工具只是辅助
  7. 7语言也是一种工具
  8. 8提高效率的工具
  9. 9IDE
  10. 10终端或命令提示符
  11. 11包管理
  12. 12环境搭建
  13. 13Windows
  14. 14GNU/Linux
  15. 15学好一门语言的艺术
  16. 16输出是最好的输入
  17. 17如何应用一门新的技术
  18. 18Web 编程基础
  19. 19从 HTML 到页面显示
  20. 20HTML
  21. 21中文?
  22. 22其他 HTML 标记
  23. 23小结
  24. 24CSS
  25. 25简介
  26. 26样式与目标
  27. 27更有趣的 CSS
  28. 28JavaScript
  29. 29JavaScriptFul
  30. 30面向对象
  31. 31其他
  32. 32前端与后台
  33. 33后台语言选择
  34. 34PHP
  35. 35Model
  36. 36View
  37. 37Controller
  38. 38后台即服务
  39. 39后台即服务
  40. 40数据库
  41. 41搜索引擎
  42. 42前端框架选择
  43. 43前台与后台交互
  44. 44JSON
  45. 45WebSocket
  46. 46编码过程
  47. 47Web 应用的构建系统
  48. 48Web 应用的构建过程
  49. 49Web 应用的构建实战
  50. 50Git 与版本控制
  51. 51Tasking
  52. 52Tasking 开发任务
  53. 53写代码只是在码字
  54. 54内置索引与外置引擎
  55. 55内置索引与外置引擎
  56. 56如何测试
  57. 57测试替身
  58. 58Mock
  59. 59测试先行
  60. 60可读的代码
  61. 61命名
  62. 62函数长度
  63. 63代码重构
  64. 64提炼函数
  65. 65内联函数
  66. 66查询取代临时变量
  67. 67重构到设计模式
  68. 68上线
  69. 69隔离硬件:虚拟机
  70. 70隔离操作系统:容器虚拟化
  71. 71隔离底层:Servlet 容器
  72. 72隔离依赖版本:虚拟环境
  73. 73隔离语言:DSL
  74. 74GNU/Linux
  75. 75HTTP 服务器
  76. 76数据库端缓存
  77. 77前端缓存
  78. 78运行机制
  79. 79自动化部署
  80. 80依赖与包仓库
  81. 81构建软件包
  82. 82数据分析
  83. 83想法-构建
  84. 84产品-衡量
  85. 85数据分析
  86. 86分析数据
  87. 87用户数据分析:Google Analytics
  88. 88流量获取
  89. 89移动应用
  90. 90网站性能
  91. 91SEO
  92. 92什么样的网站需要 SEO?
  93. 93内容
  94. 94UX 入门
  95. 95什么是简单?
  96. 96进阶
  97. 97认知设计
  98. 98持续交付
  99. 99持续集成系统
  100. 100持续交付
  101. 101持续部署
  102. 102持续阅读
  103. 103遗留系统与修改代码
  104. 104遗留代码
  105. 105修改遗留代码
  106. 106速度优化
  107. 107模块重构
  108. 108Retro
  109. 109三个维度
  110. 110架构模式
  111. 111预设计式架构
  112. 112演进式架构:拥抱变化
  113. 113意图导向
  114. 114重构
  115. 115模式与演进
  116. 116相关阅读资料
  117. 117架构解耦
  118. 118CQRS
  119. 119CQRS 结合微服务