我为IntelliJ使用SBT插件,我使用以下构建设置创建了一个scala项目:Build.scala:
lazy val root = Project("root", file(".")) .configs( IntegrationTest ) .settings( Defaults.itSettings : _*)
build.sbt:
libraryDependencies += "org.scalatest" % "scala-test_2.10" % "1.0.8" % "test,it"
现在我最终得到了src/main
,src/test
并且src/it
在我的项目结构中.我现在可以运行compile
,test
并it:test
从IntelliJ和SBT repl中的SBT控制台运行.所以在这一点上一切都很好.
我还没弄清楚的唯一问题是如何调试集成测试.我添加了一个test:compile
在启动之前运行的scalatest配置,这让我开始进行单元测试调试.我尝试为集成测试创建一个新的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)
当我查看"项目结构" - >"模块"时,我看到它src/it/scala
位于"测试源文件夹"类别下.不确定现在还能在哪里看...
更新: 我有一个sbt配置问题.我在Build.scala中使用了项目名称"root",在build.sbt中使用了其他名称.这为IntelliJ创建了两个模块配置.我解决了这个问题,现在我无法为我唯一的模块调和IntelliJ和sbt设置.
我现在看到的效果是,在我从sbt控制台运行gen-idea并重新加载项目之后,我的集成测试看起来很好一些(当sbt正在更新时).我甚至可以得到Scalatest中定义的'And'方法的定义.然而,几秒钟后,它"丢失"了对scalatest lib的引用(当sbt完成更新时).当我进入"项目结构" - >"模块"时,我什么都看不到src/it/scala
.如果我手动将它添加到测试源,IntelliJ可以再次解析scalatest.我跑完gen-idea
后就消失了.冲洗并重复.
请注意,Eugene提出的远程调试器解决方案对我不起作用.我作为服务器运行sbt并附加IntelliJ,但是当我运行it:test
它时不会在断点上停止.我认为这是因为集成测试源不被IntelliJ视为源/测试的一部分.
如果我先添加src/it/scala
项目设置,然后在运行之前尝试使用远程调试器gen-idea
,那么SBT会与OutOfMemory崩溃.所以我在这一点上完全被困......
任何想法都非常感谢.
在IntelliJ中,右键单击项目,转到Open Module Settings
,选择Paths
选项卡,然后Test output path
从更改.../target/scala-2.11/test-classes
为.../target/scala-2.11/it-classes
.这样,您可以像普通测试一样调试集成测试.
在调试正常测试之前,您必须将其更改回来.此外,再次将sbt项目导入IntelliJ会擦除该设置.