javascript--给你的JS代码添加单元测试
通过测试框架为JavaScript应用添加测试,从而保证代码的高质量。这里的笔记例子应用在jaywcjlove/validator.js中。
安装
用到三个工具chai(断言工具),mocha(测试框架),mocha-phantomjs(客户端运行mocha试验在命令行测试通过),先在你的项目中安装这三个工具
# 创建一个目录进入目录
$ mkdir test-demo && cd test-demo 
# 初始化创建一个 package.json 文件,运行这个命令自动创建
$ npm init  
# 用管理员权限,安装三个工具
# --save-dev 参数会将这三个工具作为依赖存入packge.json中
$ sudo npm install chai mocha mocha-phantomjs --save-dev
注意:
mocha这个工具可以全局安装npm install -g mocha本例子使用的方法没有全局安装
mocha你的电脑必须有
Node此例子是我在
Mac OS x环境弄出来的,其它平台不做解释
测试应用
首先你要写一个你需要测试的 js 例如: 我在 jaywcjlove/validator.js 中测试我我的 dist/validator.js js。在test-demo/test 目录中建立一个validators.html 的HTML
<!DOCTYPE html>
<html>
<head>
    <title>单元测试</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../node_modules/mocha/mocha.css" />
</head>
<body>
    <div id="mocha"></div>
    <script type="text/javascript" src="../dist/validator.js"></script>
    <script type="text/javascript" src="../node_modules/chai/chai.js"></script>
    <script type="text/javascript" src="../node_modules/mocha/mocha.js" ></script>
    <script>mocha.setup('bdd')</script>
    <script src="unit/validators.js"></script>
    <script>
        if (window.mochaPhantomJS) {
            mochaPhantomJS.run();
        } else {
            mocha.run();
        }
    </script>
</body>
</html>
应用说明
在这个例子中引用了了几个个必要的文件
mocha.css这个是你的测试用例在浏览器中查看需要引用这个样式chai.js这个是 mocha 的强大的断言工具mocha.js这个是个测试框架,让你用很好的方式写测试用例../dist/validator.js这个是你要测试的jsunit/validators.js这个是你的测试脚本代码
下面这段 js 判断使用 mocha-phantomjs 这个框架。
if (window.mochaPhantomJS) {
    mochaPhantomJS.run();
} else {
    mocha.run();
}
断言库的用法
mocha.setup('bdd') 使用不同的风格展示,有三个参数可选(bdd|tdd|exports)。基础的代码都复制完成之后,开始写测试用例,在test-demo/test/unit/ 目录中建立一个测试脚本。例如我叫它validators.js。你为了区分它可以在后面添加一个 test的后缀,如validators.test.js 用来表示测试;
var expect = chai.expect;
var assert = chai.assert;
var v =  new Validator();
describe("validators", function() {
    it("isEmail() 邮箱验证", function() {
        // 断言
        expect( v.isEmail('d.s.s.d@qq.com.cn') ).to.be.true;
        expect( v.isEmail('d.s-s.d@qq.com.cn') ).to.be.true;
        expect( v.isEmail('wowo.o@qq.com') ).to.be.true;
        expect( v.isEmail('wowo@123.sd') ).to.be.true;
        expect( v.isEmail('wowo@123.23') ).to.be.true;
        expect( v.isEmail('wowo.oqqcom') ).to.be.false;
        expect( v.isEmail('wowo@123') ).to.be.false;
        expect( v.isEmail('wowo@asdf.中国') ).to.be.false;
        expect( v.isEmail('wowo@中国.com') ).to.be.false;
        expect( v.isEmail('中@qq.com') ).to.be.false; 
    });
    it("isIp() IP验证", function() {
        expect( v.isIp('01.01.01.0') ).to.be.true;
        expect( v.isIp('192.168.1.1') ).to.be.true;
        expect( v.isIp('192.168.23.3') ).to.be.true;
        expect( v.isIp('192.168.23.3.32.1') ).to.be.true;
        expect( v.isIp('192') ).to.be.false;
        expect( v.isIp('192.168.1.1233') ).to.be.false;
        expect( v.isIp('192.168.1324.123') ).to.be.false;
    });
    it("isPhone() 手机号码验证", function() {
        expect( v.isPhone('13611779473') ).to.be.true;
        expect( v.isPhone('+8613611779473') ).to.be.true;
        expect( v.isPhone('+23613611779473') ).to.be.true;
    });
});
chai.expect 和 chai.assert其实是两种不同的风格如下面,具体断言提供的接口可看官网 http://chaijs.com 或者去看看我做的中文笔记chai 中文手册
assert.equal( v.isPhone('13611779473') ,true)
expect( v.isPhone('13611779473') ).to.be.true; 
准备工作都做完了,现在就是,怎么跑测试的步骤来了。
Mocha的基本用法
我们在 package.json 文件中插入一段命令行。
{
  "scripts": {
    "test": "mocha-phantomjs test/validators.html",
  },
}
这个时候你可以使用命令npm test跑一下看一下测试结果:
  validators
    ✓ isEmail() 邮箱验证
    ✓ isIp() IP验证
    ✓ isPhone() 手机号码验证
  3 passing (5ms)
这里使用了mocha-phantomjs 所以在命令行中稍微有点慢,中间加载了 webkit 内核,所以为了方便,我们可以直接将test/validators.html 页面在浏览器中打开就可以看到测试结果了。
在Github中显示的测试状态
https://travis-ci.org,https://circleci.com这两个网站都是持续集成测试的自动测试系统。如果你使用travis-ci.org作为你的自动测试系统,配置起来非常方便,其实这俩货使用起来都很方便。
travis-ci.org
1)在根目录建立一个 .travis.yml,配置CircleCI
language: node_js
node_js:
    - "4"
2)提交到你的仓库中。 
3)使用 Github 登录此网站(有可能你要翻墙才能打开这网站) 
4)添加你的项目
README.md 中显示你的状态
只要在 README.md 中引用 travis-ci.org 提供的状态图片即可。
添加项目
选择你的项目
获取状态图片
不细说,图文....
javascript--给你的JS代码添加单元测试的更多相关文章
- IOS-网络(网页开发-UIWebView,HTML,CSS,JavaScript,OC和JS代码互调)
		
一.网页基础 // // ViewController.m // IOS_0218_网页开发1 // // Created by ma c on 16/2/18. // Copyright © 201 ...
 - Yii2的View中JS代码添加
		
直接写 <script> $(function(){ alert("aaa"); }); <script> 会提示出错 是因为view中添加js代码的前面没 ...
 - JavaScript入门:002—JS代码放置的位置
		
JavaScript在页面中使用,那么这些JS代码应该放在什么位置呢?以下来看一下. 一般来说有两种方式.写在界面上和使用.js文件.1.1界面上的Head部分能够直接放在head标签内,例如以下代码 ...
 - javascript 全选 反选 js代码
		
<script type="text/javascript"> //全选function checkAll() { var objs = window.document ...
 - [JavaScript]转--如何让JS代码高大上
		
原文出处:http://www.cnblogs.com/wenber/p/3630373.html 1,创造简短的写法 你可以这么写: 1 var slice = Array.prototype.sl ...
 - Javascript DOM编程艺术JS代码
		
//com function addLoadEvent (func) { var oldonload = window.onload; if (typeof window.onload != 'fun ...
 - 如何用QUnit为JS代码做单元测试
		
非常好的入门文章: http://www.zhangxinxu.com/wordpress/2013/04/qunit-javascript-unit-test-%E5%8D%95%E5%85%83% ...
 - 原创:js代码, 让dedecms支持Tag选择, 添加内容更为方便,不用手输Tag
		
dedecms在编辑修改内容时,TAG标签需要手动输,中文的Tag, 中间还得用半角字符','分隔, 输入法切来切去很不方便, 于是动手改后台代码, 利用后台的tags_main.php, 让d ...
 - 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】
		
原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...
 
随机推荐
- mysql 如何用命令清除表数据,让表数据索引是从0开始呢?
			
truncate MYTABLE 这样就可以了 其实这个命令就相当于删除表再建 所有的数据都还原 可以使用工具来完成这个操作 右键单击要操作的表,选择Turncale Table 执行查询语句,数据就 ...
 - 微信小程序video
			
1.video是原生组件原生组件的层级是最高的,想要覆盖在video上,只能用cover-view 和 cover-image 组件,这2个可以无限嵌套.适用场景:给视频加标题: 2.检测video播 ...
 - session_start(): open(/var/lib/php/session/sess_tlrp3cpro7gun9uhno8n6futr3, O_RDWR)
			
在安装一个网站,结果连接上数据库了但是一直报错.下面贴报错内容和图 错误提示 系统:PHP (Linux) 错误类型:WARNING 内容:session_start(): open(/) 错误位置: ...
 - CF1148D-Dirty Deeds Done Dirt Cheap
			
这轮CF怎么充满了替身啊233(这是场只有替身使者才能看见的比赛) 题解可以看官方的 这里就是记录下自己当初是怎么没做上的233 忽视掉了分类后pair本身就会带有的性质(a<b or a> ...
 - 使用Robo 3T 软件管理MongoDB数据库如何执行命令行shell
			
比如使用命令行的方式查看数据库runoobdb中的sites集合(数据表)中的所有数据 1.在连接名的地方鼠标右键选择“open shell” 2.在出现的shell窗口中输入一下命令行,然后按ctr ...
 - isinstance、issubclass、反射
			
一.isinstance.issubclass # isinstance(obj, cls) 检查obj是否是cls的对象 class A(object):pass a = A() print(isi ...
 - Problem 63
			
Problem 63 https://projecteuler.net/problem=63 Powerful digit counts The 5-digit number, 16807=75, i ...
 - BUPT2017 wintertraining(15) #9
			
下面不再说明题意了请自行读题,直接放contest链接. https://vjudge.net/contest/151607 A.考虑当火车隔k站一停时 区间长度 >= k 的纪念品一定能买到 ...
 - web开发如何使用高德地图API(三)点击热点打开信息窗体
			
说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...
 - Sencha Toucha 2.1 文件上传
			
javascript代码: Ext.onReady(function() { Ext.create('Ext.form.Panel', { title: 'Upload a Photo', width ...