【问题标题】:Debug scala sbt integration tests in IntelliJ在 IntelliJ 中调试 scala sbt 集成测试
【发布时间】:2014-06-16 04:10:10
【问题描述】:

我为 IntelliJ 使用 SBT 插件,并创建了一个具有以下构建设置的 scala 项目: 构建.scala:

lazy val root =
    Project("root", file("."))
      .configs( IntegrationTest )
      .settings( Defaults.itSettings : _*)

build.sbt:

<setting some parameters>
libraryDependencies += "org.scalatest" % "scala-test_2.10" % "1.0.8" % "test,it"

现在我的项目结构中包含src/mainsrc/testsrc/it。我现在可以在 IntelliJ 和 SBT repl 中从 SBT 控制台运行 compiletestit:test。所以现在一切都很好。

我还没有弄清楚的唯一问题是如何调试集成测试。我添加了一个在启动前运行 test:compile 的 scalatest 配置,这让我可以进行单元测试调试。我尝试为集成测试创建一个新的 Debug 配置,但不知道如何将其指向 src/it 以查找测试。我尝试通过将“测试类型”更改为类并指向特定测试类来调试特定测试,但不断收到以下异常:

Unable to load a Suite class. This could be due to an error in your runpath. Missing class: it.AddPersonSpec
java.lang.ClassNotFoundException: it.AddPersonSpec
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at org.scalatest.tools.Runner$$anonfun$22.apply(Runner.scala:1962)
    at org.scalatest.tools.Runner$$anonfun$22.apply(Runner.scala:1960)
    at scala.collection.TraversableLike$$anonfun$filter$1.apply(TraversableLike.scala:264)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.TraversableLike$class.filter(TraversableLike.scala:263)
    at scala.collection.AbstractTraversable.filter(Traversable.scala:105)
    at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1960)
    at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:850)
    at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:849)
    at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:2221)
    at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:848)
    at org.scalatest.tools.Runner$.run(Runner.scala:706)
    at org.scalatest.tools.Runner.run(Runner.scala)
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:144)
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:35)

当我查看“项目结构”->“模块”时,我看到 src/it/scala 在“测试源文件夹”类别下。不知道现在还能去哪里看...

更新: 我有一个 sbt 配置问题。我在 Build.scala 中使用了项目名称“root”,在 build.sbt 中使用了其他名称。这为 IntelliJ 创建了两个模块配置。我修复了这个问题,现在我无法为我唯一的模块协调 IntelliJ 和 sbt 设置。

我现在看到的效果是,在我从 sbt 控制台运行 gen-idea 并重新加载项目后,我的集成测试在一段时间内看起来还不错(同时 sbt 正在更新)。我什至可以定义 Scalatest 中定义的“和”方法。然而,几秒钟后,它“失去”对 scalatest lib 的引用(当 sbt 完成更新时)。当我转到“项目结构”->“模块”时,我在任何地方都看不到 src/it/scala。如果我手动添加它来测试源 IntelliJ 可以再次解析 scalatest。在我运行gen-idea 后它消失了。冲洗并重复。

请注意,Eugene 提出的远程调试器解决方案对我不起作用。我将 sbt 作为服务器运行并附加 IntelliJ,但是当我运行 it:test 时,它不会在断点处停止。我认为这是因为集成测试源不被 IntelliJ 视为源/测试的一部分。

如果我首先在项目设置中添加src/it/scala,然后在运行gen-idea 之前尝试使用远程调试器,则 SBT 会因内存不足而崩溃。所以在这一点上我完全被难住了......

非常感谢任何想法。

【问题讨论】:

  • 还是找不到答案?

标签: scala unit-testing intellij-idea sbt


【解决方案1】:

在 IntelliJ 中,右键单击项目,转到 Open Module Settings,选择 Paths 选项卡,然后将 Test output path.../target/scala-2.11/test-classes 更改为 .../target/scala-2.11/it-classes。这样,您就可以像正常测试一样调试集成测试。

您必须在调试正常测试之前将其改回。此外,再次将 sbt 项目导入 IntelliJ 会擦除设置。

【讨论】:

  • 你能更精确一点吗?这个解决方案并没有真正奏效。
【解决方案2】:

这就是我调试 SBT 项目的方式:

  1. 添加到 ~/.sbtconfig

    SBT_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

  2. 使用远程调试配置将 Intellij Idea 附加到正在运行的 sbt 进程:http://www.jetbrains.com/idea/webhelp/run-debug-configuration-remote.html

  3. 利润!在项目代码中添加断点。

请注意,在此配置中,Idea 将附加到 SBT JVM,而不仅仅是您的项目文件,因此您也可以调试您的构建文件。

如果您使用“fork in Test := true”选项,我想可以使用 jvm args 配置选项传递此配置,但正如我从您的项目定义中看到的那样,您不会分叉您的测试。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2014-06-14
    • 2014-03-29
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多