【问题标题】:Jest Unit Testing in Docker ContainerDocker 容器中的 Jest 单元测试
【发布时间】:2022-01-16 02:51:29
【问题描述】:

我正在尝试将我的测试移动到我的 docker 映像构建阶段,但它似乎完全忽略了我的测试构建,并且在我构建映像时跳过它。

可能是什么问题?

# Base build 
FROM node:16.13 AS build
RUN mkdir /app
WORKDIR /app
ADD package*.json ./
RUN npm i -g npm@6.14.15
RUN npm i --production
COPY . .
RUN npm run build

# Clean
RUN npm prune --production
RUN npm install -g node-prune
RUN node-prune

# Test
FROM build AS test
RUN npm i -g npm@6.14.15
RUN npm i -D jest typescript
RUN npm i -D ts-jest @types/jest
RUN npm i -D @shelf/jest-mongodb
RUN npx jest

# Release
FROM node:16.13-alpine
RUN mkdir /app
WORKDIR /app
COPY --from=build /app/dist ./dist/
COPY --from=build /app/node_modules ./node_modules/
COPY --from=build /app/package.json ./
CMD npm start

您可以在上方看到我的Dockerfile,我正在那里准备构建,然后计划进行测试,然后,我正在制作我的发布图像。

我已经玩了好几个小时了;我清除了缓存,对文件中的顺序进行了调整)但没有帮助。它一直忽略我的测试版本。

欢迎任何关于我的 Dockerfile 的提示

【问题讨论】:

    标签: docker unit-testing jestjs dockerfile


    【解决方案1】:

    Docker 内部有两个不同的系统来构建镜像。较新的 Dockers 默认使用名为 BuildKit 的较新系统。主要区别之一是两个系统处理多阶段构建的方式:旧系统只运行所有构建阶段直到结束,但 BuildKit 发现最后阶段 COPY --from=build 但不使用任何来自test 阶段,跳过它。

    我不会在 Dockerfile(因为它不会产生可运行的工件)或 Docker 中运行这些测试。在构建 Docker 映像之前,我可能会在基于主机的开发环境中运行它们:

    # On the host
    npm install    # devDependencies include all test dependencies
    
    npm run tests  # locally
    # repeat until the tests pass (without involving a container)
    
    # Build the image _after_ the tests pass
    docker build -t myapp .
    

    docker build 也有a --target option to name a specific stage,所以你可以告诉 Docker “构建测试映像”,但你只需立即删除它。这就是我认为 Docker 作为测试运行者不太有意义的地方。

    docker build -t delete-me --target test
    docker build -t my-app .
    docker rmi delete-me
    

    您的 Dockerfile 还安装了一个 MongoDB 测试助手。如果测试依赖于实时数据库而不是模拟实现,那么这里要注意的另一件事是 Dockerfile 中的代码永远无法连接到其他容器。在这种情况下,您必须从其他地方运行此测试。

    【讨论】:

    • 谢谢!我之所以想将测试移到那里,是因为我想确保代码在部署之前不会在任何地方损坏。我通常在 CircleCI 中进行测试。但是这一次我认为在相同的环境中进行测试会更好。我认为这是一种广泛使用的做法。但是在您的 cmets 之后,我可以看到这不是一个好主意。关于需要数据库的 API 测试,我会使用什么建议?
    • 对于那种集成测试,您需要构建映像并将其部署到某个环境后运行它。由于您只与进程的 API 对话,因此测试不需要特别从容器启动,甚至不需要与服务器使用相同的语言。我在这里的一个具体建议是确保您正在部署您实际测试过的映像;不要构建特殊的仅测试映像,也不要使用绑定挂载覆盖映像代码。
    猜你喜欢
    • 2023-03-21
    • 2018-12-16
    • 2020-08-04
    • 2022-01-02
    • 2017-10-30
    • 2018-07-28
    • 1970-01-01
    • 2018-12-24
    • 2022-01-06
    相关资源
    最近更新 更多