测试工具 mocha 用法小结

作者:vienwu

这篇是前段时间总结给自己备忘的,要用到的工具实在太多,没法一一记住。

个人感觉,作为一个测试的工具,只要会用就好了。

所以这里稍微做了一些修改,简单介绍一下常用的写法和命令,其次将之前的一些示例改成javascript版本,方便没有coffee基础的同学浏览。

介绍

mocha是一个拥有丰富功能的javascript测试框架,可以用于nodejs和浏览器。支持同步/异步测试用例,有多种报告形式。

官网介绍了很多的特性,个人感觉实用的就几点:

一个是nodejs和浏览器都可以用,不用再记那么多奇怪的api和写法了。

其次是编写同步/异步测试用例非常简单。

安装

$ npm install mocha -g

成功安装后就可以使用mocha命令了。

使用

运行./test/目录所有js

$ mocha

指定js文件

$ mocha xxx.js

监听文件变化

$ mocha xxx.js -w

指定coffee编译

for coffescript 1.6

$ mocha --compilers coffee:coffee-script test.coffee

for coffeescript 1.7+

$ mocha --compilers coffee:coffee-script/register test.coffee

浏览器的使用

$ mocha init <path>

指定一个目录,初始化一个用于浏览器的测试目录。执行后会在该目录生成index.htmlmocha.jsmocha.css和一个空白的test.js,可以直接在test.js中添加测试用例。

当然,也可以不敲命令直接复制引用mocha.js到html。

编写用例

常用的断言库都可以运行的很好。以下列出几个:

  • should.js BDD style shown throughout these docs.
  • chai expect() assert() and should style assertions
  • expect.js expect() style assertions
  • better-assert c-style self.documenting assert()

个人一般用nodejs自带的assert(方便不用安装)和should.js(功能强大很好用)

同步代码

require('should');
describe('测试数组Array',function(){
    describe('测试#indexOf方法',function(){
        it('不存在的元素会返回-1',function(){
            [1,2,3].indexOf(5).should.equal(-1);
            [1,2,3].indexOf(0).should.equal(-1);
        });
    });
});

异步代码

写法和同步代码类似,只是在it()的第二个参数的函数参数中传入一个done函数,用于控制异步函数的结束。

describe('测试User模块',function(){
    describe('测试#save()方法',function(){
        it('此处不应出错',function(done){
            var user = new User({name:'董小姐'});
            user.save(function(err){
                assert.ifError(err);
                done();
            });
        });
    });
});

其中,done()函数也可以接受一个error作为参数,所以上面其实可以简化为:

describe('测试User模块',function(){
    describe('测试#save()方法',function(){
        it('此处不应出错',function(done){
            var user = new User({name:'董大爷'});
            user.save(done);
        });
    });
});

hooks

mocha支持多种体位的hook,用法做一些或者干掉一些东东。如下:

  • before() 开始前1次
  • after() 结束后做1次
  • beforeEach() 开始前每次都做
  • afterEach() 每次结束后都做

所有的hooks都可以接收done()参数用于异步结束。甚至可以不使用done参数,而是直接返回一个promise对象,例如:

beforeEach(function(){
  return db.clear().then(function() {
    return db.save([tobi, loki, jane]);
  });
});

不过建议还是加上done参数,看起来清晰,习惯统一。

BDD和TDD

现在一般都用BDD。

BDD interface 提供了 describe(),context(),it(),before(),after(),beforeEach(),afterEach()。

context()和describe()没区别。

TDD interface 提供了suite(),test(),suiteSetup(),suiteTeardown(),setup(),teardown()

其他常用

-b 参数 只显示第一个异常

一般测试用例多的时候非常有用,不然某个接口变化全屏报错就悲剧了

-t 参数 指定单个测试用例的超时时间

默认单个测试用例超时时间为2000ms。

命令行中添加为全局的设置,也可以在测试用例内部调用timeout()方法单独控制。

ok,介绍到此就结束了,最后附上其他命令速查

其他命令行

  • -h,—help
  • -V,—version
  • -A,—async-only 强制为异步模式,即所有测试必须包含一个done()回调。
  • -c,—colors
  • -C,—no-colors
  • -G,—growl
  • -O,—reporter-options \
  • -R,—reporter \
  • -S,—sort
  • -b,—bail
  • -d,—debug
  • -g,—grep \
  • -f,—fgrep \
  • -gc,—expose-gc
  • -i,—invert
  • -r,—require \
  • -s,—slow \
  • -t,—timeout \ 设置超时,默认为2000ms,如果是长时间运算需要设置。
  • -u,—ui \
  • -w,—watch 监视文件变化
  • —check-leaks
  • —compilers \:\,… 使用指定模块编译文件,经常会用到编译coffee
  • —debug-brak
  • —globals \
  • —inline-diffs
  • —interfaces
  • —no-deprecation
  • —no-exit
  • —no-timeouts
  • —opts \
  • —prof
  • —recursive
  • —reporters
  • —throw-deprecation
  • —trace
  • —trace-deprecation
  • —watch-extensions \,…
  • —delay

原文链接:http://ivweb.io/topic/554a0ed19615e51472f38acc

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

2.[Yii]创建与设置默认控制器及载入模板

1.创建控制器与访问 class IndexController extends Controller { //访问 index.php?r=index...

3215
来自专栏蓝天

Protocol Buffers十分钟上手:入门示例

Protocol Buffers是Google出品并开源的语言和平台均中立的数据序列化和反序列化工具,官方支持C++/Java和Python三大语言,另外有大量...

622
来自专栏从零开始学自动化测试

pytest文档5-fixture之conftest.py

前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用...

753
来自专栏IMWeb前端团队

测试工具mocha用法小结

这篇是前段时间总结给自己备忘的,要用到的工具实在太多,没法一一记住。 个人感觉,作为一个测试的工具,只要会用就好了。 所以这里稍微做了一些修改,简单介绍一下常用...

2500
来自专栏北京马哥教育

浅谈Python Django框架

Python下有多款不同的 Web 框架,Django是最有代表性的一种。许多成功的网站和APP都基于Django。

832
来自专栏python学习之旅

Python网络爬虫笔记(一):网页抓取方式和LXML示例

(一)   三种网页抓取方法 1、    正则表达式: 模块使用C语言编写,速度快,但是很脆弱,可能网页更新后就不能用了。 2、    Beautiful So...

4004
来自专栏coder修行路

jS正则和WEB框架Django的入门

JS正则 -test 判断字符串是否符合规定的正则表达式 -exec 获取匹配的数据 test的例子: ? 从上述的例子我们可以看出,如果rep.test匹配到...

1766
来自专栏C++

python笔记:#002#第一个python程序

924
来自专栏Java编程技术

SpringBoot之spring-boot-load模块

正常情况下classloader只能找到jar里面当前目录或者文件类里面的*.class文件。为了能够加载嵌套jar里面的资源之前都是把嵌套jar里面的clas...

642
来自专栏PPV课数据科学社区

PyCharm 2016.3 公开预览版发布

PyCharm 2016.3 公开预览版发布了,PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比...

2394

扫码关注云+社区