使用模块

mocha

@转载自阮一峰:测试框架Mocha实例教程
JavaScript测试框架之一,能在浏览器和Node环境使用。可以通过它为JavaScript应用添加测试,从而保证代码的质量。

为了方便起见,在全句环境安装mochanpm install -g mocha

通常测试脚本与所要测试的源码脚本同名,但是后缀名为.test.js(表示测试)或者.spex.js(表示规格)。比如add.jd的测试脚本名称为add.test.js

mocha语法里面:
describe块称为“测试套件”,表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称,第二个参数是一个实际执行的函数。
it块称为“测试用例”,表示一个单独的测试,为测试的最小单位。它是一个函数,第一个参数是测试用例的名称,第二个参数是一个实际执行的函数。

describe块孩提供了测试用例的四个hook: before(),after(),beforeEach(),afterEach()

注意
在协作项目的时候应该考虑mocha的版本问题,因为在不同版本的mocha下是不兼容的。这时应该注意:

  1. $ npm i mocha --save-dex, 安装一个局部的mocha到项目目录中去
  2. $ ./node_modules/.bin/mocha, 用刚才安装的局部的mocha来跑测试代码
    但是每次这样的输入很麻烦。可以通过使用Makefile帮助我们记住复杂的配置,详见:包教不包会Makefile详解

should

should是断言库模块之一,什么是“断言”?“断言”就是判断源码的实际执行结果与预期的执行结果是否一致,如果不一致就抛出错误。

所有的测试用例(it块)都应该包含有一句或者多句断言。它是编写测试用例的关键。

mocha为了保持自己的灵活性,因此默认不提供断言的API。在Nodejs中mocha和should是协作完成的。

@转载自淘宝FED:断言库的比较
断言库 | 优点 | 缺点 | 备注
— | — | — | —
Nodejs核心库Assert | 无需第三方依赖 | 语法较烂 | -
Should.js | API比较语义 | 文档比较烂 | -
expect.js | - | - | 比较中庸
chai | 大而全的API | - | -

istanbul

Nodejs覆盖率统计工具。
作用:提供一系列指标取衡量单元测试覆盖了哪些功能代码。istanbul提供了代码的语句覆盖率,分支覆盖率,函数覆盖率和行覆盖率的统计。

知识集成

单元测试类型

  1. TDD(测试驱动开发)
  2. BDD(行为驱动开发)

持续集成

@转载自阮一峰 : 持续集成是上面?
持续集成指的是 频繁的(一天多次)将代码集成到主干。
好处:

  1. 快速发现错误。每天完成一点更新,集成到主干,快速发现并定位错误。
  2. 防止分支大幅度偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成难度越来越大。
    持续集成的目的是为了让偿命快速迭代,同时还能保证高质量,核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败就不能集成。

这里贴上蓬stephen蓬的评论:

阮老师讲的“持续集成”,正好是我在公司做了将近半年多互联网项目的一个工作流程。我们项目经历了两期,每期都要进行十几次迭代,每次迭代都会在上一个迭代的基> 础上增加几个新功能,并且公司要求开发人员在编码前要先提交该功能的单体测试和集成测试的代码,然后才能开始写代码(所谓的测试驱动开发),然后测试人员要负> 责写端到端的自动化测试代码。公司用Jenkins进行持续集成,SVN管理代码库,Git进行团队开发,Sonar进行代码质量检查。项目成员每天早晨都会收到Jenkins服务> 器发来的前一天的集成测试报告,通知前一天的提交是否完全通过。经历了这样一个持续迭代的过程,给客户交付的代码质量有保证,很少或几乎没有出现过回滚的情况。

npm 使用积累

npmpackage.json提供了三种依赖关系的定义:

  1. dependencies
  2. peerDependencies
  3. devDependencies
    其中devDependencies是开发是依赖的,比如模块用mocha来测试框架,那么模块开发就依赖mocha,如果别人想为你的模块贡献代码,他也需要安装mocha。但是只是用你模块的人就没必要安装mocha
    perrDependencies是为插件准备的。比如grunt的插件,里面没有require('grunt'),所以用dependencies就有问题。所以需要单独列出来。

其他

Ubuntu下用命令行快速打开各种类型的文件:xdg-open <filename>