问题:测试
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
输入Docker和DNT 。 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/