使用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测试,并没有遇到任何问题。

bannerAds