如何通过 Gradle 测试任务在我的 JUnit 上启用调试

Posted

技术标签:

【中文标题】如何通过 Gradle 测试任务在我的 JUnit 上启用调试【英文标题】:How to enable debug on my JUnit through Gradle test task 【发布时间】:2014-05-10 17:50:43 【问题描述】:

我在尝试通过 Gradle 测试任务运行 JUnit 测试时遇到了麻烦。当我直接使用 Run As -> JUnit 测试在 eclipse 中运行测试时,一切正常,测试成功。但是通过测试任务,测试总是失败。我的资源 txt 文件的编码可能有些问题。所以我想在使用 Gradle 启动测试时启用调试

在 build.gradle 中,我的测试任务现在看起来像:

test 
    tasks.withType(Compile) 
        options.encoding = 'UTF-8'
    

那么我应该怎么做才能启用调试?我从 Eclipse 的 Gradle 面板而不是控制台运行 Gradle 任务。谢谢!

【问题讨论】:

此配置不影响test 任务但所有Compile 任务。因此它不应该嵌套在 test .. 中。 在一些测试类中(以及在普通的java类中),有一些带有变音符号的常量字符串,所以我需要使用UTF-8编码运行测试。当我使用它时,之前失败的测试现在运行正常。如果你说这不行,你能帮我解决这个问题吗(虽然我在 java 类中保留变音符号字符串)?仅在测试中使用此编码? 如果要为所有JavaCompile 任务设置编码,请使用tasks.withType(JavaCompile) options.encoding = 'UTF-8' 。如果您只想将其设置为测试编译,请使用compileTestJava options.encoding = 'UTF-8' 。 (Compile 已被弃用,现在称为JavaCompile。) 【参考方案1】:

要调试测试,应使用以下参数:--debug-jvm

例如:gradle test --debug-jvm Gradle 将在运行测试之前暂停执行,并在端口 5005 上等待调试器连接。

对于仅执行特定测试,请参阅https://docs.gradle.org/current/userguide/java_testing.html#simple_name_pattern

【讨论】:

首先,这通常称为“选项”,而不是“属性”。其次,将它添加到命令行参数对我来说是行不通的 - 有必要添加它。 这对我根本不起作用...我可以在守护程序模式下与调试器连接,但我的断点在 Eclipse 中都没有编译/触发...这个功能有点弱 @Nik,它不起作用的原因是 Eclipse 在 bin/ 文件夹中进行了自己的构建,这是它附加断点的位置。 Gradle 还构建到build/classes/,这是它运行的类文件。因此无法正常工作。 如果您在构建工具选项方面遇到困难,您可以捕获并重现流程启动并将其配置为附加调试器。 literatejava.com/engineering/how-to-debug-tests-run-externally 这在使用 org.junit.platform.gradle.plugin 时不起作用,在这种情况下应该使用该答案的第二部分:***.com/a/38210920/2873507【参考方案2】:

正如Gradle User Guide 中的23.12. Test 中所述,执行gradle test -Dtest.single=MyTestClass -Dtest.debug 将在启动时暂停测试JVM,并允许在端口5005 上连接外部调试器(例如Eclipse 调试器)。

【讨论】:

谢谢,可以直接从Eclipse中使用吗? 取决于你的意思。据我所知,Eclipse Gradle 工具确实支持自定义命令行参数,因此应该可以从 Eclipse 开始构建。然后你必须启动 Eclipse 调试器。 好的,我试试。非常感谢! 谢谢彼得。如果我无法使用端口 5005,如何禁用测试 JVM 的 fork。或者将端口号更改为 5005 以外的其他值? 使用 Gradle 4.4.1 对我来说似乎根本不起作用,似乎根本没有注意到它【参考方案3】:

将其作为--debug-jvm 放在这里对我不起作用,我可以通过设置来做到这一点:

 org.gradle.daemon=true
 org.gradle.jvmargs=... -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=10999

 ~/.gradle/gradle.properties

但是当我为项目连接 eclipse 调试器时,我没有设置任何断点编译/触发...我通过调试器连接,我可以在调试视图中看到操作,每当我从命令行,比如启动/停止新线程,但无法触发断点,现在正在尝试解决这个问题...

请停止守护进程运行gradle --stop

其他解决方案

作为参考,这适用于触发测试中的断点,我关闭了守护程序,因为我无法让它正常工作:

使用本文中的说明:http://blogs.steeplesoft.com/posts/2013/gradle-tip-attaching-a-debugger.html

test         
    if (System.getProperty('DEBUG', 'false') == 'true') 
        jvmArgs '-Xdebug',
            '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=10999'
    

通过gradle test -DDEBUG=true执行

使用JUnit Platform Gradle插件时的解决方法

上述解决方案在使用org.junit.platform.gradle.plugin时不起作用。

应该替换为:

junitPlatformTest         
    if (System.getProperty('DEBUG', 'false') == 'true') 
        jvmArgs '-Xdebug',
            '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=10999'
    

【讨论】:

因为你启用了守护进程,有两个JVM在运行。你连接错了。 2 个 jvm 监听 1 个端口?这个怎么可能?我认为我没有连接到错误的 jvm,deamon 正在注册从 eclipse 或命令行客户端对 gradle 的所有调用......就像我说的,每当我运行任何 gradle 命令时,我都在调试器中看到它“在做事”【参考方案4】:

我在 4.6 (gradle) 上,当我的 build.gradle 文件中有这个时,我可以调试我的测试:

test 
    debug true

链接 - https://docs.gradle.org/4.6/userguide/userguide_single.html#sec:java_test

【讨论】:

以上是关于如何通过 Gradle 测试任务在我的 JUnit 上启用调试的主要内容,如果未能解决你的问题,请参考以下文章

如何在Gradle中使用JUnit 5?

如何将 JUnit 5 与 Gradle 一起使用?

如何在多模块项目中使用 JUnit5 和 SpringBoot2 通过 gradle 而不是 intelliJ 运行测试

如何通过 gradle 测试任务执行测试方法?

如何使用 Gradle 运行 JUnit 测试?

调试器、@SpringBootTest 和 Gradle