第一周 测试
为什么需要测试
- JavaScript 是动态语言, 缺少类型检查,编译期间无法定位到错误
- JavaScript 宿主的兼容性问题, 比如 DOM 操作在不同浏览器上的表现
测试的好处是什么
- 测试可以快速反馈你的功能输出,验证你的想法
- 测试可以保证代码重构的安全性,没有一成不变的代码,测试用例能给你多变的代码结构一个定心丸。
- 测试用例其实可以看成代码 API 使用文档,而且还是定时更新的,对 API 的使用者有很大的帮助
- 易于测试的代码,说明是一个好的设计
- 测试最重要的是提升代码自量,虽然不可能杜绝各种疏忽而引起的功能bug,但是可以减少大部分的bug产生.
- 写测试用例也可以促进自己更加理解你开发功能的业务逻辑和输入输出,从而大大提高开发效率
- 测试用例里非常清楚的阐释了开发者和使用者对于这端代码的期望和要求,也非常有利于代码的传承。
TDD 和 BDD 的差别
TDD ( Test-driven development ) 测试驱动开发
解开TDD的定义,我们会发现它通常分为五个不同的阶段:
- 首先开发者写一些测试。
- 开发人员然后运行这些测试,(显然)他们失败,因为这些功能都没有实际实现。
- 接下来开发人员在实际中去实现代码根据测试例子
- 如果开发人员编写好代码,那么在下一阶段他们会看到他们的测试通过。
- 然后,开发人员可以重构他们的代码,添加注释并进行清理,因为开发人员知道如果新代码破坏了某些东西,那么测试将会失败。
BDD ( Behavior-driven development ) 行为驱动开发
主要是BDD旨在消除TDD可能造成的问题,与TDD相比,BDD是当我们写行为和规范,然后驱动我们的软件开发。行为和规范可能看起来非常类似于测试,但差异是非常微妙和重要的。
- 主要区别只是措辞。BDD使用更详细的风格,以便可以像读句子一样阅读。
测试工具
- 1、测试框架 :
Mocha
(摩卡)、karma
- 2、断言库:
Should.js
、expect.js
、Node.js 自带assert断言 - 3、自动化测试工具:
Travis CI
安装测试相关工具
npm 或则 yarn install 的方式安装依赖或插件,具体就不介绍了
Node.js API 之 assert 断言
对assert 的15个方法的一个整理
(学习笔记)[https://www.jianshu.com/p/1fcf4502c619]
预览完assert API 后,再看should、expect 的断言库基本使用方式差不多,理解起来也会很快
预习习题思考
两极大数相加
javascript 语言对number 类型精确到个位最大整数是9007199254740992, 也就是Math.pow(2, 53)
;超过此边界后的位数会被丢弃,导致精度丢失.
!(Javascript Number)[http://www.plqblog.com/ueditor/php/upload/image/20160709/1468042984788341.png]
所以在加法运算时,会造成精度丢失,解决方法的思路是以字符串的形式来相加:
// 方法一:
// 根据正常的数据加法运算表达式计算,转换成代码计算
// 将两个数分别转换成字符串,数字的第一位自然是右边第一位了,所以将数组反转一下
// 根据两个数的最大长度,就可以得知需要依次加几次
// 两个数组然后依次相加,(如果你不把数组反转一下,相加的位是不是会发生错位的情况了)
// 对依次相加的数进行依次计算,如果相加大于等于10,说明下一位还要进1(存贮状态);默认进位为0,在计算两个同index 相加 默认加上进位,然后判断是否进位,,个位数压入新的数组
// 最后计算出来后的字符串再反转一下就出来了
function add(string1, string2) {
function add(string1, string2) {
// 实现该函数
// 先判断,如果小于16位,直接相加
if (string1.length < 16 && string2.length < 16) {
return ((+string1) + (+string2)).toString()
}
// return (Number(string1) + Number(string2)).toString()
// 大数相加
let list1 = string1.split('').reverse() // 将字符串拆分成单个元素的数组,把元素颠倒过来
let list2 = string2.split('').reverse()
let resultList = [] // 存放相加好的个位数的list
let carry = 0 // 进位
const cycleNumbers = Math.max.apply(Math, [string1.length, string2.length]) // 相加的次数
let i = 0
while (i <= cycleNumbers) {
unitTotalList = (Number(list1.shift() || '0') + Number(list2.shift() || '0') + carry).toString().split('') // 个位数相加
resultList.push(unitTotalList.pop()); // 把结果放进list里
carry = Number(unitTotalList.pop() || '0') // 进位的数字。默认0
// console.log('carry:', carry)
i++
}
// console.log("resultList:", resultList);
return resultList.reverse().join('').replace(/^0/gi, '') // 把list颠倒过来,合并。如果最大的个位数是0,丢弃
}
// 方法二 奇淫技巧
// 思路是一样的,不过这里使用了一些js 语法的特性
function sumStrings(a,b){
var res='', c=0;
a = a.split('');
b = b.split('');
while (a.length || b.length || c){
c += ~~a.pop() + ~~b.pop();
c = c>9;
}
return res.replace(/^0+/,'');
}
工具配置相关记录问题
网友评论