# 测试

项目集成了 [aone 实验室](https://aone.alibaba-inc.com/pipeline/build/info?id=728994) 集成测试。aone会在每次代码合并和提交都会走一次 `npm run ci`。
项目基于 Karma + Mocha + webpack 支持自动在浏览器环境下运行所有测试用例。它会在运行命令后跑完所有的测试 case 然后输出测试的通过数据。而 aone 实验室会在每次代码变动提交后触发对应的 npm 命令，在 docker 环境下部署项目并运行这些测试命令。



### 撰写单元测试

项目基于 [Mocha](https://github.com/mochajs/mocha)，mocha 是一个简单、灵活有趣的 JavaScript 测试框架，用于 Node.js 和浏览器上的 JavaScript 应用测试。我们引入了 [chai](http://chaijs.com/) 作为断言，你可以在[ 文档 ](http://chaijs.com/api/)里查看如何实现基本的断言和比对。
我们需要对项目的某个模块进行测试，你需要引入该模块，然后进行模块内的方法做出断言。

比如我们需要对 lib/dom.js 做测试。

``` js
import dom from '../../../src/libs/dom';
import jsdom from 'mocha-jsdom';
import { expect } from 'chai';

describe('player base class unit tests', () => {
    // 如果需要引入 dom 环境，则该项是必须的
    jsdom();
    const el = document.createElement('DIV');
    el.className = 'class1';
    it('dom hasClass', () => {
        expect(dom.hasClass(el, 'class1')).to.equal(true);
    });
    it('dom toggle', () => {
        dom.toggle(el, 'test');
        expect(dom.hasClass(el, 'test')).to.equal(true);
    });
    it('remove class', () => {
        dom.removeClass(el, 'test');
        expect(dom.hasClass(el, 'test')).to.equal(false);
    });
});

```
现在你可以自己在 /test/specs 里面添加对对应模块的测试用例了。比如 `test/specs/service/base-service.test.js`。撰写完成后输入 `npm run test` 进行对自己的测试用例进行确认。

``` js
import BaseService from '../../../src/service/base-service';
import { expect } from 'chai';
import config from '../config'

describe('player base service test', () => {
    const baseService = new BaseService(config['global']);
    it('set id change global', () => {
        baseService.id = 'newid';
        expect(typeof baseService._global.service['newid']).to.equal('object');
    });
});
```

如何写基本的 JavaScript Unit Test ，大家可以参阅 [unit-test-javascript-mocha-chai](https://www.sitepoint.com/unit-test-javascript-mocha-chai/) 这篇文章。


### UI 测试

系统以及在实验室集成集团 [uirecorder](http://uirecorder.com/)。UI Recorder 是一款零成本UI自动化录制工具,支持所有用户行为: 键盘事件, 鼠标事件, alert, 文件上传, 拖放;支持丰富的断言类型: val,text,displayed,enabled,selected,attr,css;

本地测试需要先确保测试需要模块都已经安装，你也可以执行:

``` bash
tnpm install selenium-standalone resemblejs-node mochawesome-uirecorder mocha-parallel-tests jwebdriver --save-dev
```
然后你可以在本地运行 `npm run uitest` 进行对ui的测试。我们可以使用：

``` bash
uirecorder test/ui/player.test.js
```
进行测试case 的添加。




### 扩展阅读

+  [UI Recorder PC录制自动化手册](https://www.atatech.org/articles/68069)
