通过JEST+Travis Ci+Coveralls为你的JS项目添加徽章

Banner(Cycle icon) is made by Robert Bjurshagen from the Noun Project | 标题图来源:Robert Bjurshagen

下午写了一个通过 currencyconverterapi.com api获取货币汇率的node组件 – Y2Nk4/node-currency-converter

突发奇想,既然这个组件是一个小项目,为什么不通过这次机会顺便试一下JEST的单元测试组件呢?

一、JEST单元测试

说做就做,先通过 npm 安装 jest。

npm install --save-dev jest

通过查阅 JEST 的文档,写了两个简单的小测试。

// https://github.com/Y2Nk4/node-currency-converter/blob/master/test/module.test.js

let CurrencyConverter = require('../index')

let converter = new CurrencyConverter('do-not-use-this-key')

test('converter.convert should return a float value', async () => {
    expect(typeof await converter.convert('USD', 'CNY', 1))
        .toBe('number')
})

test('converter.convert should return a object if isRaw set to be true', async () => {
    expect(typeof await converter.convert('USD', 'CNY', 1, true))
        .toBe('object')
})

粗略一看,我们可以得知上述代码调用了converter对象的convert方法,然后检测返回值是否是 float 或者是 object。若是,则通过单元测试。

为了方便运行,我们在 packages.json 中添加 test 脚本:

"scripts": {
    "test": "jest"
  }

这样,我们就可以通过 jest 指令或者 npm run test 指令来运行 jest 单元测试。

代码无误的话,我们就可以看到 Tests 中是 2 passed,则两个单元测试项目都通过了。

二、搭配 Travis Ci 自动检测代码是否通过单元测试

首先,如果我们没用过 Travis Ci 的话,我们需要先到 travis-ci.org 上通过 GitHub 登录来创建一个账号,然后授权 Travis Ci 获取我们 GitHub 上的项目。

什么是 CI ? CI 其实是 Continuous Integration (持续集成) 的缩写,它是可以用于自动化部署、测试、编译的工具。

我个人把他理解成一个生产线或者是一个工厂,当代码被commit到Git后,Git服务器会向这个工厂发送一个通知,然后这个工厂开始运作。不同的 CI 的底层实现可能不一样。以腾讯云的 Tencent Hub 为例,其本质上是在每次运作时产生一个 Docker 容器来实现不同的功能。这个工厂开始运作后,首先会通过 git clone 把代码下载下来,然后送入一个管道,执行用户预先设置好的一系列脚本(例如执行单元测试或编译代码),直到所有任务完成。

而在这里,我们要做的是把我们的JS项目进入这个管道,然后执行 JEST 的单元测试。

待 Travis Ci 成功获取我们 GitHub 上的项目后,我们需要在当前项目的根目录上创建 .travis.yml 文件,写入一下内容。

sudo: false
language: node_js
node_js:
  - '12'
branches:
  only:
    - master
cache:
  directories:
    - node_modules
before_install:
  - npm update
install:
  - npm install
script:
  - npm test

用过 Docker 的人可能就会觉得这个配置文件有点像 Docker 的启动配置文件。

首先,我们在 language 项中定义了我们代码的语言——node_js,且版本号为12。

branches项中,我们指定这个 CI 只允许master分支的代码送入管道。

before_install中,我们先跑一遍 npm update 来更新我们代码的依赖库,然后再install中运行 npm install 来安装我们代码的依赖库。

自此,我们的 Travis Ci 就初步配置好了,当我们每次 push 代码到 GitHub 时,Travis Ci 就会自动为我们跑一遍 JEST 的单元测试。

我们可以在 Travis Ci 中点击标题右侧的 build:passing 徽章,获取相应的 MarkDown代码,然后贴在我们的 README.md 中就可以在项目主页中显示这个徽章了。

三、通过 Coveralls 获取测试覆盖率

首先,我们同样需要到 Coveralls 官网上注册一个账号(可以通过GitHub oAuth登录),然后在 Coveralls 上找到我们的项目并启用。

Coveralls 提供了 node 的组件 node-coveralls,我们可以同样通过 npm 进行安装。

npm install coveralls --save-dev

值得一提的是,coveralls 支持与 jest 一同使用,我们仅需要简单地配置下即可。

首先在 packages.json 中天健 coveralls 脚本

"scripts": {
    "test": "jest",
    "coveralls": "jest --coverage && coveralls < coverage/lcov.info"
  }

然后为了搭配 Travis Ci 使用,我们需要在项目根目录上添加 .coveralls.yml 文件,并写入

service_name: travis-ci

然后修改 Travis Ci 的配置文件 .travis.yml,让其在构建时执行 coveralls。

sudo: false
language: node_js
node_js:
  - '12'
branches:
  only:
    - master
cache:
  directories:
    - node_modules
before_install:
  - npm update
install:
  - npm install
script:
  - npm test
  - npm run coveralls

自此,JEST、Travis Ci、Coveralls 就配置完成了,把最新的内容push到git上就应该可以看到 Travis Ci 在运行 JEST 单元测试了。

对了,我们可以在 Coveralls 的面板上获取徽章的 MarkDown 代码。

四、写在文末

其实 CI 不仅可以让代码自动化执行单元测试,还能做更多更酷的事情。

我以前的一个项目就使用腾讯云的 TencentHub 自动化部署项目。当我把代码更新到我自己的 GitLab 服务器后, TencentHub 就会按照我的配置文件自动构建一个 Node 环境的 Docker 容器,并在执行 npm install 和 npm update 等一系列操作后,生成一个 docker 镜像,并把这个镜像推送进镜像仓库,继而让 docker 集群中的线上环境自动分批更新。

我们当时项目是在腾讯云的 docker 集群上运行的,其中一个服务有 5-6 个 worker(docker容器) 组成了集群。通过 CI 自动部署的好处是,首先它可以省下人工去更新每个容器的时间。而且因为每次部署服务的操作略为繁琐,容易出错,让 CI 按照预设好的步骤执行则可以避免这些人为导致的错误。

集群架构的详细内容可以看我去年写的这篇文章:一个基于Thrift与Etcd实现的RPC服务注册与发现、服务集群的架构 (一)

0 条评论

昵称

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

与博主谈论人生经验?