在IntelliJ IDEA中运行各个ScalaTest测试方法

时间:2014-01-25 16:30:52

标签: testing junit intellij-idea scalatest

可以在IntelliJ IDEA 12中运行单个选定的JUnit测试方法,但是ScalaTest似乎无法做到这一点。您可以运行整个测试类或什么都没有,但是在IntelliJ IDEA 12中似乎没有针对ScalaTest的更精细控制(我还没有尝试过IDEA 13。)

所以,问题是: 有没有办法在IntelliJ中只执行一个选定的ScalaTest测试方法(就像使用JUnit测试方法一样)。

下面是一个代码示例,其测试方法我想在IntelliJ中单独运行。知道怎么做吗?

我尝试过JUnitRunner,但没有帮助。

class NodeDAOTest extends FlatSpec with SessionAware with BeforeAndAfter {

  before{ IM3_SessionFactory.removeData
  println("before is running")}
  println("NodeDAOTest constructor.")
  def numberOfNodes=initAndCloseDB(transaction{NodeDAO.numberOfNodes})


  "Node" can "be added to DB and removed." in {
    val n =new TextNode
     assert(numberOfNodes===0)

    initAndCloseDB { transaction{session save n}}
     assert(numberOfNodes===1)

    initAndCloseDB { transaction{deleteNode(n)}}
     assert(numberOfNodes===0)
  }

  def getTag= initAndCloseDB {transaction{ session.createQuery("from Tag").list().get(0).asInstanceOf[Tag]}}
  def getNode=initAndCloseDB {transaction{ session.createQuery("from Node").list().get(0).asInstanceOf[Node]} }

  it can "be tagged and untagged" in {
    val t=new Tag
    val n=new TextNode

    assert(numberOfNodes==0,"before adding one tag (and Node), there should be 0 Node in the DB")

    initAndCloseDB{ transaction {addTag(t,n) }}

    assert (getNode.getNumberOfTags===1)
    assert (getTag.getNodes.size===1)

    initAndCloseDB(transaction{removeTag(t,n)})

    assert (numberOfNodes==1,"after removing the tag, there should be 1 Node in the DB")
    assert (getNode.getNumberOfTags===0)
    assert (getTag.getNodes.size===0)
  }

  "Tagged Node" can "be removed." in {
    val f=new TagAndNodeFixture
    assert(numberOfNodes==1)
    initAndCloseDB{ transaction {addTag(f.t,f.n) }}
    initAndCloseDB { transaction{deleteNode (f.n)} }
    assert(numberOfNodes==0)
    // the tag will be removed from the node
  }

  "Tag" can "be deleted and that will be removed from in-memory Nodes" in{

  }



}

6 个答案:

答案 0 :(得分:13)

我使用IntelliJ IDEA 13,当我使用FunSuite时,我可以运行单个测试 - 将光标放入测试并按 Alt + Shift + F10 ,测试就在那里。 FlatSpec测试无法实现。

最近添加了它,我记得它甚至在版本12中都没有用FunSuite

答案 1 :(得分:7)

您可以通过将光标置于测试中来生成特定flatspec测试的运行配置,然后从运行菜单中选择Run...(mac上的选项+ Shift + F10),并且靠近顶部将是参加特定测试。

您可以通过正常选择测试类来手动生成运行配置,然后将测试名称("foo" should "bar" in...中的“foo”)复制到Test Name字段

答案 2 :(得分:5)

我遇到了同样的问题。如果你在第一个单词中有空格

,它会显示出来
"test " should "..."

当我删除空间时,测试开始运行

答案 3 :(得分:2)

对上述内容的评论:说这是你的测试集:

"A calendar" should {
    "not have any availability" in {...}
}

"A calendar" when {
    "empty" should {
        "not have any availability" in {... }
    }
}

如果右键单击第二行(或第三行)(或使用其他答案中的快捷键:Alt Shift F10或Mac上的选项+ Shift + F10),IntelliJ将为您提供创建启动配置的选项“Spec .not ...“运行时会说”空测试套件“。

原因是错误地创建了“测试名称”。编辑您的启动配置以使用全名:“日历不应该......”或“空白的日历不应该......”它将起作用。似乎是从代码中解析名称应该是一个问题。

答案 4 :(得分:0)

我在某些测试套件中遇到了相同的问题,但在其他套件中却没有。即右键单击一个测试将运行整个套件,而另一些则仅运行一个测试。

我最终确定的是,在与规范相同的范围内定义方法的测试套件将不允许我运行单独的测试。将这些方法放入对象中,然后导入该对象是最简单的重构,无需更改测试即可将它们超出范围。即

class MySpec extends FlatSpec with Matchers {

  "I" should "be able to run just this test" in {
     multiply(2,3) shouldBe 6
  }

  def multiply(a: Int, b: Int): Int = a * b

}

成为

class MySpec extends FlatSpec with Matchers {

  import Helpers._
 
  "I" should "be able to run just this test" in {
     multiply(2,3) shouldBe 6
  }

  object Helpers {
    def multiply(a: Int, b: Int): Int = a * b
  }
}

一个例外是,使用behaves like进行的任何测试再次破坏了在整个套件中运行任何单个测试的能力。而且我还没有找到一种语法技巧来使它们与IntelliJ运行器一起使用。

答案 5 :(得分:0)

问题没有提到使用的构建工具。对于特定的构建工具,我遇到了这个问题:Gradle。为我解决的是点击设置(小扳手图标),然后是构建、执行、部署,然后是构建工具,然后是 Gradle。在 Gradle 项目的面板中,我选择了使用“Intellij IDEA”运行测试。在我选择之后,我可以细粒度地控制我可以运行哪些单独的测试。

在下面的 Jetbrains 帖子中讨论了使用 IDEA 与 Gradle 运行测试的优缺点,其中也有您需要选择的内容的漂亮屏幕截图:https://www.jetbrains.com/help/idea/work-with-tests-in-gradle.html#configure_gradle_test_runner

<块引用>

Gradle:IntelliJ IDEA 使用 Gradle 作为默认测试运行器。作为 结果,您在持续集成上获得相同的测试结果 (CI) 服务器。此外,在命令行中运行的测试将始终 在 IDE 中工作。

IntelliJ IDEA:选择此选项可将测试过程委托给 智能想法。在这种情况下,IntelliJ IDEA 使用 JUnit 测试运行器 由于增量编译,测试运行速度更快。