发布于:2021-02-12 00:00:41
0
51
0
早在2005年,当我第一次开始了解TDD时,我就迷上了–或如他们所说的“受测试感染”。至此,我已经在软件开发领域拥有十多年的经验。即使我有一些自动化测试的经验,发现TDD就像发现新世界。
为了获得所有这些好处,您必须以正确的方式应用TDD,这是棘手的部分。尽管有我的经验和奉献精神,但我花了很长时间才意识到TDD的最重要规则……
这与测试无关!
听起来令人惊讶,这是事实。TDD给我们带来了很多东西,而测试只是其中的一小部分。万一您想知道,我将在“什么是BDD?”一章中详细介绍。我要强调的主要观点是:要正确使用TDD,您将不得不将其视为一种设计技术,要考虑行为和规范,而不要考虑测试。
我并不是唯一一个很难充分利用TDD的人。在线上有很多问题,例如:
从哪里开始?
测试什么,不测试什么?
一次测试多少钱?
什么叫测试?
如何理解测试失败的原因?
然后Dan North出现并写了一篇非常有趣的文章,回答了其中一些问题。他建议我们将TDD的词汇替换为一个不专注于测试而是针对您的应用程序行为的词汇。没有误导性的测试术语,初学者可以更快地学习重要的东西。他创造了BDD一词。在其他人的帮助下,BDD逐渐发展成为今天的状态。现在,我们有了一套方法和技术,可以帮助我们进行交流并提供更好的文档编制概念。
这有助于我们编写高质量的代码并发现合理的设计。它吸引了开发人员以及商人,产品所有者和测试人员。由于它仍然是一种新兴的方法论,我很确定我们将来会看到它的继续增长。
近年来,JavaScript及其生态系统有了很大的改善。它已经成为网络上最重要的语言-网络语言。使用Java,Ruby,PHP或服务器上的其他任何代码都没关系。在客户端上,您需要使用JavaScript!尽管该语言有许多出色的BDD框架可用,但我每天仍然面对大量不良JavaScript代码。虽然BDD和TDD逐渐成为服务器端的常规功能,但客户端的自适应速率却比我希望的慢得多。也许缺乏集中和专业的文档是一个影响因素。 问题: “ Java和JavaScript有什么区别?” 答: “它们与汽车和地毯有很多共同点。”
JavaScript不是玩具语言
JS以“玩具”语言而闻名,无法与Java,C ++和其他流行语言在同一个领域竞争。大多数开发人员花了几年时间才意识到JS的重要性和出色之处。像道格拉斯·克罗克福德(Douglas Crockford)这样的人为了让人们了解JavaScript 1的力量而进行了长期的战斗。JS具有一些非常有用的语言功能,例如原型设计,函数表达和闭包。遗憾的是,布兰登·艾希(Brandon Eich)仅有十天的时间来实现JS的第一个版本,因此他犯了一些错误,而这些错误今天对JS仍然是个问题,但是您不能真正责怪他。
这些问题大多数都是句法性质的,并且会在将来的JS版本中得到改善。ECMAScript5标准(ES5)已经改善了这种情况。下一个版本将是ECMAScript6 aka Harmony,它将解决更多当前问题。
您可以查看 http://kangax.github.com/es5-compat-table/ 以查看哪些浏览器版本支持ECMAScript5。
基本工具
console.log 如前所述,您确实应该使用开发工具来获取可用于调试代码的console.log命令。
var a = [1, 2, 3]; console.log(a);
与警报框相比,它提供了更好的反馈,您不必连续关闭那些烦人的框。
jsHint / jsLint
为了尽早获得有关可能的错误和不良样式的反馈,您应该使用棉绒工具。Lint工具会寻找您的编码风格中可能存在的问题,例如if语句(清单1.2)中的赋值,全局变量和无法访问的代码。
<span>if (a = 3) //should have been if (a == 3) or (a === 3)</span>
如果皮棉工具发现任何问题,您会得到警告,并且可以在问题仍然很小的情况下及早解决问题。
有两种可用的出色工具: jsLint(www.jslint.com)和 jsHint(www.jshint.com)。您使用哪一个只是一个偏好问题。某些IDE(例如JetBrains Webstorm3)直接在编辑器中支持它们。
您还应该禁用其中一些棉绒检查,因为某些BDD框架使用了棉绒工具认为危险的编码样式。
严格模式
另一个很棒的检查辅助工具是 ES5的严格模式 。您可以通过提供以下字符串将现代浏览器置于严格模式下:
"use strict";
较旧的浏览器将忽略它-它只是一个字符串!但是现代浏览器会将js引擎切换为严格模式。在这种模式下,浏览器报告在以下代码中发现的各种其他错误–就像lint工具一样。您将在开发周期的早期就发现怪异的错误。
JavaScript功能正常
JS是一种功能语言,而它是一种面向对象的语言。它可能缺少像Haskell这样的更现代的功能语言的某些功能,但它从功能世界继承了一些真正有用的属性。
我认为JS最有用的功能特性是 函数表达式 和 闭包。让我们从第一个开始。
创建函数表达式
在JS函数中,头等公民。这意味着您可以像使用其他任何值一样使用它们。您可以将它们绑定到变量,将它们用作其他函数调用的参数,甚至从函数返回它们。
也许您习惯于以这种方式定义函数:
function greetMe() { return 'Hello' }
但这实际上几乎只是“语法糖”:
var greetMe = function() { return 'Hello' };
该行定义了一个函数值,并将其分配给greetMe变量。现在greetMe包含函数-更确切地说,它是绑定到函数的变量名称greetMe。您可以通过以下方式进行验证:
alert(greetMe);
alert命令需要greetMe中函数的字符串表示形式。因此,它调用反编译器,该反编译器以字符串形式返回greetMe的原始实现。现在Alert可以在其框中打印字符串。
使用函数表达式
JS 通过在函数名称后面加括号“()”来区分调用函数 和 函数作为值 。
JavaScript的基础库中甚至还有一些示例。考虑一下 Array的排序方法 ;sort默认情况下会进行词法排序。因此,以下表达式
['Brandon', 'James', 'Alan'].sort()returns this array: ['Alan', 'Brandon', 'James']
但是下一个表达式
[4, 1, 2, 3, 31, 10].sort()
返回此结果:
[1, 10, 2, 3, 31, 4]
这可能不是您想要的。即使您想要数值,它也会使用词汇排序。如果没有功能分解,JS库团队将不得不为各种订单变体编写各种排序方法。
为了避免这种情况,您要做的就是提供一个通过比较两个值来定义排序顺序的函数。Sort期望一个函数接受两个参数,并根据它们之间的关系返回-1、1或0。例如,可以通过以下方式进行数字排序:
function numericalOrder(a, b) { if (a < b) {return -1}; if (a > b) {return 1}; return 0; } [4, 1, 2, 3, 31, 10].sort(numericalOrder) //returns [1, 2, 3, 4, 10, 31]
排序算法与顺序逻辑分开。如果您需要其他订购,只需编写一个新的订购功能。您不必自己编写任何排序逻辑(例如quicksort或hashsort)。
我曾经写过一份俱乐部的申请书。其中一项功能是列出俱乐部成员。特殊要求是俱乐部主席应始终列在首位。一个简单的事情:
function memberOrder(a, b) { if (a == 'Chris Clubchief') return -1; if (b == 'Chris Clubchief') return 1; return a > b; }
现在我们有:
['Brandon', 'Chris Clubchief', 'James', 'Alan'].sort(memberOrder)
这将产生:
["Chris Clubchief", "Alan", "Brandon", "James"]
未完待续,敬请期待JavaScript的行为驱动开发:第二部分。
作者介绍