使用Docker跨Node.js版本进行测试

问题:测试

NAN是一个项目,旨在帮助构建本机(C ++)Node.js附加组件,同时保持与Node版本0.8及更高版本的Node和V8的兼容性。 V8正在进行重大的内部更改,这使得附加开发非常困难。 NAN的目的是抽象这种痛苦。 NAN不必为您的代码在Node / V8版本之间保持兼容而做,而是为您做到这一点,这不是简单的任务。 这意味着我们必须确保对NAN进行测试,并与其声称支持的所有版本兼容。 这不是一件小事!

Travis CI可以对此有所帮助。 甚至可以在正式支持的版本之外使用nvm跨不同版本的Node.js进行测试。 我们已经与NAN一起尝试了此方法,但没有获得很大的成功。 理想情况下,您最好选择Node版本,但是Travis 很难跟上。 此外,由于npm安装问题,旧版本的Node.js附带的历史性npm错误往往会导致较高的故障率。 出于这个原因,我们甚至不将Travis徽章发布在NAN README上,因为它根本无法使用。

Travis的另一个问题是它是CI解决方案,而不是适当的测试解决方案。 即使它运行良好,它在开发过程中并没有真正帮助,因为您需要快速反馈您的代码正在目标平台上工作(这就是为什么我更喜欢后端开发而不是前端开发的原因之一!)

解决方案:Docker

输入DockerDNT 。 Docker是一种工具,可简化Linux容器的使用,以创建轻量,隔离的计算“实例”。 Solaris及其变体以“区域”的形式多年来一直具有此功能,但是对于Linux来说这是一个相对较新的概念,而Docker使整个过程变得更加友好。 Docker相对简单,这意味着近几个月来Linux容器领域的活动非常惊人,它几乎在一夜之间已经成为一个庞大的生态系统。

DNT:Docker节点测试器

Docker Node Test或DNT是一个非常简单的实用程序,其中包含两个用于处理Docker和Node.js的工具。 一种工具可以帮助您设置用于测试的容器,另一种工具可以在这些容器中运行项目的测试。

DNT包含一个setup-dnt脚本,该脚本设置了运行Node.js应用程序所需的最基本的Docker映像。 它首先创建一个名为dev_base的映像,该映像使用默认的Docker“ ubuntu”映像,并添加编译和安装Node.js所需的构建工具。

接下来,它创建一个node_dev映像,其中包含Node.js 源存储库的完整副本。 最后,它将创建要运行的测试所需的一系列图像。 对于每个Node版本,它将创建一个已安装Node并准备使用的映像。

设置项目.dntrc在项目的根目录中创建.dntrc文件即可。 此配置文件设置一个NODE_VERSIONS变量,其中包含要测试的所有Node版本的列表。 此列表可以包含“主”文件,以测试Node存储库中的最新代码。 您还使用设置,编译和执行测试所需的一系列命令来设置TEST_CMD变量。 可以对.dntrc文件运行setup-dnt .dntrc命令,以确保已准备好适当的Docker映像。 然后,可以使用dnt命令针对您指定的所有Node版本执行测试。

由于Docker容器是完全隔离的,因此DNT可以并行运行测试,只要机器具有资源即可。 默认值是使用计算机上的内核数作为并发级别,但是如果这不适用于您要运行的测试类型,则可以配置它。

尽管这是设置过程中的手动步骤,但也可以自定义基础测试映像以包括项目所需的其他外部工具和库。

当前,DNT旨在通过将最后一行读为“ ok”或“ not ok”来解析TAP测试输出,以在命令行上报告测试状态。 它是可配置的,但你需要提供一个命令,将改变测试输出到任何一个“OK”或“不正常”( sed救援?)。 现成的Mocha TAP报告程序的非标准输出也受支持。

当前用途

我的主要用例是测试NAN。 能够在编码时针对所有不同的V8和Node API进行测试非常有帮助,尤其是当测试运行如此之快时! 我的NAN .dntrc文件针对master进行了测试,自0.11.4以来,许多0.11版本(NAN明显不支持0.11.0至0.11.3,对于本机插件,0.11.11和0.11.12已完全破坏),并且0.10和0.8系列的最后五个版本。 目前总共有18个版本的Node,在我的计算机上,测试套件大约需要20秒才能完成所有这些版本。 NAN .dntrc文件如下所示。

NODE_VERSIONS="\
  master   \
  v0.11.10 \
  v0.11.9  \
  v0.11.8  \
  v0.11.7  \
  v0.11.6  \
  v0.11.5  \
  v0.11.4  \
  v0.10.26 \
  v0.10.25 \
  v0.10.24 \
  v0.10.23 \
  v0.10.22 \
  v0.8.26  \
  v0.8.25  \
  v0.8.24  \
  v0.8.23  \
  v0.8.22  \
"
OUTPUT_PREFIX="nan-"
TEST_CMD="\
  cd /dnt/test/ &&                                               \
  npm install &&                                                 \
  node_modules/.bin/node-gyp --nodedir /usr/src/node/ rebuild && \
  node_modules/.bin/tap js/*-test.js;                            \
"

接下来,我为DNT配置了LevelDOWN 。 LevelDOWN是原始的C ++绑定,它将LevelDB暴露给Node.js。 它的主要用途是LevelUP的后端。 需求要简单得多,因为测试仅需要进行编译并运行许多节点点击测试。 以下代码示例中显示了LevelDOWN .dntrc

NODE_VERSIONS="\
  master   \
  v0.11.10 \
  v0.11.9  \
  v0.10.26 \
  v0.10.25 \
  v0.8.26  \
"
OUTPUT_PREFIX="leveldown-"
TEST_CMD="\
  cd /dnt/ &&                                                    \
  npm install &&                                                 \
  node_modules/.bin/node-gyp --nodedir /usr/src/node/ rebuild && \
  node_modules/.bin/tap test/*-test.js;                          \
"

我使用DNT设置的另一个本机Node插件是我的libssh Node.js绑定 。 这有点复杂,因为在编译之前需要安装一些非标准的库。 我的.dntrc添加了一些额外的apt-get调味料来获取并安装这些软件包。 这意味着测试需要更长的时间,但这不是禁止的。 一种替代方法是配置node_dev基本映像,以将这些软件包添加到我所有的版本化映像中。 node-libssh .dntrc如下所示。

NODE_VERSIONS="master v0.11.10 v0.10.26"
OUTPUT_PREFIX="libssh-"
TEST_CMD="\
  apt-get install -y libkrb5-dev libssl-dev &&                           \
  cd /dnt/ &&                                                            \
  npm install &&                                                         \
  node_modules/.bin/node-gyp --nodedir /usr/src/node/ rebuild --debug && \
  node_modules/.bin/tap test/*-test.js --stderr;                         \
"

LevelUP不是本机加载项,但确实使用LevelDOWN,这需要进行编译。 对于DNT配置,我在npm install之前删除了node_modules/leveldown/ ,因此每次为每个新版本的Node都重新构建它。 LevelUP .dntrc如下所示:

NODE_VERSIONS="\
  master   \
  v0.11.10 \
  v0.11.9  \
  v0.10.26 \
  v0.10.25 \
  v0.8.26  \
"
OUTPUT_PREFIX="levelup-"
TEST_CMD="\
  cd /dnt/ &&                                                    \
  rm -rf node_modules/leveldown/ &&                              \
  npm install --nodedir=/usr/src/node &&                         \
  node_modules/.bin/tap test/*-test.js --stderr;                 \
#"

未来的工作

不难想象这构成了本地CI系统以及通用测试工具的基础。 这种速度甚至使您很想在每次git commit或什至每次保存时都运行测试。 New Relic Node.js代理团队已经在使用DNT的内部分支来完成非常复杂的工作,以针对许多版本的Node.js对其代理进行测试,并结合各种通用服务器框架的测试。

我一直很乐意为您提供帮助,如果您有特定的需求和实现新功能的技能,那么我很想听听您的意见。 我通常对开放源代码项目非常开放,并乐于添加添加有价值的东西的贡献者。

请参阅DNT GitHub存储库以获取安装和详细的使用说明。

Rod是今年5月1日至2日在墨尔本举行的《 Web Directions Code》的发言人之一。 使用折扣代码SITEPOINT可获得Web Directions Code门票的最低价格!

From: https://www.sitepoint.com/testing-across-node-js-versions-using-docker/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽量详细地介绍DockerNode.js应用程序的全过程操作,包括环境搭建、镜像创建以及容器运行等。请您按照以下步骤进行操作。 1. 环境搭建 首先,您需要在您的Linux系统上安装Docker。可以通过以下命令来安装: ``` sudo apt-get update sudo apt-get install docker.io ``` 安装完成后,可以通过以下命令来检查Docker版本: ``` docker --version ``` 接下来,您需要在Linux系统上安装Node.js。可以通过以下命令来安装: ``` sudo apt-get install nodejs sudo apt-get install npm ``` 安装完成后,可以通过以下命令来检查Node.js版本: ``` node -v ``` 2. 创建应用程序的镜像 接下来,您需要创建一个Dockerfile来构建您的应用程序的镜像。在您的项目根目录下创建一个名为Dockerfile的文件,并将以下代码复制粘贴到该文件中: ``` FROM node:12 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD [ "npm", "start" ] ``` 以上Dockerfile文件内容的含义是: - 从Docker Hub上拉取Node.js的12版本作为基础镜像 - 在/app目录下创建一个工作目录 - 复制package.json和package-lock.json到工作目录下 - 运行npm install安装项目依赖 - 复制项目所有文件到工作目录下 - 暴露3000端口 - 运行npm start命令启动应用程序 接下来,通过以下命令来构建应用程序的镜像: ``` sudo docker build -t <image-name> . ``` 其中,<image-name>是您想要给镜像取的名字,可以自定义。运行以上命令后,Docker会根据Dockerfile文件中的配置来构建应用程序的镜像。 3. 基于应用程序的镜像运行容器 镜像构建完成后,您可以使用以下命令来基于该镜像运行容器: ``` sudo docker run -p 3000:3000 -d <image-name> ``` 其中,-p参数用于将Docker容器内部的3000端口映射到主机的3000端口,-d参数用于在后台运行容器,<image-name>是您在构建镜像时指定的镜像名字。 运行以上命令后,您的应用程序就会在Docker容器中运行,并且可以通过浏览器访问http://localhost:3000来访问您的应用程序。 以上就是完整的DockerNode.js应用程序的全过程操作,希望可以对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值