【问题标题】:Remotely debug unit tests in Netbeans / Maven在 Netbeans / Maven 中远程调试单元测试
【发布时间】:2016-09-27 11:53:34
【问题描述】:

我想使用 Netbeans 在 Maven 项目中的远程机器上自动启动和调试单元测试。所有 IDE 功能都应该可以工作,例如调试、输出窗口等。只需单击“以调试为中心的测试方法”,该过程必须完全自动化。

【问题讨论】:

  • 为什么在远程机器上?单元测试可以在 IDE 中运行,当然也可以调试?
  • @khmarbaise 可能有一百万个原因。对我来说,这是因为我使用 JUnit “测试”来执行实际工作(几乎就像一个 ipython 笔记本),我希望它们在我的大盒子上运行。

标签: java maven unit-testing netbeans


【解决方案1】:

解决方案是将mvn 命令替换为自定义脚本,该脚本将执行rsyncssh。通过这两种工具的魔力,它真的运行良好。此外,它应该可以移植到其他 Maven IDE。当前指南适用于bash,但同样的想法可以在Windows 中使用powershellgroovy 甚至cmd 实现。 (我尝试使用 Nashorn,但在正确保留所有参数的同时执行其他命令的方式似乎被破坏了。)

  • 在 Netbeans 目录 /usr/local/netbeans-8.1/java/maven/bin/ 中,重命名 mvn 脚本:
    • cd /usr/local/netbeans-8.1/java/maven/bin/
    • sudo mv mvn mvn.orig
  • 创建新的mvn 脚本。

    #!/bin/bash
    
    if [ -z "$REMOTE" ] ; then 
        SCRIPTDIR=$(dirname "$0")
        "$SCRIPTDIR/mvn.orig" "$@"
    else
        if [ -z "$REMOTE_BASE_DIR" ] ; then
            echo "ERROR: Please set environment variable REMOTE_BASE_DIR to the folder which contains the project directory"
            exit
        fi
    
        PROJECT_DIR=$(basename "$(pwd)")
        REMOTE_PROJECT_DIR=$REMOTE_BASE_DIR/$PROJECT_DIR/
        ARGS=
        for var in "$@"
        do
         ARGS="$ARGS \\\"$var\\\""
        done
    
        echo "Syncing project directory..."
        (set -x; rsync -aczhW --progress --delete --exclude '.git' --exclude 'target' $RSYNC_OPTS ./ "$REMOTE:\"$REMOTE_PROJECT_DIR\"")
    
        echo "Executing maven..."
        if [ "$REMOTE_PORT" = '${jpda.address}' ] ; then
            (set -x; ssh ${REMOTE} "cd \"$REMOTE_PROJECT_DIR\"; mvn $ARGS")
        else
            (set -x; ssh -R $REMOTE_PORT:localhost:$REMOTE_PORT ${REMOTE} "cd \"$REMOTE_PROJECT_DIR\"; mvn $ARGS")
        fi
    fi
    
  • 配置远程机器:
    • 要么安装mvn,要么安装Netbeans 并将其mvn 放在路径上。我选择了后者,但应该都可以。
    • 配置 ssh。我不会在这里描述如何做到这一点。确保在/etc/ssh/sshd_config 中将AllowTcpForwarding 设置为yesremote
  • 创建新的 Netbeans 配置,将所有 maven 操作(包括清理和构建)转发到远程机器:

    • 进入项目的属性
    • 创建新配置
    • 在“设置属性”中添加:

      Env.REMOTE_BASE_DIR=<directory on the server that will contain your project directory>
      Env.REMOTE=<address of remote machine>
      Env.REMOTE_PORT=${jpda.address}
      Env.RSYNC_OPTS=<optional, but could be another --exclude>
      

    • 要使用,请在工具栏的下拉菜单中选择新配置,然后像往常一样调用任何 maven 目标。

    • 我仍在寻找一种全局设置此配置的方法。如果你知道怎么做,请告诉我!
  • 或者,创建一个具有相同属性集的自定义操作。
  • 我应该提到调试体验非常好,这要归功于 JVM 中内置的远程调试功能、Maven 的版本/依赖关系跟踪以及 Netbeans 中出色的 Maven 集成。我真的很喜欢你能够轻松地进入其他项目的代码(并且它可以解析特定版本)。

【讨论】:

  • 有人知道为什么我的屏幕截图没有显示吗?
【解决方案2】:

Surefire/Failsafe 插件支持开箱即用的远程调试:http://maven.apache.org/surefire/maven-surefire-plugin/examples/debugging.html

【讨论】:

  • 当我需要在 IntelliJ IDEA 中调试集成测试并且需要 Maven 执行所有预集成测试步骤时,我曾多次使用它。
  • 问题是如何自动化这个过程。
  • 在 IntelliJ IDEA 中,这可以通过首先执行某个其他运行配置的运行配置来完成。如果 NetBeans 支持类似的功能,您可以在任何地方添加断点,然后运行以下配置: 1) 使用 -Dmaven.surefire.debug 运行 maven build; 2)连接远程调试器。你说的是哪种自动化?右键单击测试并仅运行该测试?
  • 你没有帮助。
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多