使用Docker创建JavaScript自动测试环境
总结
虽然我做编程的时间变得很少,但我非常喜欢编程,所以我在图书馆借了这本书。
前端开发的测试入门 – 亚马逊 | Kindle
对于自动化的单元测试,我觉得很容易理解并且学到了很多东西。
我认为如果能够在Docker容器中轻松地部署测试环境,那就太棒了。所以我尝试用Docker容器来创建JavaScript的单元测试环境。
我们已经引入了jest(https://jestjs.io/ja/)作为单元测试工具。
可以最终做到的事情
在Docker容器中建立JavaScript应用程序的单元测试环境(使用Jest)。
以下是在该容器中执行的UNIT测试通过的结果。
root@edf58454f2f8:/usr/src/app# npm test
> docker_web_app@1.0.0 test
> jest
PASS ./sum.test.js
✓ adds 1 + 2 to equal 3 (1 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.208 s
Ran all test suites.
前提 tí)
需要确认电脑已安装了Docker Desktop。
使用了基于node.js版本20的环境。
三种不同类型的Node.js Docker镜像
在中国有三种类型的Docker镜像是专为Node.js而设计的。建议在本次使用中使用默认的镜像node:<版本>。
节点:<版本>
这是一个事实上的镜像。如果你不知道自己的需求是什么,可能最好使用这个。它被设计成可用作一次性容器(挂载源代码并启动容器以运行应用程序),也可作为构建其他镜像的基础。
节点:<版本>-alpine
这个镜像基于受欢迎的Alpine Linux项目,该项目提供了官方镜像。由于Alpine Linux比大多数基于发行版的镜像(约5MB)更小,所以通常镜像更加精简。
节点:<版本>-slim
这个镜像不包含默认标签中的通用包,只包含运行所需的最小包。强烈建议在使用此仓库的默认镜像时,除非在空间受限的环境中工作,否则只部署镜像。
(引用自:https://hub.docker.com/_/node)
在这里,关于节点图像的选择也有相同的意见。
在近年,slim镜像的大小已经减小到150MB,且在各种情况下运行表现最佳。Alpine是一个非常小的容器发行版,最小的node镜像仅为75MB。然而,如果需要更换apt到apk包管理器,或需要适应特定情况,或需要避免受到安全扫描的限制,建议大多数情况下不要选择node:alpine。
完成时的目录结构
可以在任意位置创建一个项目文件夹(YOUR-PROJECT-FOLDER),然后继续创建以下文件。
你的项目文件夹
├package.json —–用于管理npm包的配置文件
├server.js —–Web应用程序
├Dockerfile —–Docker文件
├.dockerignore —–不包含在docker镜像中的文件
├sum.js —–示例代码
└sum.test.js —–用于测试示例代码(sum.js)的单元测试代码
所有的文件 (gè
package.json 文件
我正在编辑位于 https://nodejs.org/ja/docs/guides/nodejs-docker-webapp 的 package.json 文件,并在 “scripts” 中添加 “jest”。
{
"name": "docker_web_app",
"version": "1.0.0",
"description": "Node.js + jest on Docker",
"author": "First Last <first.last@example.com>",
"main": "server.js",
"scripts": {
"start": "node server.js",
"test": "jest"
},
"dependencies": {
"express": "^4.16.1"
},
"devDependencies": {
"jest": "^29.7.0"
}
}
Dockerfile的意思是
只需要一种选择,以下是本地中文的释义:
通过修改位于https://nodejs.org/ja/docs/guides/nodejs-docker-webapp的Dockerfile文件进行编辑。
npm install --save-dev jest
如果追加的话,整体定义如下。
#FROM node:12
FROM node:20
# アプリケーションディレクトリを作成する
WORKDIR /usr/src/app
# アプリケーションの依存関係をインストールする
# ワイルドカードを使用して、package.json と package-lock.json の両方が確実にコピーされるようにします。
# 可能であれば (npm@5+)
COPY package*.json ./
RUN npm install && \
npm install --save-dev jest
# 本番用にコードを作成している場合
# RUN npm install --only=production
# アプリケーションのソースをバンドルする
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
范例.js
我准备了一些示例代码。这次我选择了简单的加法。
function sum(a, b) {
return a + b;
}
module.exports = sum;
请为以下内容提供一个中文的原生语言解释:
“sample.test.js”
我将创建一个名为sample.js的测试代码。这是一个评估样本代码结果是否等于「1+2=3」的单元测试。
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
.dockerignore 文件
这个不是必需的,但我想在docker中忽略这个文件。
node_modules
npm-debug.log
构建Docker映像
进入项目文件夹(以下称为docker-webapp-jest),使用创建的Dockerfile构建Docker镜像。构建命令为,
docker build . -t ryu/node-web-app
作为选项(-t),指定格式为名称:标签,但只找到名称,因此选择了ryu/node-web-app。
docker-webapp-jest % docker build . -t ryu/node-web-app
[+] Building 74.3s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/node:12 7.7s
=> [1/5] FROM docker.io/library/node:12@sha256:01627afeb110b3054ba4a1405541ca095c8bfca1cb6f2be9479c767a2711879e 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 688B 0.0s
=> CACHED [2/5] WORKDIR /usr/src/app 0.0s
=> [3/5] COPY package*.json ./ 0.0s
=> [4/5] RUN npm install && npm install --save-dev jest 65.9s
=> [5/5] COPY . . 0.0s
=> exporting to image 0.5s
=> => exporting layers 0.5s
=> => writing image sha256:9b90a3ebd100cb3bea82c80b97caa4f8b5d3238bd7711c87004328bb1a0169fe 0.0s
=> => naming to docker.io/ryu/node-web-app
启动Docker
使用构建的镜像启动Docker容器。
将外部端口49161转发到容器内的8080端口。
docker-webapp-jest % % docker run -p 49161:8080 -d ryu/node-web-app
使用docker ps命令来确认Docker容器的启动情况。如果状态为UP,则表示OK。
docker-webapp-jest %docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77f093b9b8ab ryu/node-web-app "docker-entrypoint.s…" 34 seconds ago Up 32 seconds 0.0.0.0:49161->8080/tcp, :::49161->8080/tcp elegant_dirac
使用curl命令可以确认能够从外部访问到容器内的Web应用程序。
docker-webapp-jest % curl -i localhost:49161
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 11
ETag: W/"b-Ck1VqNd45QIvq3AZd8XYQLvEhtA"
Date: Sat, 07 Oct 2023 04:30:39 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Hello World%
你好,世界已经被输出,并且可以通过网络进行访问。
进入Docker容器
使用docker exec命令进入Docker容器内部。使用-it选项并指定容器ID(此示例中为77f093b9b8ab)。
在容器内部使用npm test命令执行jest。
docker-webapp-jest % docker exec -it 77f093b9b8ab /bin/bash
root@77f093b9b8ab:/usr/src/app# npm test
> docker_web_app@1.0.0 test
> jest
PASS ./sum.test.js
✓ adds 1 + 2 to equal 3 (1 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.208 s
Ran all test suites.
我成功地执行了UNIT测试,并没有遇到任何问题。