组里马上要转变开发模式,由传统的开发模式(Developer开发,QA测试),转变为尝试TDD(Test-driven development,测试驱动开发)的开发模型。由此将不存在QA的角色,或者仅存很少的QA用于系统模块间的集成测试。

  因此代码的测试与开发都将由开发者(Developer)来保证。

  这就需要借助优秀测试框架的帮助,尤其是支持TDD开发模式的自动化测试框架更为重要,因为我使用的编程是语言是Node.js,那么广泛使用的Mocha.js将成为我的首选。

  

  在团队转型过程中,很多事情都要大家自己摸索。对于Node.js的TDD开发模式,我也做了些入门的学习。

  首先来了解下什么是TDD。

一. 什么是TDD?

  通过维基百科关于TDD的介绍,可知,TDD,全称Test-driven Development,中文测试驱动开发,是来源于Agile敏捷开发的一个极限编程思想。

  大致是讲,Developer开发之前,先写测试用例(test case),测试用例写好后,再来实现需要实现的方法或功能,然后跑一遍测试用例,看能否通过。将来新加功能时,也是先加测试用例,然后新功能实现后,再跑一遍所有的测试用例,如果所有用例都成功(Pass),那么则代码质量可以保证。

  下图是来自维基百科的TDD模式流程图。

  

  大概就是这样一个流程。

  在TDD的设想中,测试用例为先,是第一要务

  

  除了TDD外,还有ATDD和BDD的概念。BDD的概念用的很多,简单介绍一下。

  1. TDD 与 BDD

    BDD是Behaviour-driven Development,行为驱动开发,相比TDD,BDD更关注通过测试,观察到程序的行为是否正确,因此它的接口是使用describe。而与BDD相比,TDD更偏重与测试代码的功能是否实现正确,它的接口是suite。因为我也是初学,其中差别理解不深。但对我而言,好用,适合才是更重要,因此我还是会选择TDD为切入点,以后可能会根据实际调整。

  

  2. Test Suite

    由上可知,TDD的接口使用的是suite。那这里必须要介绍下Test Suite的概念,在维基百科中,

    Test Suite:a collection of test cases that are intented to be used to test a software program to show that it has same specified set of behaviours.

    其实suite就是一组测试用例的集合,可用于对测试用例进行分类。suite里面可以嵌套suite,就像测一个功能的一组测试例子里面再细分测不同小功能的机组测试例子。

  

  3. Test Case测试用例的结构

    我们在写测试用例时,一个被广泛接受的结构是:

    a. Setup: 准备好环境和数据,跑这个测试用例之前的准备

    b. Execution:执行测试(测试用例的实现的主要代码)

    c. Validation:验证结果

    d. Cleanup:现场恢复,一般与a相反。不影响跑后面的测试用例。

  

  介绍完TDD的概念和接口,下面就可以引入Mocha.js啦。

二. Mocha.js - Javascript测试框架,支持TDD,BDD等多种接口

  Mocha.js是被广泛使用的Javascript测试框架,官网:http://mochajs.org/

  官方对其的定义是:

  Mocha is a feature-rich JavaScript test framework running on node.js and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases.

  

  使用Mocha.js,可以写测试用例,并跑用例来得到结果,同时还支持多种格式的Report来显示结果。支持TDD,BDD等接口,是TDD开发过程中的好帮手。

  由于TDD和BDD,Mocha提供的接口不同,这里我的例子主要是使用TDD。

  

  首先要安装Mocha.js,可通过NPM

 npm install -g mocha

  

  安装好后,可使用mocha命令来使用mocha提供的功能。

  例如mocha -h可查看命令帮助,如下。

  

  

  在这里,我实现一个简单常见的测试用例,来说明Mocha.js如何使用。

  

  首先介绍一下几个重要的接口,

  suite:定义一组测试用例。

  suiteSetup:此方法会在这个suite所有测试用例执行前执行一次,只一次,这是跟setup的区别。

  setup:此方法会在每个测试用例执行前都执行一遍。

  test:具体执行的测试用例实现代码。

  teardown:此方法会在每个测试用例执行后都执行一遍,与setup相反。

  suiteTeardown:此方法会在这个suite所有测试用例执行后执行一次,与suiteSetup相反。

  这些接口都是与TDD概念中的接口对应与相关实现,方便组织测试用例。BDD的接口在这里不予赘述,可参考官方文档。

  

  测试用例代码如下:

 var assert = require('assert');
var mocha = require('mocha'); var suite = mocha.suite;
var setup = mocha.setup;
var suiteSetup = mocha.suiteSetup;
var test = mocha.test;
var teardown = mocha.teardown;
var suiteTeardown = mocha.suiteTeardown; //test case
suite('Array', function(){ suiteSetup(function(){
//suiteSetup will run only 1 time in suite Array, before all suite
//...
console.log('suitSetup...');
}); setup(function(){
//setup will run 1 time before every suite runs in suite Array
//...
console.log('setup...');
}); suite('indexOf()', function(){
test('should return -1 when not present', function(){
assert.equal(-1, [1, 2, 3].indexOf(4));
});
}); suite('indexOf2()', function(){
test('should return not -1 when present', function(){
assert.equal(0, [1, 2, 3].indexOf(1));
});
}); teardown(function(){
//teardown will run 1 time after every suite runs in suite Array
//...
console.log('teardown...');
}); suiteTeardown(function(){
//suiteTeardown will run 1 time in suite Array, after all suits run over.
//...
console.log('suiteTeardown...');
});
});

  执行这个测试用例,通过如下命令:

 mocha test.js

  结果如下:

  

  可以看到2个测试例子都Pass,另外通过打印的信息,可看到不同接口的使用区别。这些都方便以后写正确的测试用例。

  总之,可见,有了Mocha.js的帮助,TDD的Node.js开发讲变得很容易。  

三. 关于TDD的一些感想

  以前看过陈皓的一篇文章,讲TDD其实没有看上去那么美。通过自己接触以来,发现了一些难做到的地方或小问题,如下:

  1. 测试用例难写

    要针对不同功能的Module,写出能准确测试其功能的用例,不是件容易事,可能会花费很多时间和精力。而Developers往往更倾向于把精力主要用在功能的实现。

  2. 要维护大量的测试用例

    功能复杂的Module,测试用例的数量也多,固然每次修改代码后,跑一遍所有的例子很cool,但是如果功能代码经常需要变动,测试用例也要经常变动,需要花费精力维护。

  

  不管怎样,变化总是会带来好事,拥抱变化。在摸石头过河中,探索适合自己的开发模式才重要。希望真正的开发任务到来之后,能不断总结遇到的问题,并根据自己的实际需求,找到适用自己的模式和路子:-)

四. 参考文档

  1. http://en.wikipedia.org/wiki/Test-driven_development

  2. http://en.wikipedia.org/wiki/Test_suite

  3. http://mochajs.org/

  Kevin Song

  2015年6月9日

  

测试驱动开发(TDD)及测试框架Mocha.js入门学习的更多相关文章

  1. 前端测试框架对比(js单元测试框架对比)

    前端测试框架对比(js单元测试框架对比) 本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容. 测试分类 通常应用会有 单元测试(Unit tests) 和 功能测试(Function ...

  2. 测试框架Mocha与断言expect

    测试框架Mocha与断言expect在浏览器和Node环境都可以使用除了Mocha以外,类似的测试框架还有Jasmine.Karma.Tape等,也很值得学习. 整个项目源代码: 为什么学习测试代码? ...

  3. 学习测试框架Mocha

    学习测试框架Mocha 注意:是参考阮老师的文章来学的.虽然阮老师有讲解,但是觉得自己敲一遍,然后记录一遍效果会更好点.俗话说,好记性不如烂笔头. Mocha 是javascript测试框架之一,可以 ...

  4. javascript测试框架mocha

    node测试框架mocha 简单.灵活.有趣,mocha是一个功能丰富的javascript测试框架,运行在node和浏览器中,使异步测试变得更加简单有趣.http://mochajs.org/ 安装 ...

  5. 转载自-阮一峰-测试框架 Mocha 实例教程

    测试框架 Mocha 实例教程   作者: 阮一峰 日期: 2015年12月 3日 Mocha(发音"摩卡")诞生于2011年,是现在最流行的JavaScript测试框架之一,在浏 ...

  6. Google C++测试框架系列:入门

    Google C++测试框架系列:入门 原始链接:V1_6_Primer 注 GTest或者Google Test: Google的C++测试框架. Test Fixtures: 这个词实在找不到对应 ...

  7. 测试框架Mocha

    NodeJS里最常用的测试框架估计就是mocha了.它支持多种node的assert libs, 同时支持异步和同步的测试,同时支持多种方式导出结果,也支持直接在browser上跑Javascript ...

  8. 测试驱动开发 TDD

    一.详解TDD 1.1.TDD概念 :Test Drived Develop 测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种方法论.TDD的原理是在开发功能代码之前,编写单元测试用例代码,测试 ...

  9. 测试驱动开发(TDD)的思考

    极限编程 敏捷开发是一种思想,极限编程也是一种思想,它与敏捷开发某些目标是一致的.只是实现方式不同.测试驱动开发是极限编程的一部分. 1.极限编程这个思路的来源 Kent Beck先生最早在其极限编程 ...

随机推荐

  1. logrotate工具日志切割

    /var/log/zabbix/zabbix_server.log { daily ##每天转储 rotate ##保留60个备份 olddir /usr/local/src ##保存日志的位置 co ...

  2. vscode 配置 java utf-8 编码

    utf-8 编码 和 lombok 的 配置 "java.jdt.ls.vmargs": "-noverify -Xmx1G -XX:+UseG1GC -XX:+UseS ...

  3. Tinkphp 教程 一

    1项目生成配置php环境变量在控制台进入项目目录,执行php console build --config build.php命令在application目录创建项目目录,把创建好的目录复制到自定义a ...

  4. P4345 [SHOI2015]超能粒子炮·改

    传送门 看到数据和模数大小就知道要上 lucas 了 然后开始愉快地推公式: 答案为 $\sum _{i=0}^kC_{n}^{i}\ (mod\ 2333)$ 设 $f [ i ] [ j ] = ...

  5. 优先队列priority_queue的简单应用

    优先队列 引入 优先队列是一种特殊以及强大的队列. 那么优先队列是什么呢? 说白了,就是一种功能强大的队列. 它的功能强大在哪里呢? 四个字:自动排序. 优先队列的头文件&&声明 头文 ...

  6. php中静态绑定

    自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类. 虽然也可以调用非静态方法,但是不会在运行时绑定. static 不再只是简单的静态修饰关键字. ...

  7. k2安装LEDE

    固件下载时请用Breed Web 恢复控制台恢复固件,步骤如下:1.到LEDE官方网站下载最新开发版固件2.Web Breed台刷写固件3.将一台能上网的路由器LAN口接至K2 WAN口,等待K2连上 ...

  8. hive 全表全字段对比

    select * from ( select max(t1.source) as source ,t1.c1 ,t1.c2 ,t1.c3 ,count(*) as cnt from ( as sour ...

  9. 在word2010中添加带滚动条的文本框

    由于文件内容过长,为了加强文章的可读性,可以添加一个带滚动条的文本框,既能使文章看起来干净整洁,同时也极大的提高了文章的可读性. 我这里对在word2010中文本框带滚动条作个介绍: 1. 打开wor ...

  10. Windows常用IDE下载(含安装教程)

    电脑办公 电脑系统(U盘安装) PE系统 WIN7 WIN8 WIN10 XP 电脑系统(直接安装) WIN7 WIN8 WIN10 Office office2003 office2007 offi ...