8000 No API is the best API - 抛弃 should/expect/chai 吧 · Issue #16 · atian25/blog · GitHub
[go: up one dir, main page]

Skip to content
8000

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

Open

Description

@atian25

如果你的 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);

存在什么问题呢?

  • 复杂的 API,每次使用时,都需要去翻文档,用自然语言描述测试真的好么?
  • 经常怀疑人生,user.enabled.should.ok; 这句到底有没有执行? 还是只是取值?
  • 一脸懵逼,反馈信息不足,往往我们还需要加 log 再跑一次,如果在 ci 上看日志就懵逼了。
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

简单的说,它的优点是:

  • 没有 API 就是最好的 API,不需要任何记忆,只需 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. 其他

  • mocha 需要引入 intelli-espower-loader,主要是把代码转译,参见作者的 slide .
  • 转译之后, 你甚至完全无感知, require('assert') 都不需要改.
  • 因为转译,所以不能用原生的 assert 了, 否则会遇到如下错误

5. 补充

Activity

  1. changed the title [-]No API is the best API - 抛弃 should.js 吧[/-] [+]No API is the best API - 抛弃 should/expect/chai 吧[/+] on Dec 6, 2016
  2. fengmk2 commented on Dec 6, 2016

    @fengmk2

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

  3. Clarence-pan commented on Dec 7, 2016

    @Clarence-pan

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

  4. DavidCai1111 commented on Dec 7, 2016

    @DavidCai1111

    这报错体验好到泪目~👍

  5. mlyknown commented on Dec 8, 2016

    @mlyknown

    666

  6. joyeecheung commented on Dec 15, 2016

    @joyeecheung

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

  7. atian25 commented on Dec 15, 2016

    @atian25
    OwnerAuthor

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

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

  8. atian25 commented on Dec 15, 2016

    @atian25
    OwnerAuthor

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

    直接在 scripts 里面加入即可:

    {
      "scripts": {
        "test": "egg-bin test",
        "cov": "egg-bin cov"
      },
      "devDependencies": {
        "egg-bin": "^1.9.0"
      }
    }
  9. kazupon commented on Dec 15, 2016

    @kazupon

    FYI:
    official released

  10. oychao commented on Jan 8, 2017

    @oychao

    有没有gulp的用法示例~

  11. atian25 commented on Jan 8, 2017

    @atian25
    OwnerAuthor
  12. oychao commented on Jan 8, 2017

    @oychao

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

  13. oychao commented on Jan 8, 2017

    @oychao

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

  14. 2 remaining items

  15. atian25 commented on Mar 23, 2017

    @atian25
    OwnerAuthor
  16. mosaic101 commented on Mar 24, 2017

    @mosaic101

    赞!好东西,必须用起来

  17. huangjihua commented on Mar 28, 2017

    @huangjihua

    真是好东西,赞

  18. cncoder commented on Mar 28, 2017

    @cncoder

    junit有就好了Hhhh

  19. lexign commented on Apr 20, 2017

    @lexign

    什么时候支持Async/Await呢?

  20. atian25 commented on Apr 20, 2017

    @atian25
    OwnerAuthor

    @Chalin-Shi 支持的啊

  21. lexign commented on Apr 20, 2017

    @lexign

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

  22. atian25 commented on Apr 20, 2017

    @atian25
    OwnerAuthor
    • 这个跟 power-assert 没有关系
    • Node 7.6+ 才支持 async await
    • import 目前 Node 还不支持
    • babel 编译后的文件,不确定是否支持,可以看下官方站点,貌似有插件
    • 不建议后端代码用 babel 编译
  23. lexign commented on Apr 20, 2017

    @lexign

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

  24. lexign commented on Apr 20, 2017

    @lexign

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

  25. atian25 commented on Apr 20, 2017

    @atian25
    OwnerAuthor
    • 你可以在测试里面配置 6, 7 两个 runner
    • 1.0 版本支持 async await.
  26. crycime commented on Apr 23, 2019

    @crycime

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

  27. atian25 commented on Apr 23, 2019

    @atian25
    OwnerAuthor

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

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

    看官方 README,有 babel 插件

  28. crycime commented on Apr 23, 2019

    @crycime

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

    解决了

  29. yumao233 commented on Nov 2, 2019

    @yumao233

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      0