我为IntelliJ使用SBT插件,我使用以下构建设置创建了一个scala项目: Build.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/main
,src/test
和src/it
结束了。我现在可以从IntelliJ和SBT repl中的SBT控制台运行compile
,test
和it:test
。所以一切都很好。
我唯一要弄清楚的问题是如何调试集成测试。我在发布之前添加了运行test:compile
的最新配置,这让我开始进行单元测试调试。我尝试为集成测试创建一个新的Debug配置,但无法弄清楚如何将其指向src/it
以查找测试。我尝试通过将“Test kind”更改为类并指向特定的测试类来调试特定测试,但是仍然遇到以下异常:
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)
当我研究“项目结构”时 - &gt; “模块”,我看到src/it/scala
位于“测试源文件夹”类别下。不确定现在还能看到什么......
更新 我有一个sbt配置问题。我在Build.scala中使用了项目名称“root”,在build.sbt中使用了其他名称。这为IntelliJ创建了两个模块配置。我解决了这个问题,现在我无法为我唯一的模块调和IntelliJ和sbt设置。
我现在看到的效果是,在我从sbt控制台运行gen-idea并重新加载项目之后,我的集成测试看起来很好一些(当sbt正在更新时)。我甚至可以得到Scalatest中定义的'And'方法的定义。然而,几秒钟后,它“丢失”了对scalatest lib的引用(当sbt完成更新时)。当我进入“项目结构” - &gt; “模块”,我在任何地方都看不到src/it/scala
。如果我手动将它添加到测试源,IntelliJ可以再次解析scalatest。运行gen-idea
后,它消失了。冲洗并重复。
请注意,Eugene提出的远程调试解决方案对我不起作用。我将sbt作为服务器运行并附加IntelliJ,但是当我运行it:test
时,它不会在断点上停止。我认为这是因为集成测试源不被IntelliJ认为是源/测试的一部分。
如果我先在项目设置中添加src/it/scala
,然后在运行gen-idea
之前尝试使用远程调试器,则SBT会与OutOfMemory崩溃。所以我在这一点上完全被困......
任何想法都受到高度赞赏。
答案 0 :(得分:7)
在IntelliJ中,右键单击项目,转到Open Module Settings
,选择Paths
标签,然后将Test output path
从.../target/scala-2.11/test-classes
更改为.../target/scala-2.11/it-classes
。这样,您可以像正常测试一样调试集成测试。
在调试正常测试之前,您必须将其更改回来。此外,再次将sbt项目导入IntelliJ会擦除设置。
答案 1 :(得分:3)
我是如何调试SBT项目的:
添加到〜/ .sbtconfig
SBT_OPTS =&#34; -agentlib:JDWP =运输= dt_socket,服务器= Y,暂停= n时,地址= 5005&#34;
将Intellij Idea附加到使用远程调试配置运行sbt进程:http://www.jetbrains.com/idea/webhelp/run-debug-configuration-remote.html
利润!在项目代码中添加断点。
请注意,在此配置中,Idea将附加到SBT JVM,而不仅仅是项目文件,因此您也可以调试构建文件。
如果你使用&#34; fork in Test:= true&#34;选项我想可以通过jvm args配置选项传递此配置,但正如我从项目定义中看到的那样,你不要分叉你的测试。