web前端测试框架
通用前端js测试框架
Mocha
Mocha 是一种可用于nodejs和浏览器测试的简单的,灵活的测试框架。(提供TDD, BDD, Qunit风格的写法)
安装
$ npm install -g mocha
$ npm install expect
开始使用
- 新建test目录
在目录下新建测试文件
sample1.spec.js
var expect = require('expect'); describe('Array', function(){ describe('indexOf()', function(){ it('查找的值不在数组中应该返回 -1', function(){ expect([1, 2, 3].indexOf(8)).toBe(-1); }) }) })
回到test所在目录,执行:
$ mocha
Array
indexOf()
✓ 查找的值不在数组中应该返回 -1
1 passing (17ms)
稍作改动,改成ES6写法:
import expect from 'expect';
describe('Array', () => {
describe('indexOf()', () => {
it('查找的值不在数组中应该返回 -1', () => {
expect([1, 2, 3].indexOf(8)).toBe(-1);
})
})
})
执行,得到结果:
$ mocha
/Users/guopeng/disk/nodes/test-sample/public/test/sample2.spec.js:8
import expect from 'expect';
^^^^^^
SyntaxError: Unexpected reserved word
错误:import
不是有效的保留字, 说明mocha不认识ES6的语法
使Mocha可以测试ES6代码
如果用mocha测试ES6写的代码,在测试之前需要先进行Babel转码 先安装依赖包:
- babel-core
- babel-preset-es2015
在根目录下创建文件:
.babelrc
内容:
{
"presets": [ "es2015" ]
}
然后使用--compilers参数指定测试脚本的转码器
$ mocha --compilers js:babel-core/register
上面命令需要mocha和babel-core都装在全局中,如果只是局部的使用:
$ ../node_modules/mocha/bin/mocha --compilers js:babel-core/register
React Components测试
React组件同样需要Babel转码, 安装依赖项:
- react
- babel-preset-react
修改.babelrc
的配置项
{
"presets": [ "es2015","react" ]
}
以上只是对jsx语法进行了转码, React 虚拟Dom的特性可以允许我们在不需要浏览器的环境下进行测试, 我们只需要对 React 浅渲染的结构进行测试即可认为能够正常渲染。
利用浅渲染需要先安装 React Test Utilities
npm install --save-dev react-addons-test-utils
示例
import React, { Component } from 'react';
class Card extends Component {
render() {
return (
<div className="container">
<h1>搜索链接</h1>
<a href="www.baidu.com">百度</a>
</div>
)
}
}
export default Card;
可以这样测:
import expect from 'expect'
import React from 'react';
import TestUtils from 'react-addons-test-utils'
import Card from '../src/Card'
describe('Card Components', () => {
let renderer = TestUtils.createRenderer()
renderer.render(<Card />)
let output = renderer.getRenderOutput();
it('应该正确的渲染', () => {
expect(output.props.className).toBe('container');
let [h1, a] = output.props.children;
expect(h1.type).toBe('h1');
expect(h1.props.children).toBe('搜索链接')
expect(a.props.href).toBe('www.baidu.com');
})
})
我们看下output是个什么东西:
{ '$$typeof': Symbol(react.element),
type: 'div',
key: null,
ref: null,
props: { className: 'container', children: [ [Object], [Object] ] },
_owner: null,
_store: {} }
mocha命令行参数
--compilers <ext>:<module>,...
指定给定的module(s)来编译文件,如:mocha --compilers js:babel-core/register ,表示在测试之前先用babel-core/register
模块处理一下.js
文件--require <name>
加载指定的module--recursive
运行mocha命令时,默认只执行test目录下的第一层文件,再深层次的子目录不会执行,如果执行这些深层次目录的用例,只需指定recursive即可