【问题标题】:How to run Springboot application with Junit test with Docker File如何使用 Docker File 运行带有 Junit 测试的 Spring Boot 应用程序
【发布时间】:2020-07-05 16:39:15
【问题描述】:

现在我的 Dockerfile 如下:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

如果我想在启动 springboot 应用程序后运行一些 junit 测试怎么办?我正在使用 Maven 作为依赖项。

我应该把这些行放在哪里?

mvn test
mvn clean test
mvn clean compile test

或者我应该使用什么其他命令?

【问题讨论】:

  • 要运行单元测试,您应该编写将在期间执行的单元测试。在将应用程序打包到 jar 文件之前构建应用程序。这通常通过mvn clean test 完成。将您的单元测试放入src/test/java 并将它们命名为*Test.java。如果你有 spring boot 测试,你应该将它们命名为*IT.java,并将在集成测试阶段运行,可以通过mvn clean verify 执行。此外,您应该阅读有关构建生命周期的信息maven.apache.org/guides/introduction/…
  • 是的,我已经在正确的目录中编写了 junit 测试。但我想知道如何在 docker 文件中执行它
  • 如果要执行测试构建,为什么要启动实际应用程序?测试不能依赖于正在运行的应用程序,或者应用程序无法构建,或者我遗漏了什么?
  • 在 docker 文件中,您要么只打包您的最终应用程序,要么在 docker 容器中构建...问题是:您想做什么?
  • 我正在尝试将 springboot 应用程序推送到 travis ci,并在 travis ci 上运行 junit 测试。所以我需要在docker文件中定义命令

标签: java spring-boot docker maven dockerfile


【解决方案1】:

前提:即使解决方案针对您的具体情况,最好在目标 jar 构建阶段执行测试

要对 Dockerfile 执行测试,您可以执行以下操作之一:

  1. 同时复制 Dockerfile 上的源文件并执行 maven 测试命令。这样做您还可以直接在 Container 上构建目标 jar,并且您需要在 Container 上安装 ma​​ven

  2. 只复制目标 jar 文件并使用它来执行您需要在目标 jar 中包含测试类的测试。 (参见How can I include test classes into Maven jar and execute them?)。

无论您选择哪种方式,您都可以修改您的入口点以执行多个命令。你基本上可以通过两种方式做到这一点:

  1. (a) 创建一个执行您的命令的 bash 脚本(参见Multiple commands on docker ENTRYPOINT
  2. (b) 使用 supervisord(参见How to write a Dockerfile which I can start a service and run a shell and also accept arguments for the shell?)。这是一个更好的解决方案,可以管理与容器生命相关的进程(因此 PID 为 1 的进程)。

示例

假设您选择复制所有源文件(选项 1 )并使用 bash 脚本(选项 1(a) )来做到这一点。 如下创建 command.sh 文件,以便将容器附加到 Spring 应用程序进程,即使将执行 mvn 测试:

#!/bin/bash

#Execute Spring application
CMD="java -jar target/app.jar"
$CMD &
SERVICE_PID=$!

#Execute Tests
mvn test

#Wait for Spring execution
wait "$SERVICE_PID"

您的 Dockerfile 将如下所示:

#Start from maven docker image
FROM maven:3.6.1-jdk-8-alpine

#Copy all sources
COPY . .

#Build ( because you want to execute tests after the spring boot application is started you should disable test during build phase )
RUN mvn install

#Start container
COPY commands.sh /scripts/commands.sh
RUN ["chmod", "+x", "/scripts/commands.sh"]
ENTRYPOINT ["/scripts/commands.sh"]

【讨论】:

  • /scripts/commands.sh: line 11: wait: `': not a pid or valid job spec?
  • 当您将一个空参数传递给 wait 命令时会发生这种情况。我在编写 command.sh 脚本时遇到的问题缺少执行命令$CMD &。我要更新答案。请重试。
  • 嗨,我仍然对这个过程感到困惑。我在我的 docker 文件中寻找以下成就:mvn install、mvn test 和构建 jar 文件,我还使用这个 docker 文件将它部署在 aws elasticbean stalk 上作为我的应用程序后端服务器。我的 docker 文件应该是什么样子?谢谢
猜你喜欢
  • 2018-07-22
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2019-05-02
  • 2016-07-01
  • 2018-12-05
  • 2020-04-03
相关资源
最近更新 更多