atian25 / blog

天猪部落阁 http://atian25.github.io
1.59k stars 107 forks source link

No API is the best API - 抛弃 should/expect/chai 吧 #16

Open atian25 opened 7 years ago

atian25 commented 7 years ago

如果你的 node 没有写单元测试,那可以跳过本文了。

1. 缘起

在我们日常的单元测试中,常用的断言库有:

user.should.have.property('name', 'tz');
user.enabled.should.ok;

expect(5).to.be.a('number');
expect(window).not.to.be.an(Image);

存在什么问题呢?

require('should');
const expect = require('expect.js');
const assert = require('assert');

describe('test/showcase.test.js', () => {
  const arr = [ 1, 2, 3 ];

  it('should.js', () => {
    arr[1].should.eql(10);
  });

  it('expect.js', () => {
    expect(arr[1]).to.eql(10);
  });

  it('assert', () => {
    // 用原生的话, 得到的提示更是一脸懵逼
    assert(arr[1] === 10);
  });
});

// output:
1) test/showcase.test.js should.js:
     AssertionError: expected 2 to equal 10
     ...
2) test/showcase.test.js expect.js:
     Error: expected 2 to sort of equal 10
     ...
3) test/showcase.test.js assert:
     AssertionError: false == true
     ...

2. 曙光

egg 的开发中, 我们发现了不一样的它:

Power Assert in JavaScript.

Provides descriptive assertion messages through standard assert interface.

No API is the best API.

https://github.com/power-assert-js/power-assert

简单的说,它的优点是:

const assert = require('power-assert');

describe('test/showcase.test.js', () => {
  const arr = [ 1, 2, 3 ];

  it('power-assert', () => {
    assert(arr[1] === 10);
  });
});

// output:
4) test/showcase.test.js power-assert:

      AssertionError:   # test/showcase.test.js:6

  assert(arr[1] === 10)
         |  |   |
         |  2   false
         [1,2,3]

  [number] 10
  => 10
  [number] arr[1]
  => 2

image

3. 使用

在线尝试:https://azu.github.io/power-assert-demo/

安装依赖:

$ npm i mocha power-assert intelli-espower-loader --save-dev

配置 npm scripts

{
  "scripts": {
    "test": "mocha -r intelli-espower-loader test/**/*.test.js",
  },
  "devDependencies": {
    "power-assert": "^1.4.2",
    "intelli-espower-loader": "^1.0.1",
  }
}

编写测试:

// 简单的 require, 使用者无感知
// 下面的代码没写错, 无需 `require('power-assert')`, loader 会自动替换
const assert = require('assert');

describe('test/showcase.test.js', () => {
  const arr = [ 1, 2, 3 ];

  it('power-assert', () => {
    // 完全兼容 node 原生的 assert API, 直接自由使用
    assert(arr[1] === 10);
  });
});

执行测试:

$ npm test

4. 其他

5. 补充

fengmk2 commented 7 years ago

报错体验实在太好,有时候都忍不住写错代码来体验一把。

Clarence-pan commented 7 years ago

牛x,试了一把,果然厉害

DavidCai1111 commented 7 years ago

这报错体验好到泪目~👍

mlyknown commented 7 years ago

666

joyeecheung commented 7 years ago

从其他库转过来的要小心 deepEqual 和 deepStrictEqual 的区别……(好多库的 deep equal 其实是 deepStrictEqual) https://github.com/nodejs/node/issues/10258

atian25 commented 7 years ago

补充下, 无需 require('power-assert'), loader 会自动替换

也就是说, 只需要 require('assert'); , 使用者完全无感知

atian25 commented 7 years ago

同时, 如果你嫌麻烦的话, 直接用我们的 egg-bin

直接在 scripts 里面加入即可:

{
  "scripts": {
    "test": "egg-bin test",
    "cov": "egg-bin cov"
  },
  "devDependencies": {
    "egg-bin": "^1.9.0"
  }
}
kazupon commented 7 years ago

FYI: official released

oychao commented 7 years ago

有没有gulp的用法示例~

atian25 commented 7 years ago

@oychao https://github.com/power-assert-js/gulp-espower

oychao commented 7 years ago

已经实现了,刚找到这一篇博客,作为一个日常日本IT黑,看到一个如此优秀的JS库的作者居然是个日本人,http://efcl.info/2014/0406/res3809/

oychao commented 7 years ago

太舒服,专门写了半个小时错误,就为了看报错结果~

kaelzhang commented 7 years ago

刚开始用 ava 就发现,握草好鸟,这是什么鬼,发现原来是 power-assert

hyj1991 commented 7 years ago

这个大赞啊!

atian25 commented 7 years ago

推荐阅读: https://eggjs.org/zh-cn/core/unittest.html

mosaic101 commented 7 years ago

赞!好东西,必须用起来

huangjihua commented 7 years ago

真是好东西,赞

cncoder commented 7 years ago

junit有就好了Hhhh

snowliy commented 7 years ago

什么时候支持Async/Await呢?

atian25 commented 7 years ago

@Chalin-Shi 支持的啊

snowliy commented 7 years ago

@atian25 我上午测试了下,报错,我以为不支持呢。难道是因为不支持外部import的文件吗?还是必须要用node version > 7.6.0,或者babel呢。

atian25 commented 7 years ago
snowliy commented 7 years ago

@atian25 谢谢你。我本地node用的是6.10版本,应该是这个原因了,然后我准备测试时用7.6+,部署是用6.10,不知道这样好不好。。。

snowliy commented 7 years ago

目前准备报koa2的项目,转到eggjs,感觉文档好全,很不错,貌似next版本才支持Async/Await是吗?

atian25 commented 7 years ago
crycime commented 5 years ago

babel配合使用不支持怎么解决哈

atian25 commented 5 years ago

babel配合使用不支持怎么解决哈

https://github.com/power-assert-js/power-assert

看官方 README,有 babel 插件

crycime commented 5 years ago

巴贝尔配合使用不支持怎么解决哈

解决了

YuMao233 commented 5 years ago

确实,赞同 "没有API就是最好的API" 这句话。