【问题标题】:How to debug maven surefire tests running in a docker container?如何调试在 Docker 容器中运行的 Maven Surefire 测试?
【发布时间】:2020-05-08 16:09:32
【问题描述】:

我有一个包含集成测试的 maven 项目,我使用了 surefire 插件。我可以使用

运行测试
mvn clean package

而且效果很好。我还可以使用 intellij 远程调试集成测试。为此,我执行

mvn clean package -Dmaven.surefire.debug

在 Intellij 中,我创建了一个“远程”类型的运行/调试配置,将主机设置为 localhost,端口设置为 5005。控制台一打印

Listening for transport dt_socket at address: 5005

我在 intellij 中开始远程调试,一切正常。

问题是我想在 docker 容器内执行集成测试,尤其是在容器内调试它们。我用 java、maven 和我的应用程序需要的所有其他东西创建了一个 docker 映像。在入口点中,我启动我的应用程序,然后使用

启动集成测试
mvn clean package -Dmaven.surefire.debug

在 docker 容器内。我使用选项运行 docker 容器

-p 5005:5005

打开该端口进行远程调试。运行容器时,有时我可以看到控制台输出

Listening for transport dt_socket at address: 5005

但是当我在 intellij 中启动远程调试器时,它不会连接,而是给我以下错误消息

Error running '...':
Unable to open debugger port (localhost:5005): java.net.SocketException "Connection reset"

如果我再次尝试启动调试器,我会收到错误消息

Unable to open debugger port (localhost:5005): java.net.IOException "handshake failed - connection prematurally closed"

但是端口应该是开放的,因为正在执行

nc -zv localhost 5005

在主机(netcat)中的结果

Connection to localhost 5005 port [tcp/*] succeeded!

但如果在 docker 容器内执行相同的 netcat 命令,则会导致

localhost [...] 5005 (?) : Connection refused

谁能告诉我我做错了什么?我不坚持使用 intellij 进行调试,但是能够以某种方式调试 docker 容器内的测试会很棒。

【问题讨论】:

  • 您需要在目标主机上以调试模式启动 java - 这意味着在 docker 容器主机内。并确保可以从运行 IDE 的主机访问此主机:端口,从您启动远程调试配置。

标签: docker debugging intellij-idea integration-testing maven-surefire-plugin


【解决方案1】:

答案其实可以在这里找到:Remote debugging Java 9 in a docker container from IntelliJ IDEA

在我的情况下,这意味着运行测试

mvn clean package -Dmaven.surefire.debug="-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=*:5005"

解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2020-03-29
    • 2023-03-09
    • 2020-12-31
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多